[英]TCP Java server, Python client String not equal
我在 Java 服务器和 Python 客户端之间建立了 TCP 连接。 当'q'从任何一个发送到另一个连接时,必须关闭。 当我将'q'从python发送到java时它起作用。 但是,当我将 'q' 从 java 发送到 python 时,它不起作用。 我尝试过类型转换,但没有用。
Java服务器:
公共类发件人{
public static void main(String[] args) throws IOException {
String fromclient;
ServerSocket Server = new ServerSocket(25000);
System.out.println("TCPServer Waiting for client on port 25000");
while (true) {
Socket connected = Server.accept();
System.out.println(
" THE CLIENT" + " " + connected.getInetAddress() + ":" + connected.getPort() + " IS CONNECTED ");
PrintWriter out = new PrintWriter(connected.getOutputStream(), true);
Scanner sc = new Scanner(System.in);
while (true) {
String input = sc.nextLine();
out.println(input);
}
}
}
}
Python客户端:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("localhost", 25000))
while True:
r, _, _ = select.select([client_socket], [], [])
if r:
data = client_socket.recv(4096)
string_data = data.decode('utf-8')
print str(string_data) == 'q'
if str(string_data) == 'q' or string_data == 'Q':
print ('Connection closed')
client_socket.close()
break
else:
print (string_data)
语句 print str(string_data) == 'q' 总是返回 false
您需要将 Java 服务器代码从out.println(input)
更改为out.print(input)
。 还添加一个out.flush()
以强制数据不仅在缓冲区填充后立即发送。
println
- 也会将换行符发送给客户端
print
它按预期工作。
编辑一些附加。 在这种情况下,它有助于 Python 客户端打印出data
的字节。
将 Python 客户端代码修改为
data = client_socket.recv(4096)
for i in bytearray(data):
sys.stdout.write(hex(i) + " ")
print
假设 Java 上的输入是q+ENTER
。 请参阅下面的Pathon 客户端的输出。
在 Java 服务器端使用out.println
0x71 0xd 0xa
False
q
在 Java 服务器端使用out.print
0x71
True
Connection closed
这样就很容易发现发送到客户端的额外字节 ( 0xd 0xa
)。
我认为编码是问题。 只需注释掉编码部分,代码就可以工作了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.