繁体   English   中英

TCP Java 服务器,Python 客户端 String 不相等

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM