网络通信基础小结2——一个简单的可以实现群聊的多线程服务器
网络通信基础总结2——一个简单的可以实现群聊的多线程服务器
在看完我的上一篇总结以后,大家可能会有一个问题,上述的那个服务器只能连接一个客户端,难道只能进行一对一得服务器和客户端的聊天吗?怎么才能实现两个客户端之间也能聊天?别着急,这一篇总结中我将会给出答案!
首先得确保你的服务器是一个相对稳定的服务器,即可以循环等待客户端的连接的,这在上一篇博客中已经解决了这个问题,就是在服务器调用accept()方法的时候让服务器进入一个while循环当中,这样当这个客户端断开连接后,只要服务器不关闭还可以再次连接,同时别的客户端也可以连接到你的服务器。就是这样的一个简单的循环条件就解决啦~
接下来要做的就是把上一篇中处理与客户端通信的方法processClient写到一个线程类中去,每登陆上一个客户端,就把它作为一个独立的线程对象来处理,这样一个可以实现群聊,多客户的服务器就建好啦
//2.当有客户机连接上来时,等待的方法就会返回一个代表客户机连接的对象
while(true)
{ java.net.Socket client=server.accept();
最后我把整合的代码发表如下,首先是一个线程类,支持多线程客户:
public class ServerThread extends Thread{ private java.io.OutputStream ous; //private java.io.InputStream ins; private java.net.Socket client;//线程类要处理的连接对象 public ServerThread(java.net.Socket sc){ this.client=sc; } //发送消息的方法 public void sendMsg2Me(String msg) throws IOException{ byte[] data=msg.getBytes(); ous.write(data); ous.flush(); } public void run(){ //在线程run中调用处理连结的方法 processClient(this.client); //处理方法执行完毕后,线程自己即退出... } public void processClient(java.net.Socket client) { try{ InputStream ins=client.getInputStream(); ous=client.getOutputStream(); String s="欢迎你!\r\n"; this.sendMsg2Me(s); String inputS=readString(ins);//读取客户机发来的 while(!inputS.equals("bye")){ s="我收到了你的话啦 "+inputS+"\r\n"; this.sendMsg2Me(s); //将这个字符串发送给客户机对象 inputS=readString(ins);//再次读取 } s="你好,欢迎再来!\r\n"; this.sendMsg2Me(s); client.close(); }catch(Exception e){ e.printStackTrace(); } } public String readString(java.io.InputStream ins) throws IOException{ //创建一个字符串缓冲区 StringBuffer stb = new StringBuffer(); int i=ins.read(); while(i!=13){ stb.append((char)i); i=ins.read(); System.out.println("读到的字节是:"+i); if(i==-1){ client.close(); System.out.println(">>>>>"); } } String input = stb.toString().trim(); return input; } }
然后就是一个服务器循环等待客户连接进入的ChatServer类,同时也在这个类中启动线程,具体代码如下:
public class ChatServer { private ServerThread th; public void setUpServer(int port){ try{ //1.建立绑定在指定端口上的服务器对象 java.net.ServerSocket server=new java.net.ServerSocket(port); System.out.println("服务器创建成功!"+port); //2.当有客户机连接上来时,等待的方法就会返回一个代表客户机连接的对象 while(true){ java.net.Socket client=server.accept(); System.out.println("连接进的客户端的IP地址是:"+client.getRemoteSocketAddress()); //调用处理对象的方法去处理对象 th=new ServerThread(client); th.start(); } }catch(Exception ef){ ef.printStackTrace(); } } public static void main(String args[]){ ChatServer cs = new ChatServer(); cs.setUpServer(9090); } }
如此一来,一个支持多客户群聊的服务器就建好啦,当然这里还有很多缺陷需要改进。还有一个更重要的问题,难道我们永远得在DOS界面下启动客户端吗?如何能有一个稳定的有界面的客户端呢?下一篇日记我将给出答案~