62,614
社区成员
发帖
与我相关
我的任务
分享
TCPListener
public class TCPListener {
public static List<Socket> sockets = Collections.synchronizedList(new ArrayList<Socket>());
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(3003);
while(true){
Socket socket = server.accept();
sockets.add(socket);
new Thread(new TCPConnection(socket)).start();
}
}
}
TCPConnection
public class TCPConnection implements Runnable{
private Socket socket = null;
private BufferedReader input = null;
public TCPConnection(Socket socket){
this.socket = socket;
try {
input = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
String content = null;
try {
while((content = (input.readLine())) != null){
System.out.println(“不断读取socket中的数据的这段代码没有被执行”);
for(Socket target : TCPListener.sockets){
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(target.getOutputStream()));
output.write((content + " from server"));
System.out.println(content + " from server");
// output.flush();
}
}
} catch (IOException e) {
TCPListener.sockets.remove(socket);
System.out.println("A client has exited because of unexpected errors");
e.printStackTrace();
}
}
}
TCPClient
public class TCPClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 3003);
new Thread(new TCPClientThread(socket)).start();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
String content = null;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while((content = reader.readLine()) != null){
writer.println(content);
// writer.flush();
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
TCPClientThread
public class TCPClientThread implements Runnable{
public Socket socket = null;
public BufferedReader input = null;
public TCPClientThread(Socket socket){
this.socket = socket;
try {
input = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
String line = null;
while((line = input.readLine()) != null){
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//TCPListener.java文件
import java.io.*;
import java.net.*;
import java.util.*;
public class TCPListener {
public static List<Socket> sockets = Collections.synchronizedList(new ArrayList<Socket>());
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(3003);
while(true){
Socket socket = server.accept();
sockets.add(socket);
new Thread(new TCPConnection(socket)).start();
}
}
}
class TCPConnection implements Runnable{
private Socket socket = null;
private BufferedReader input = null;
public TCPConnection(Socket socket){
this.socket = socket;
try {
input = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
String content = null;
try {
//楼主之前没有响应,是因为客户端那边没有刷新缓冲区,这里就接收不到数据,程序会阻塞在这个地方,下面的代码也就无法执行
while((content = (input.readLine())) != null){
//System.out.println("不断读取socket中的数据的这段代码没有被执行");
for(Socket target : TCPListener.sockets){
PrintWriter writer = new PrintWriter(new OutputStreamWriter(target.getOutputStream()));//仿照客户端,改为PrintWriter输出
writer.println((content + " from server"));
//System.out.println(content + " from server");
writer.flush();//这里也要刷新,不然客户端程序也读不到数据,客户端程序也同样会阻塞
}
}
} catch (IOException e) {
TCPListener.sockets.remove(socket);
System.out.println("A client has exited because of unexpected errors");
e.printStackTrace();
}
}
}
//TCPClient.java文件
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 3003);
new Thread(new TCPClientThread(socket)).start();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream()));
String content = null;
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
while ((content = reader.readLine()) != null) {
writer.println(content);
writer.flush();// 刷新缓冲区,不然服务器端接收不到数据,会导致其程序阻塞
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class TCPClientThread implements Runnable {
public Socket socket = null;
public BufferedReader input = null;
public TCPClientThread(Socket socket) {
this.socket = socket;
try {
input = new BufferedReader(new InputStreamReader(
this.socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
String line = null;
while ((line = input.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Socket socket = new Socket("127.0.0.1", 3003);
new Thread(new TCPClientThread(socket)).start();
TCPClientThread类的run String line = null;
while((line = input.readLine()) != null){
System.out.println(line);
}
你的客户端连接到服务器后,还没有向服务器发送就想着要接收服务返回的东西了。由于你使用的socket阻塞模式编程,所以当客户端的run执行后,服务器一直等客户发数据,而客户端也一直在等着接收服务器的数据。这样就造成了死锁。