我有TCPServer.java:
import java.util.*;
import java.net.*;
import java.io.*;
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket tcp = new ServerSocket(1387);
while (true) {
Socket request = tcp.accept();
Scanner sc = new Scanner(request.getInputStream());
DataOutputStream out = new DataOutputStream(request.getOutputStream());
System.out.println("Request count: " + sc.nextLine());
out.writeBytes("send another request please");
}
}
}
和pythonClient.py
:
#!/usr/bin/python
import socket, time, sys
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((sys.argv[1], 1387))
count = 0
while True:
count += 1
sock.sendall(str(count) + "\n")
time.sleep(1)
data = sock.recv(1024)
print "received:\n", str(data)
我在同一台主机上运行,并且期望在TCPServer的控制台中每秒都会收到“请求计数:x”并且增加x
值
received:
send another request please
运行pythonClient.py的终端中的每一秒。但是,我得到的只是java控制台中的“请求数:1”而没有别的。在终端,我得到:
received:
s
received:
end another request please
为什么这不按预期工作?为什么在一次迭代后它全部被锁定,为什么服务器的第一个响应被接受为两个不同的消息?
答案 0 :(得分:2)
您的Java代码期望每次在循环中接收新连接并与每个连接进行一次交互。您的Python代码正在建立一个连接并尝试重复与它进行交互。这些模型不匹配 - 您需要更改一个。
最容易改变的是Python代码。我们可以在循环中每次创建一个新连接,如下所示:
count = 0
while True:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((sys.argv[1], 1387))
count += 1
sock.sendall(str(count) + "\n")
time.sleep(1)
data = sock.recv(1024)
print "received:\n", str(data)