当前位置: 首页 > 知识库问答 >
问题:

Java客户机和python服务器套接字连接-接收消息时文件结束错误

谢志用
2023-03-14
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        // need host and port, we want to connect to the ServerSocket at port 7777
        Socket socket = new Socket("localhost", 7777);
        System.out.println("Connected!");

        // get the output stream from the socket.
        OutputStream outputStream = socket.getOutputStream();
        // create a data output stream from the output stream so we can send data through it
        DataOutputStream dataOutputStream = new DataOutputStream(outputStream);

        System.out.println("Sending string to the ServerSocket");

        // write the message we want to send
        dataOutputStream.writeUTF("Hello from the other side!");
        dataOutputStream.flush(); // send the message
        dataOutputStream.close(); // close the output stream when we're done.

        System.out.println("Closing socket and terminating program.");
        socket.close();
    }
}
from multiprocessing.connection import Listener
address = ('localhost',7777)
while True:
    with Listener(address, authkey=None) as listener
        with listener.accept() as conn:
            print(conn.recv())

当我尝试执行此操作时,我在Python中得到以下错误:

OSError: got end of file during message

我做错了什么?

共有1个答案

章松
2023-03-14

这里的问题是multiprocessing连接的recv*函数希望在消息中获得一个32位的前导码,该前导码指示正在传输的实际数据量。下面是Java部分需要的样子(我并没有考虑缓冲的IO--只是简单地介绍一下):

import java.io.IOException;
import java.net.Socket;
import java.io.OutputStream;

public class Client {

    public static void main(String[] args) throws IOException {
        try (Socket socket = new Socket("localhost", 7777)) {
            OutputStream out = socket.getOutputStream();
            byte[] dts = "Hello from the other side!".getBytes();
            out.write(net(dts.length));
            out.write(dts);
        }
    }
    private static byte[] net(int n) {
        byte[] buffer = new byte[4];
        for (int i = 3; i >= 0; i -= 1) {
            buffer[i] = (byte)(n & 0xff);
            n >>>= 8;
        }
        return buffer;
    }
}

然后,您的Python服务器可以如下所示:

from multiprocessing.connection import Listener

def main():
    listener = Listener(address=('0.0.0.0', 7777), family='AF_INET', authkey=None)
    with listener.accept() as conn:
        print(conn.recv_bytes().decode())
            

if __name__ == '__main__':
    main()

因此,这意味着最初的问题是由于recv()查看前4个字节并将其解释为传入数据的长度。但这将等同于比实际发送的要大得多的东西。

 类似资料:
  • 我有套接字服务器(java桌面应用程序)正在等待从java webapp(套接字客户端)连接。通信看起来还可以,我在客户端看到来自服务器的消息,但是当我发送消息时,我在服务器端没有收到任何消息。会有什么问题呢?当我检查服务器与telnet,一切正常。下面是我的代码: 服务器: 客户: 谢谢帮忙!

  • 当我尝试使用套接字将物理设备连接到服务器时,我遇到了一个问题。在服务器端,它似乎不接受任何连接,而在客户端,套接字超时。你知道为什么会这样吗? 我在下面提供我的代码 服务器代码: 客户端: 11-16 23:32:11.016:W/系统。错误(24213):java.net。ConnectException:无法连接到/192.168.1.116(端口9090):连接失败:ETIMEDOUT(连接

  • 问题内容: 当我收到来自服务器的消息时,客户端是否接收到消息(如果在超时之前已断开连接)。我需要以某种方式从服务器端控制这种情况,我必须知道客户端是否能够在发送消息之前接收到消息。怎么做? 问题答案: 过去,我通常在单独的线程中使用阻塞读取来读取客户端消息并根据需要分发它们。 如果客户端断开连接,则InputStream.read()操作将返回-1,并且我们将其视为客户端已“断开连接”并且应关闭I

  • 真的需要你帮忙。 我的项目是通过电缆连接两台PC机,并使用tcp套接字将客户端文本框形式的字符串发送到服务器。问题是ATI只能发送一个字符串,然后连接就会关闭。 注意:某个端口上的连接将在表单加载中建立并成功。

  • 线程“main”java.net.ConnectException:连接超时:在java.net.dualStackplainsockeTimpl.Connect0(本机方法)在java.net.dualStackplainsockeTimpl.socketConnect(DualStackplainsockeTimpl.java:69)在java.net.abstractplainsockeTi

  • 首先我要感谢你花时间... 我在macbook中用C++创建了一个服务器套接字,在运行windows XP的不同机器中用Java创建了一个客户机/套接字。我已将端口指定为5000,但无法指定正确的主机,因此无法进行连接。当我在windows xp中使用WinSock2创建一个C++服务器/套接字时,当我使用本地主机时,连接是完美的...有什么想法吗??? 提前Thnx int main(int a