Socket Java客户端 - Python服务器

6
我正在尝试实现一个 Java - Python 客户端/服务器套接字。客户端使用 Java 编写,服务器使用 Python 编写。
Java 客户端:
import java.io.*;  
import java.net.*; 
import java.lang.*;

public class client {

public static void main(String[] args) {  



    try{      
        Socket socket=new Socket("localhost",2004);  

        DataOutputStream dout=new DataOutputStream(socket.getOutputStream());  
        DataInputStream din=new DataInputStream(socket.getInputStream());


        dout.writeUTF("Hello");
        dout.flush();

        System.out.println("send first mess");
        String str = din.readUTF();//in.readLine();

        System.out.println("Message"+str);


        dout.close();  
        din.close();
        socket.close();
        }

    catch(Exception e){
        e.printStackTrace();}   


}  

}

Python 服务器
import socket               

soc = socket.socket()         
host = "localhost" 
port = 2004                
soc.bind((host, port))      
soc.listen(5)                 

while True:
    conn, addr = soc.accept()     
    print ("Got connection from",addr)
    msg = conn.recv(1024)
    print (msg)
    print(len(msg))

    if "Hello"in msg:
         conn.send("bye".encode('UTF-8'))
    else:
         print("no message")

客户端发给服务器的第一条消息已经成功传送了,但是服务器发给客户端的第二条消息没有成功传送。我使用telnet检查了一下,发现服务器发送了消息,但是客户端陷入了死锁状态,无法接收消息。我不明白为什么会这样。谢谢。
1个回答

6
似乎你的Python服务器缩进有误,因为发送消息回客户端的代码无法到达。
即使修复了缩进,你的服务器实现也不正确,因为msg不是字符串。你需要像下面那样对msg进行解码。此外,由于你正在使用DataInputStream#readUTF在客户端中,所以你需要发送消息的长度作为short类型。
import socket

soc = socket.socket()
host = "localhost"
port = 2004
soc.bind((host, port))
soc.listen(5)

while True:
    conn, addr = soc.accept()
    print("Got connection from",addr)
    length_of_message = int.from_bytes(conn.recv(2), byteorder='big')
    msg = conn.recv(length_of_message).decode("UTF-8")
    print(msg)
    print(length_of_message)

    # Note the corrected indentation below
    if "Hello"in msg:
        message_to_send = "bye".encode("UTF-8")
        conn.send(len(message_to_send).to_bytes(2, byteorder='big'))
        conn.send(message_to_send)
    else:
        print("no message")

1
谢谢,你的解决方案解决了我的问题,错误的缩进是复制粘贴错误! - epascolo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接