java基于C/S结构实现多线程聊天室
本文实例为大家分享了java基于C/S结构实现多线程聊天室的具体代码,供大家参考,具体内容如下
主要实现的功能:
服务器端建立ServerSocket阻塞监听来自客户端的Socket连接,并为之开辟一个新的线程
读取来自该连接的数据,广播每一个客户端数据,这里简单地使用一个链表保存所有来自客户端的所有Socket连接
客户端连接上服务器端后主要有两个线程在工作:
主线程:不断获取键盘的输入并写入该Socket中传输给服务器
副线程:不断从服务器Socket流中读取传来的数据,打印到屏幕上。
服务器端代码:
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.PrintStream;
importjava.net.Socket;
importjava.net.ServerSocket;
importjava.util.ArrayList;
importjavax.swing.JOptionPane;
publicclassMyServer{
publicstaticArrayListsocketlist=newArrayList();
privatestaticStringport;
publicstaticvoidmain(String[]args)throwsIOException
{
//弹出一个对话框输入端口号
port=JOptionPane.showInputDialog("inputtheportnumber:");
intServerPort=newInteger(port).intValue();
ServerSocketss=newServerSocket(ServerPort);
System.out.println("Serverisinitializating...");
while(true)
{
System.out.println("Serveriswaiting...");
//此处将阻塞监听
Sockets=ss.accept();
System.out.println("listeningfrom:"+s.getInetAddress());
socketlist.add(s);
newThread(newServerThread(s)).start();
}
}
}
classServerThreadimplementsRunnable
{
Sockets=null;
BufferedReaderbr=null;
publicServerThread(Sockets)throwsIOException
{
this.s=s;
br=newBufferedReader(newInputStreamReader(s.getInputStream()));
}
publicvoidrun()
{
try
{
Stringcontent=null;
while((content=readFromClient())!=null)
{
//播报每个客户端数据
for(Sockets:MyServer.socketlist)
{
PrintStreamps=newPrintStream(s.getOutputStream());
ps.println(content);
}
}
}
catch(IOExceptionio)
{
io.printStackTrace();
}
}
privateStringreadFromClient()
{
try
{
returnbr.readLine();
}
catch(IOExceptionio)
{
MyServer.socketlist.remove(s);
System.out.println(s.getInetAddress()+"isdisconnecting...");
}
returnnull;
}
}
客户端代码:
importjava.net.Socket;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.PrintStream;
publicclassMyClient{
publicstaticvoidmain(String[]args)throwsException
{
Sockets=newSocket("192.168.1.164",30000);
//newThreadtoreadcontentfromserver.
newThread(newClientThread(s)).start();
PrintStreamps=newPrintStream(s.getOutputStream());
Stringline=null;
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
while((line=br.readLine())!=null)
{
ps.println(line);
}
}
}
classClientThreadimplementsRunnable
{
privateSockets=null;
BufferedReaderbr=null;
publicClientThread(Sockets)throwsIOException
{
this.s=s;
br=newBufferedReader(newInputStreamReader(s.getInputStream()));
}
publicvoidrun()
{
try
{
Stringcontent=null;
while((content=br.readLine())!=null)
{
System.out.println(content);
}
}
catch(IOExceptionio)
{
io.printStackTrace();
}
}
}
后期开发:
上面程序功能很简单,没有记录客户信息,考虑添加功能如下:(多人聊天室)
客户端发来的信息必须添加特殊标识,用于区别登陆,私聊,公聊三种,如果是登陆,则服务器端应该有一个Map来保存用户名和对应输出流中间的关系,用来处理用户名重复的情况,还有如果是私聊,必须知道从客户端发来消息的用户名和将要发给哪一个用户的特殊标识,考虑在输入字符串里加入特殊标识符。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。