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();
}
}
}
}
}
}
-->注意:因为要实现客户端连接到服务端,即客户端要先找到服务端,所以服务端要先开启,再开启服务端...
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。