Java Socket实现多客户端通信(通过DOS命令窗口模拟)
2015-11-14 21:52
316 查看
服务器端代码
客户端代码
/* * * 当客户端、服务器端产生了对应的socket以后,就得到了双方的通信。程序无须再区分服务器端、客户端, * 而是通过各自的Socket进行通信。 * * InputStream getInputStream():返回给socket对象对应的输入流,让程序通过该输入流从socket中取出数据。 * OutputStream getOutputStream():返回该socket对象所对应的输出流,让程序通过该输出流向socket中输出数据。 * * 在使用传统BufferedReader的readLine()方法读取数据时,在该方法成功返回之前,线程被阻塞,程序无法继续执行,考虑 * 到这个原因,服务器端应该为每个socket单独启动一个线程,该线程专门负责读取服务器端数据。 */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class MyServer { public static List<Socket> socketList = Collections.synchronizedList(new ArrayList<>()); public static void main(String[] args){ try { ServerSocket ss = new ServerSocket(12345); while(true){ //此行代码会阻塞,将一直等待别人的连接。 Socket s = ss.accept(); //每接受到一个客户端的连接请求,就把该客户端加入list中 socketList.add(s); //每当客户端连接后启动一个ServerThread为该客户端服务 new Thread(new ServerThread(s)).start(); } } catch (IOException e) { e.printStackTrace(); } } } class ServerThread implements Runnable{ //定义当前线程所属的Socket private Socket s; //该线程所处理的Socket对应的输入流 private BufferedReader br; public ServerThread(Socket s) throws IOException { this.s = s; //初始化该Socket对应的输入流 br = new BufferedReader(new InputStreamReader(s.getInputStream())); } @Override public void run() { try { String content = null; //采用循环不断地从Socket中读取客户端发送过来的数据 while ((content = br.readLine())!=null) { //遍历socketList中的每个Socket,将读到的内容向每个Socket发送一次 for (Socket s : MyServer.socketList) { PrintStream ps = new PrintStream(s.getOutputStream()); ps.println(content); } } } catch (IOException e) { e.printStackTrace(); } } }
客户端代码
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; public class MyClient { public static void main(String[] args) throws Exception { Socket s = new Socket("192.168.191.2", 12345); //客户端启动ClientThread线程不断地读取来自服务器的数据 new Thread(new ClientThread(s)).start(); //获取该socket对应的输出流 PrintStream ps = new PrintStream(s.getOutputStream()); String line = null; BufferedReader br = new BufferedReader (new InputStreamReader(System.in)); //不断读取键盘输入的信息 while((line = br.readLine())!=null){ ps.print(line); } } } class ClientThread implements Runnable{ //该线程负责处理的Socket private Socket s; //该线程所处理的Socket对应的输入流 private BufferedReader br = null; public ClientThread(Socket s) throws IOException { this.s = s; br = new BufferedReader(new InputStreamReader(s.getInputStream())); } @Override public void run() { try { String content = null; //不断读取Socket输入流中的内容,并将这些内容打印出来 while((content = br.readLine())!=null){ System.out.println(content); } } catch (IOException e) { e.printStackTrace(); } } }
相关文章推荐
- 插入排序Java代码实现
- 【Java小项目】图片浏览器
- Java Socket实现1V1简单通信(通过Dos命令窗口实现)
- 10011---JavaWeb基础---JSP概述
- Java并发(多线程)
- Java入门(四)final关键字
- JAVA中JVM简单学习
- ubuntu中执行gradle提示JAVA_HOME错误
- SpringMVC返回json数据的配置方式
- java源码分析07-ArrayList
- JAVA基础——集合框架
- Struts2_include
- 锁优化-java
- eclipse开发安卓项目的一些小错误(1)
- 线程安全(java)
- Java 反射机制
- Java异常处理 编程 考试成绩 优良中差判断
- Java入门(二)类与继承
- Java 设计模式之单例模式详解
- Struts2系统学习(15)Struts2校验框架基本原理分析