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();
}
}

最新文章

  1. Node聊天程序实例03:chat.js
  2. 【.Net底层剖析】3.用IL来理解属性
  3. PHP+MySQL存储数据出现中文乱码的问题
  4. Scout YYF I(POJ 3744)
  5. 什么是B-Tree
  6. 计算机基础理论知识梳理篇(三):VLAN与VLAN网卡相关概念
  7. lwip Light Weight (轻型)IP协议
  8. [INS-32052] Oracle基目录和Oracle主目录位置相同
  9. Maven(十二)Maven 依赖详解
  10. 全网搜歌神器Listen1 Mac中文版
  11. Spring如何加载log4j配置文件
  12. SSD垃圾回收
  13. windows系统安装python3.6.3和python3.7.0
  14. 《Linux内核分析》第五周笔记 扒开系统调用的三层皮(下)
  15. OO第三阶段总结
  16. 使用CefSharp在.Net程序中嵌入Chrome浏览器(九)——性能问题
  17. Warning: Divide by zero.
  18. MVC + ajaxform 文件上传
  19. Photoshop和Halcon中的极坐标变换
  20. 第155天:canvas(二)

热门文章

  1. Android开发 大坑Fragment
  2. 安全性测试入门 (四):Session Hijacking 用户会话劫持的攻击和防御
  3. java数据结构和算法10(堆)
  4. luogu P1592 互质
  5. IOS开发者账号的相关配置 - 接受邀请后的步骤
  6. 【原创】Android View框架总结(三)View工作原理
  7. EV根证书
  8. NOIP 2014 D2T3 解方程 Hash大法好
  9. ASP.NET Web API是如何根据请求选择Action的?[上篇] 【转】
  10. docker selinux-enabled作用