java实现小型局域网群聊功能(C/S模式)
本文实例为大家分享了java群聊功能,供大家参考,具体内容如下
Java对TCP协议的支持:
-->java.net包中定义了两个类ServerSocket和Socket,分别用来实现双向连接的server端和client端。
-->Client类定义客户端
packagecom.dragon.java.tcpchat; importjava.io.IOException; importjava.net.Socket; importjava.net.UnknownHostException; /** *客户端 * *@authorAuser * */ publicclassClient{ publicstaticvoidmain(Stringargs[])throwsUnknownHostException, IOException{ Socketclient=newSocket("192.168.1.188",10000); //穿件发送信息的线程 newClientSend(client).start(); //创建接收信息的线程 newClientReceive(client).start(); //因为要实现聊天功能,而不是只发送一次信息,所以输出流和客户端都不能关闭。 //client.shutdownOutput(); //client.close(); } }
-->ClientSend类定义客户端向服务端发送信息的线程
packagecom.dragon.java.tcpchat; importjava.io.IOException; importjava.io.PrintStream; importjava.net.Socket; importjava.util.Scanner; /** *客户端向服务端发送信息的线程 * *@authorAuser * */ publicclassClientSendextendsThread{ privateScannerscanner; privateSocketsocket; publicClientSend(Socketsocket){ this.socket=socket; } @Override publicvoidrun(){ scanner=newScanner(System.in); try{ PrintStreamps=newPrintStream(socket.getOutputStream()); Stringline=""; //阻塞式发送信息 while((line=scanner.nextLine())!=null){ ps.println(line); } }catch(IOExceptione){ e.printStackTrace(); } } }
-->ClientReceive类定义客户端接收服务端信息的线程
packagecom.dragon.java.tcpchat; importjava.io.BufferedReader; importjava.io.InputStreamReader; importjava.net.Socket; /** *客户端接收信息的线程 * *@authorAuser * */ publicclassClientReceiveextendsThread{ privateSocketsocket; publicClientReceive(Socketsocket){ this.socket=socket; } @Override publicvoidrun(){ try{ BufferedReaderbr=newBufferedReader(newInputStreamReader( socket.getInputStream())); //按行接收信息 Stringline=""; while((line=br.readLine())!=null){ System.out.println(line); } }catch(Exceptione){ e.printStackTrace(); } } }
-->Server类定义服务端
packagecom.dragon.java.tcpchat; importjava.io.IOException; importjava.net.ServerSocket; importjava.net.Socket; importjava.util.ArrayList; importjava.util.List; /** *服务器 * *@authorAuser * */ publicclassServer{ publicstaticvoidmain(String[]args)throwsIOException, InterruptedException{ List<Socket>list=newArrayList<>(); //创建服务器端的套接字 ServerSocketserver=newServerSocket(10000); while(true){ //接收客户端的阻塞方法 Socketsocket=server.accept(); //设计到多个线程可能会对集合进行增删的操作,要进行同步的处理 synchronized(list){ list.add(socket); } //启动一个新的线程去处理这个客户端的交流 newHandleSocket(socket,list).start(); } //因为不知道客户端什么时候发送信息,所以服务端要一直开启不能关闭。 } }
-->HandleSocket类对连接到服务端的客户端进行操作(上下线通知、屏蔽拉黑、将信息发送到每个客户端等...)
packagecom.dragon.java.tcpchat; importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStreamReader; importjava.io.PrintStream; importjava.net.InetAddress; importjava.net.Socket; importjava.util.List; /** *处理每个(单个)连接到服务器的客户端的线程 * *@authorAuser * */ publicclassHandleSocketextendsThread{ privateSocketsocket; privateList<Socket>list; /** *构造方法 * *@paramsocket *当前连接的客户端 *@paramlist *存储已连接客户端的集合 */ publicHandleSocket(Socketsocket,List<Socket>list){ this.socket=socket; this.list=list; } /** *线程run方法 */ @Override publicvoidrun(){ InetAddressaddress=socket.getInetAddress();//获取连接到服务器的这的客户端的地址 Stringip=address.getHostAddress(); System.out.println(ip+"上线了!"); if(ip.equals("192.168.1.117")){ synchronized(list){ sendToAll(ip+"由于违规操作,已被拉入黑名单!"); list.remove(socket); } return; } try{ BufferedReaderbr=newBufferedReader(newInputStreamReader( socket.getInputStream(),"gbk")); Stringline=""; while((line=br.readLine())!=null){ Stringmsg=ip+":"+line; System.out.println(msg);//输出到服务器端的控制台 //把这个客户端说的话,发给其他所有的客户端 sendToAll(msg); } }catch(IOExceptione){ //e.printStackTrace(); System.out.println(ip+"下线了!"); synchronized(list){ list.remove(socket); } } } /** *把信息发送给所有的客户端,去除当前socket * *@parammsg *发送的信息 */ privatevoidsendToAll(Stringmsg){ synchronized(list){ for(Sockets:list){ if(s!=socket){ try{ PrintStreamps=newPrintStream(s.getOutputStream()); ps.println(); }catch(IOExceptione){ e.printStackTrace(); } } } } } }
-->注意:因为要实现客户端连接到服务端,即客户端要先找到服务端,所以服务端要先开启,再开启服务端...
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。