先说一下大概的思路:
应用多线程来实现服务器与多客户端之间的通信
1、服务器端创建ServerSocket,循环调用accept()等待客户端连接;
2、客户端创建一个Socket并请求与服务器端连接;
3、服务器端接受客户端请求,创建Socket与该客户端简历专线连接;
4、建立连接的两个Socket在一个单独的线程上对话;
5、服务器端继续等待其他新的连接。
闲话不多说,直接上代码:
package net;
/*** 1、客户端*/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.net.UnknownHostException;public class Client {public static void main(String[] args) {try {//1、创建Socket,与服务器建立连接Socket socket = new Socket("localhost", 8889); //2、向服务器端发送消息OutputStream os = socket.getOutputStream(); PrintWriter pwriter = new PrintWriter(os); //将Socket的输出字节流包装成打印流pwriter.write("用户名:sysker ; 密码:sys154");//刷新流pwriter.flush();//3、关闭资源socket.shutdownOutput();//3、获取输入流InputStream inputStream = socket.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String getMsage=null;while((getMsage=bufferedReader.readLine())!=null){System.out.println("客户端正在等待响应,服务器说:"+getMsage);} //socket.shutdownInput();bufferedReader.close();inputStream.close();inputStreamReader.close();pwriter.close();os.close(); socket.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
package net;
/*** 2、服务器端*/import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class ManyClientServer {public static void main(String[] args) {Socket socket = null;int clientCount = 0;try {ServerSocket serverSocket = new ServerSocket(8889);while(true){socket = serverSocket.accept();ManyClientThread manyClientThread = new ManyClientThread(socket);manyClientThread.start();clientCount++;System.out.println("客户端数量"+clientCount);System.out.println("客户端的IP地址:"+socket.getInetAddress().getHostAddress());} } catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
package net;
/*** 3、服务器通信线程*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;public class ManyClientThread extends Thread{Socket socket = null;BufferedReader bufferedReader = null;public ManyClientThread(Socket socket){this.socket = socket;}public void run(){try { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String mString = null;while((mString = bufferedReader.readLine())!=null){System.out.println("我是服务器,客户端说"+mString); }bufferedReader.close();socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{if(bufferedReader!=null){try {bufferedReader.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(socket!=null){try {socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
}