转载请注明:
问题:一个服务端可以跟多个客户端通讯
基本步骤:
1.服务器端创建ServerSocket方法,循环调用accept()方法等待客户端连接
2.客户端创建socket和服务的请求连接
3.服务端接受客户端的请求,建立专线连接
4.建立连接的两个socket在一个单独的线程上对话
5.服务器端继续等待新的连接
创建一个服务器相关的线程类:
package com.test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;/* * 服务器线程处理类 */public class ServerThread extends Thread {// 和本线程相关的SocketSocket socket = null;public ServerThread(Socket socket) {this.socket = socket;}//线程执行的操作,响应客户端的请求public void run(){InputStream is=null;InputStreamReader isr=null;BufferedReader br=null;OutputStream os=null;PrintWriter pw=null;try {//获取输入流,并读取客户端信息is = socket.getInputStream();isr = new InputStreamReader(is);br = new BufferedReader(isr);String info=null;while((info=br.readLine())!=null){//循环读取客户端的信息System.out.println("我是服务器,客户端说:"+info);}socket.shutdownInput();//关闭输入流//获取输出流,响应客户端的请求os = socket.getOutputStream();pw = new PrintWriter(os);pw.write("欢迎您!");pw.flush();//调用flush()方法将缓冲输出} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{//关闭资源try {if(pw!=null)pw.close();if(os!=null)os.close();if(br!=null)br.close();if(isr!=null)isr.close();if(is!=null)is.close();if(socket!=null)socket.close();} catch (IOException e) {e.printStackTrace();}}}}
2.server服务器端
package com.test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;/* * 基于TCP协议的Socket通信,实现用户登陆 * 服务器端 */public class server {public static void main(String[] args) {try {//1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,,并监听此端口ServerSocket serverSocket=new ServerSocket(8888);Socket socket=null;//记录客户端的数量int count=0;System.out.println("***服务器即将启动,等待客户端的连接***");//循环监听等待客户端的连接while(true){//调用accept()方法开始监听,等待客户端的连接socket=serverSocket.accept();//创建一个新的线程ServerThread serverThread=new ServerThread(socket);//启动线程serverThread.start();count++;//统计客户端的数量System.out.println("客户端的数量:"+count);InetAddress address=socket.getInetAddress();System.out.println("当前客户端的IP:"+address.getHostAddress());}} catch (IOException e) {e.printStackTrace();}}}
3.client客户端
package com.test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;import java.util.logging.Level;import java.util.logging.Logger;/** * * @author wonderq */public class client {//客户端public static void main(String[] args) {try {//1.创建客户端Socket,指定服务器地址和端口号Socket socket=new Socket("127.0.0.1", 8888);//2.获取输出流,用来向服务器发送信息OutputStream os=socket.getOutputStream();//字节输出流//转换为打印流PrintWriter pw=new PrintWriter(os);pw.write("用户名:wonderq;密码:root");pw.flush();//刷新缓存,向服务器端输出信息//关闭输出流socket.shutdownOutput();//3.获取输入流,用来读取服务器端的响应信息InputStream is=socket.getInputStream();BufferedReader br=new BufferedReader(new InputStreamReader(is));String info=null;while((info=br.readLine())!=null){System.out.println("我是客户端,服务器端返回的信息是:"+info);}//4.关闭资源br.close();is.close();pw.close();os.close();socket.close();} catch (IOException ex) {Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);}}}
先运行服务器端输出:
***服务器即将启动,等待客户端的连接***
之后再运行客户端:
再查看服务端:
更改客户端的输出信息,pw.write("用户名:user;密码:admin");
然后再启动一个客户端。启动后客户端输出信息不变,服务端信息变化如下:
可以说明服务器端在一直循环监听新的客户端的连接。
因为都是本机,所有ip都是127.0.0.1如果在真是情况下,那么会大不一样。
版权声明:本文为博主原创文章,未经博主允许不得转载。
要愈合不能,要忘却不能,要再次拥抱,却鼓不起足够的勇气,