TCP Java服务器,Python客户端字符串不相等
我在Java服务器和Python客户端之间有一个TCP连接。 当“q”从任何位置发送到其他位置时,必须关闭连接。 当我将“q”从python发送到java时,它就工作了。然而,当我将“q”从java发送到python时,它不起作用。我试过打字,但没用 Java服务器: 公共类发送器{TCP Java服务器,Python客户端字符串不相等,java,python,string,sockets,tcp,Java,Python,String,Sockets,Tcp,我在Java服务器和Python客户端之间有一个TCP连接。 当“q”从任何位置发送到其他位置时,必须关闭连接。 当我将“q”从python发送到java时,它就工作了。然而,当我将“q”从java发送到python时,它不起作用。我试过打字,但没用 Java服务器: 公共类发送器{ public static void main(String[] args) throws IOException { String fromclient; ServerSocket Server
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(输入)
更改为out.print(输入)
。还添加一个out.flush()
,以强制不仅在缓冲区填满后立即发送数据
println
-还将向客户端发送换行符
使用print
时,它可以正常工作
编辑一些附加内容。在这种情况下,它有助于Python客户端打印数据中的字节
将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
这样就很容易发现发送到客户端的额外字节(0xd0xa
)。仍然存在同样的问题,使用Charset.defaultCharset()对java端进行编码或系统属性或InputStreamReader.getEncoding,并在python端使用相同的编码。编码为UTF-8,请检查标准编码别名。