Socket 群聊功能
2024-09-04 13:55:09
1、Server端:
拥有一个存放与客户端连接对象的List<socket> 有一个客户端发信息后 遍历List 实现群发功能 代码如下:
package com.socket; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List; public class MyServer { public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(10002);
List<Socket> allClient = new ArrayList<>();
System.out.println("server is starting....");
while(true){
Socket s = ss.accept();
allClient.add(s);
new Thread(new ServerThread(s, allClient)).start();
}
} }
class ServerThread implements Runnable{
private Socket s;
private List<Socket> allClient; public ServerThread(Socket s, List<Socket> allClient) {
super();
this.s = s;
this.allClient = allClient;
} @Override
public void run() {
try {
System.out.println(s.getInetAddress().getHostAddress()+"上线了...");
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;
while((line = in.readLine())!=null){
for(Socket soc:allClient){
//向其他客户端发信息
if(!soc.equals(s)){
PrintWriter pw = new PrintWriter(soc.getOutputStream(),true);
pw.println(line);
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }
2、客户端:
客户端需要注意的是用户不仅可以输入,还可以随时的接受服务端发来的信息,这就要求读和写分开两个线程来操作代码如下:
package com.socket; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket; public class Client { public static void main(String[] args) throws IOException, Exception {
final Socket s = new Socket(InetAddress.getLocalHost(),10002);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
String line = null;
new Thread(new Runnable() {
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = null;
while((str = br.readLine())!=null){
System.out.println(str);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
while ((line = br.readLine())!=null){
pw.println(line);
}
s.close();
br.close();
}
}
最新文章
- Node聊天程序实例03:chat.js
- 【.Net底层剖析】3.用IL来理解属性
- PHP+MySQL存储数据出现中文乱码的问题
- Scout YYF I(POJ 3744)
- 什么是B-Tree
- 计算机基础理论知识梳理篇(三):VLAN与VLAN网卡相关概念
- lwip Light Weight (轻型)IP协议
- [INS-32052] Oracle基目录和Oracle主目录位置相同
- Maven(十二)Maven 依赖详解
- 全网搜歌神器Listen1 Mac中文版
- Spring如何加载log4j配置文件
- SSD垃圾回收
- windows系统安装python3.6.3和python3.7.0
- 《Linux内核分析》第五周笔记 扒开系统调用的三层皮(下)
- OO第三阶段总结
- 使用CefSharp在.Net程序中嵌入Chrome浏览器(九)——性能问题
- Warning: Divide by zero.
- MVC + ajaxform 文件上传
- Photoshop和Halcon中的极坐标变换
- 第155天:canvas(二)