TCP通信学习 服务端没有响应
用Socket实现了TCP的聊天室的简单模型,
服务器端有两个类:TCPListener是用来监听客户端的连接请求的,并且新起一个线程用来不断的读取socket中的数据并且发送给所有已经建立连接的客户;TCPConnection就是这个读写的线程
客户端有两个类:TCPClient是用来发送连接请求的,并且监听键盘输入的聊天内容并写进socket,每次连接新起一个线程用来不断读取socket里返回的其他用户的聊天内容;TCPClientThread就是这个线程
先运行TCPListener后,再运行TCPClient,问题就是:一个客户端输入内容后,服务器端用来不断读取数据的线程并没有反映,也就是黑体的代码没有执行,其他客户端也没有收到服务器端返回的这个客户端的聊天信息。
服务器端有两个类:TCPListener是用来监听客户端的连接请求的,并且新起一个线程用来不断的读取socket中的数据并且发送给所有已经建立连接的客户;TCPConnection就是这个读写的线程
客户端有两个类:TCPClient是用来发送连接请求的,并且监听键盘输入的聊天内容并写进socket,每次连接新起一个线程用来不断读取socket里返回的其他用户的聊天内容;TCPClientThread就是这个线程
先运行TCPListener后,再运行TCPClient,问题就是:一个客户端输入内容后,服务器端用来不断读取数据的线程并没有反映,也就是黑体的代码没有执行,其他客户端也没有收到服务器端返回的这个客户端的聊天信息。
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();
}
}
}
...全文
相关推荐
C#基于TCP的Socket多线程通信(包含服务端和客户端)
本篇文章将深入探讨C#中基于TCP的Socket多线程通信,包括服务端和客户端的实现。
MFC:Socket编程—TCP服务端和多个客户端通信 示例代码
每个线程负责处理一个客户端的通信,确保并发性。这样,服务端可以维持多个并发的TCP连接。
Tcp通信(基于QT5.13 + TCP + 服务端 + 客户端)
这对于学习和理解QT5中的TCP通信以及网络编程是非常有价值的。通过研究提供的"TcpServer"和"TcpClient"文件,开发者可以更深入地了解QT5中TCP通信的具体实现细节。
汇川TCP通信:服务端和客户端程序通信
本主题将详细探讨如何实现汇川PLC的服务端和客户端程序之间的通信。首先,我们要理解TCP通信的基本原理。
基于tcp的异步套接字客户端服务端通信
异步套接字是TCP编程中的一个重要概念,尤其在构建高性能、高并发的服务器时更为关键。下面将详细阐述基于TCP的异步套接字客户端与服务端通信的知识点。1.


Java SE
