TCP Java服务器,Python客户端字符串不相等

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

我在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(输入)
更改为
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,请检查标准编码别名。