Java 多客户端通信在很多人看来是一项很繁琐的工作,其实我们在编写代码的时候只要是注意留心Java 多客户端通信的源代码就能发现,我们认为枯燥的东西其实都很简单。
来看服务端的代码:
- import java.net.*;
- import java.io.*;
- import java.util.*;
- public class Jserver3 {
- private ServerSocket server;
- List sManager = new ArrayList();
- public Jserver3(){}
- void startServer() //运行服务器
- {
- try
- {
- server=new ServerSocket(719);
- System.out.println("服务器套接字已创建成功!");
- while(true)
- {
- Socket socket=server.accept();
- System.out.println("已经与客户端连接");
- new J_Thread(socket).start();
- sManager.add(socket);
- System.out.println("当前客户端连结数:"+sManager.size());
- }
- }catch(Exception e){}finally
- {
- try
- {
- server.close();
- }catch(Exception e){}
- }
- }
- public static void main(String[] args) {
- Jserver3 server=new Jserver3();
- server.startServer();
- }
- class J_Thread extends Thread //与客户端进行通信的线程类
- {
- Socket socket; //套接字引用变量
- private DataInputStream reader; //套接字输入流
- private DataOutputStream writer; //套接字输出流
- J_Thread(Socket socket) //构造函数
- {
- this.socket=socket;
- }
- public void run()
- {
- try
- {
- reader=new DataInputStream(socket.getInputStream());//获取套接字的输入流
- writer=new DataOutputStream(socket.getOutputStream());//获取套接字的输出流
- String msg;
- while((msg=reader.readUTF())!=null)//如果收到客户端发来的数据
- {
- //向客户端发送信息
- writer.writeUTF("您的情书已经收到");
- writer.flush();
- System.out.println("来自客户端:"+msg);
- }
- }catch(Exception e){}finally
- {
- try
- {
- sManager.remove(socket); //删除套接字
- //关闭输入输出流及套接字
- if(reader!=null)reader.close();
- if(writer!=null)writer.close();
- if(socket!=null)socket.close();
- reader=null;
- writer=null;
- socket=null;
- System.out.println("客户端离开");//向屏幕输出相关信息
- System.out.println("当前客户端的连接数:"+sManager.size());
- }catch(Exception e){}
- }
- }
- }
- }
- import java.net.*;
- import java.io.*;
- import java.util.*;
- public class Jserver3 {
- private ServerSocket server;
- List sManager = new ArrayList();
- public Jserver3(){}
- void startServer() //运行服务器
- {
- try
- {
- server=new ServerSocket(719);
- System.out.println("服务器套接字已创建成功!");
- while(true)
- {
- Socket socket=server.accept();
- System.out.println("已经与客户端连接");
- new J_Thread(socket).start();
- sManager.add(socket);
- System.out.println("当前客户端连结数:"+sManager.size());
- }
- }catch(Exception e){}finally
- {
- try
- {
- server.close();
- }catch(Exception e){}
- }
- }
- public static void main(String[] args) {
- Jserver3 server=new Jserver3();
- server.startServer();
- }
- class J_Thread extends Thread //与客户端进行通信的线程类
- {
- Socket socket; //套接字引用变量
- private DataInputStream reader; //套接字输入流
- private DataOutputStream writer; //套接字输出流
- J_Thread(Socket socket) //构造函数
- {
- this.socket=socket;
- }
- public void run()
- {
- try
- {
- reader=new DataInputStream(socket.getInputStream());//获取套接字的输入流
- writer=new DataOutputStream(socket.getOutputStream());//获取套接字的输出流
- String msg;
- while((msg=reader.readUTF())!=null)//如果收到客户端发来的数据
- {
- //向客户端发送信息
- writer.writeUTF("您的情书已经收到");
- writer.flush();
- System.out.println("来自客户端:"+msg);
- }
- }catch(Exception e){}finally
- {
- try
- {
- sManager.remove(socket); //删除套接字
- //关闭输入输出流及套接字
- if(reader!=null)reader.close();
- if(writer!=null)writer.close();
- if(socket!=null)socket.close();
- reader=null;
- writer=null;
- socket=null;
- System.out.println("客户端离开");//向屏幕输出相关信息
- System.out.println("当前客户端的连接数:"+sManager.size());
- }catch(Exception e){}
- }
- }
- }
- }
嘎嘎 在这段代码里,服务端MM为每一个连接的客户端GG分配一个单独的线程,而每一个线程里都持有对应的客户端GG的Java 多客户端通信对象。SO,通过这些多线程,服务端MM就练就了一心N用的功力,可以同时接受N个客户端GG发来的情书了(,真的太贱了。。。。)
客户端的代码和上面的客户端代码一模一样的,这里就不多说啦!
【编辑推荐】