TCP编程——实现多人聊天室功能
来源:互联网 发布:用筑业软件做资料 编辑:程序博客网 时间:2024/06/05 19:29
通过上一篇方法就能够实现TCP简单连接,但是有个问题,不能实现多客户端连接,因为服务器端如果接到一个连接请求之后,就会进入代码对应的循环中。那么怎么实现多人聊天呢?
实际上可以使用多线程,这样就不会有上述问题了。只需要引入新线程来处理每个连接事务即可
package Net.TCP;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;/** * @author lcx * */public class TCPThreadServer {ServerSocket server;public static void main(String[] args) throws IOException {TCPThreadServer tcpserver=new TCPThreadServer();ServerSocket server=new ServerSocket(30002);while(true){System.out.println("服务器等待中.......");final Socket socket=server.accept();Thread td=new Thread(){@Overridepublic void run(){try {doClient(socket);} catch (IOException e) {e.printStackTrace();}}};td.start();}}private static void doClient(Socket socket) throws IOException{System.out.println("接收到一个客户端信号"+socket.getInetAddress().getHostAddress()+" 名称是: "+socket.getInetAddress().getHostName());BufferedReader fromClient=new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedReader message=new BufferedReader(new InputStreamReader(System.in));String line=fromClient.readLine();while(line!=null&&!line.equals("exit")){System.out.println(socket.getInetAddress().getHostAddress()+":"+line);line=fromClient.readLine(); }System.out.println(socket.getInetAddress().getHostAddress()+"退出");message.close();fromClient.close();}}
这样一来又有个问题,会不断有客户端连接服务器端,怎么样控制数量呢?
比如我们聊天室就是10个人的聊天室,多了不行,那怎么办?
我们可以重写ServerSocket的accpet方法,并引入一个volatile变量进行标记,那样真的好吗?
最好是使用我们的线程池来管理吧,既然有线程池,就拿来主义吧,何必花心思自己弄呢。
package Net.TCP;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;/** * @author lcx * */public class TCPPoolServer {ServerSocket server; // 构造一个线程池 ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3), new ThreadPoolExecutor.DiscardOldestPolicy()); public static void main(String[] args) throws IOException {TCPPoolServer tcpserver=new TCPPoolServer();ServerSocket server=new ServerSocket(30002);while(true){System.out.println("服务器等待中.......");final Socket socket=server.accept();ClientJob job=new ClientJob(socket);tcpserver.threadPool.execute(job);}}static void doClient(Socket socket) throws IOException{System.out.println("接收到一个客户端信号"+socket.getInetAddress().getHostAddress()+" 名称是: "+socket.getInetAddress().getHostName());BufferedReader fromClient=new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedReader message=new BufferedReader(new InputStreamReader(System.in));String line=fromClient.readLine();while(line!=null&&!line.equals("exit")){System.out.println(socket.getInetAddress().getHostAddress()+":"+line);line=fromClient.readLine(); }System.out.println(socket.getInetAddress().getHostAddress()+"退出");message.close();fromClient.close();}}class ClientJob implements Runnable{Socket socket;public ClientJob(Socket socket){this.socket=socket;}public void run() {try {TCPPoolServer.doClient(socket);} catch (IOException e) {e.printStackTrace();}}}
聊天结果如下:
服务器等待中.......
服务器等待中.......
接收到一个客户端信号192.168.100.156 名称是: lcx-PC
192.168.100.156:我叫lcx 我来了
服务器等待中.......
接收到一个客户端信号192.168.100.241 名称是: 192.168.100.241
192.168.100.241:hi 我叫韩梅梅
192.168.100.241:今天天气不错啊
192.168.100.156:是啊 我出去完了 先退了
192.168.100.156退出
192.168.100.241:我也走了
192.168.100.241退出
1 0
- TCP编程——实现多人聊天室功能
- Java——多人聊天室(基于TCP的网络编程——Socket)
- Erlang TCP编程:聊天室
- java网络编程,通过TCP,Socket实现多对一的局域网聊天室 .
- java网络编程,通过TCP,Socket实现多对一的局域网聊天室
- java网络编程,通过TCP,Socket实现多对一的局域网聊天室
- Java网络编程,通过TCP,Socket实现多对一的局域网聊天室
- linux网络编程练习---聊天室(TCP/IP实现)
- 14 QT TCP网络编程与网络聊天室的实现
- 【linux】多进程实现聊天室功能
- 聊天室功能实现
- 聊天室功能实现代码
- dwr实现聊天室功能
- 【tcp-ip学习总结】基于udp的多人聊天室,带有登录注册功能
- java socket编程实现简单聊天室功能 单线程执行
- 网络编程TCP协议-聊天室
- Java使用socket网络编程实现多人聊天室
- Java使用socket网络编程实现多人聊天室
- 关于安装Gynamotion遇到问题
- MySQL丢数据及主从数据不一致的场景
- 归并排序 分治法
- 更简单的AutoLayout 之SDAutoLayout
- http https环境下servlet获取中文参数编码不同
- TCP编程——实现多人聊天室功能
- McCall的软件质量模型
- regetnIesreveR.7
- Databricks Scala 编程风格指南
- android版本兼容问题
- iOS真机调试打印并保存控制台输出日志
- 隐藏文件的链接地址
- jQuery Ajax通用js封装
- 网络配置必要代码段