java - Python服务器和Java客户端: Server recieves message but Client doesn't receive reply

标签 java python sockets server client

我做了一个python服务器和一个java客户端。我的问题很简单: 服务器收到客户端的消息,但客户端没有得到回复。

Java 客户端:

package fgd;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;



public class fdassd {


        public static void main(String[] args){





              new Thread(){
               public void run(){
                while (true)
                {
                 try {Socket socke=new Socket("censored",1977);  

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

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

                    String str = din.readUTF();
                    System.out.println(str);



                    dout.close();  
                    socke.close();
                    }catch(Exception e){
                         e.printStackTrace();
                    } 




                try {
                    Thread.sleep(17000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    }
                }
               }
              }.start();

}
}

Python 服务器:

            hosto = '0.0.0.0'
            porto = 1979
            soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

            print 'Socket created!'

            try:
                    soc.bind((hosto, porto))
            except socket.error as e:
                print(e)
                    sys.exit()

            print 'Socket bind complete'

            soc.settimeout(30)
            soc.listen(10)

            print 'Listening...'

            timeout = 8

            timeout_start = time.time()

            while time.time() < timeout_start + timeout:
                try:
                        conn, addr = soc.accept()
                    if addr[0] != opip:
                        conn.shutdown(socket.SHUT_RDWR)
                        conn.close()
                    else:
                        msg = conn.recv(1024)
                        print ('--------------------------------------')
                        print (msg)
                        conn.send((playername).encode('UTF-8'))
                        print ('Success! The following command has been                             sent to: ' + opip + ':' + playername )
                        print ('--------------------------------------')
                        soc.close()
                        break 
                except socket.timeout as e:
                    print(e,': Server not online or wrong ip')
                    soc.close()
                    break




        else:

我见过一个非常类似的问题,答案是添加到 conn.send 之前的行(链接: Socket Java client - Python Server )。 但我无法使用该问题中的解决方案,因为

conn.send(len(message_to_send).to_bytes(2, byteorder='big'))

似乎在 python 2.x 中不起作用。这意味着我需要另一个解决方案来使用 UTF-8 发送消息,但我不知道该怎么做。

问候

最佳答案

在发送玩家名之前添加以下行。这应该适用于 python2 和 3:

conn.send(struct.pack(">H", len(playername)))

此行将在消息中添加玩家名称的长度前缀,这是 java DataInputStream#readUTF 方法所要求的。它被编码为一个两字节整数,因此在 struct.pack 调用中使用 'H'

您还需要一个import struct语句。

参见Python 2,3 Convert Integer to "bytes" Cleanly了解更多信息。

关于java - Python服务器和Java客户端: Server recieves message but Client doesn't receive reply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52246538/

相关文章:

java - 加载数据到HDFS时出现一些错误

python - 使用 wget 下载指定大小的 Twitter 图片

python - PIL 并不总是为 PNG 使用 3 个 channel

python - 正确语法的 MySQL 服务器版本

JavaFX 更改标题 Pane 图标的标题

java - 在控制台中打印彩色文本(Windows、Mac、Linux)

php - 通过 PHP 检索网站源的最有效方法? (获取请求)

python - 使用 Socket 发送原始 POST 请求

node.js - 当 FreeSWITCH Node esl 服务器已桥接到另一个端点时,以编程方式在 FreeSWITCH Node esl 服务器内传输调用

java - Kotlin 与 Java @Overrides