在看完我的上一篇总结以后,大家可能会有一个问题,上述的那个服务器只能连接一个客户端,难道只能进行一对一得服务器和客户端的聊天吗?怎么才能实现两个客户端之间也能聊天?别着急,这一篇总结中我将会给出答案!
首先得确保你的服务器是一个相对稳定的服务器,即可以循环等待客户端的连接的,这在上一篇博客中已经解决了这个问题,就是在服务器调用accept()方法的时候让服务器进入一个while循环当中,这样当这个客户端断开连接后,只要服务器不关闭还可以再次连接,同时别的客户端也可以连接到你的服务器。就是这样的一个简单的循环条件就解决啦~
//2.当有客户机连接上来时,等待的方法就会返回一个代表客户机连接的对象
while(true)
{ java.net.Socket client=server.accept();
接下来要做的就是把上一篇中处理与客户端通信的方法processClient写到一个线程类中去,每登陆上一个客户端,就把它作为一个独立的线程对象来处理,这样一个可以实现群聊,多客户的服务器就建好啦
最后我把整合的代码发表如下,首先是一个线程类,支持多线程客户:
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界面下启动客户端吗?如何能有一个稳定的有界面的客户端呢?下一篇日记我将给出答案~
分享到:
相关推荐
运用多线程和socket实现群聊的功能,分为客户端和服务端
LINUX下基于socket和多线程的聊天程序设计与实现的群聊客户端关键代码
jsp网络聊天系统——群聊系统,一个完整的工程,导入即可使用,一个不错的框架!
局域网即使通信,采用多线程实现,可实现群聊,和单聊。
多线程 群聊功能 网络编程 套接字 socket 实现群聊功能
安卓Andriod源码——HorizontalListView仿微信发起群聊.zip
安卓Android源码——HorizontalListView仿微信发起群聊.zip
基于Qt的C++项目,实现了网盘的基础功能,包括注册登录、好友系统、私聊群聊、文件操作、分享文件等功能,实现了网络通信、多线程等。 QT,C++使用技巧,实战应用开发小系统参考资料,源码参考。 详细介绍了一些Qt...
基础的基于TCP协议多线程服务器-客户端聊天室,无图形化界面,纯控制台输入输出内容,实现聊天室群聊、私聊功能,服务端部分配备简单日志输出,注释齐全,适合开发者新手学习使用!详细内容请移步我的博客查看...
该demo实现了客户端与服务器端的通信,实现了类似于群聊的效果。no demo no true!!
采用I/O复用技术select实现socket通信,采用多线程负责每个客户操作处理,完成Linux下的多客户聊天室! OS:Ubuntu 15.04 IDE:vim gcc make DB:Sqlite 3 Time:2015-12-09 ~ 2012-12-21 项目功能架构: 1. ...
1. 用Java图形用户界面编写聊天室服务器端和客户端, 支持多个客户端连接到一个服务器。每个客户端能够输入账号。 2. 可以实现群聊(聊天记录显示在所有客户端界面)。 3. 完成好友列表在各个客户端上显示。 4. 可以...
java编译的控制台版多人简易聊天程序,运用了ServerSocket和Socket网络编程,还用了多线程,I/O流等技术.可以私聊,可以群聊!
基于TCP协议多线程服务器-客户端聊天室,unity实现页面交互,实现群聊,私聊功能
Java项目——模拟QQ群聊和私聊!!!(网络编程+多线程)-附件资源
该聊天工具,是一个服务器对应多个客户端的,是我结合J2SE基础知识、网络、线程来进行开发的,虽然界面不够人性化,功能也不够全面,但实现了群聊和私聊的主要功能
实现在多个客户端中实现群聊的功能,并且是在图形用户界面下进行操作。
Linux下用Socket和多线程实现简单聊天室
QT实现群聊和私聊等功能,类是QQ,基于tcpip协议的