您的位置:首页 > 编程语言 > Java开发

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: