网络通信基础总结2——一个简单的可以实现群聊的多线程服务器
//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;}}
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界面下启动客户端吗?如何能有一个稳定的有界面的客户端呢?下一篇日记我将给出答案~