Java 等价于 Python 的 recv() 网络函数

Java's equivalence to the Python's recv() network function

我在 Java 中实现了一个客户端,在客户端中实现了一个服务器。 客户端向服务器发送一条消息(字符串),例如 "nesting:1:2",服务器解码输入的含义以创建二进制数据并将其发送回客户端。

这是 Python 服务器代码。

class MyTCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        # self.data has the data

        (name, index, n) = self.data.split(":")
        m = int(n)
        i = int(index)
        size = sizes.sizes[name][i]

        # creates the binary data
        bf = [0x41] * size * m      
        key = ''.join(chr(x) for x in bf)
        self.request.send(key) #

if __name__ == "__main__":
    HOST = socket.gethostbyname(socket.gethostname())
    PORT = 9999
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
    server.serve_forever()

客户端Python代码如下:

af, socktype, proto. canonname, sa = res
s = socket(af, socktype, proto)
s.connect(sa)
s.sendall('nostring:1:5')
data = s.recv(1024)
s.close()

我试图找到与 s.recv() 方法等效的方法,我找到了 read() 方法。所以,我尝试了这种方法,其中 byte[] buffer = new byte[157*10]; 在方法外声明。

public byte[] receive() throws IOException {
    InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
    socket = new Socket(serverAddr, SERVER_PORT);
    in = socket.getInputStream();
    in.read(buffer);
    in.close();
    socket.close();
    return this.buffer;
}

问题是 in.read(buffer) 永远不会 returns 直到服务器断开连接。

可能出了什么问题?这是客户端的完整源代码。

我没试过,但在我看来,在发送和接收操作之间不应关闭套接字,一个套接字意味着一个到服务器的连接。 python 服务器很可能会尝试在给定的套接字上应答,该套接字将被关闭,而 java 客户端将等待另一个套接字。

尝试类似的方法:在构造函数中创建套接字并在接收结束时关闭它(如果您确定您可能只调用一次 send/receive 对)

import java.net.*;
import java.io.*;

class GpcSocket {
  private Socket socket;
  // default value
  private int SERVER_PORT = 9999;
  private String SERVER_IP = "192.168.3.100";
  OutputStream out = null;
  InputStream in = null;
  byte[] buffer = new byte[157*10];

  public GpcSocket(String serverIP, int serverPort) {
    this.SERVER_PORT = serverPort;
    this.SERVER_IP = serverIP;
    InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
    socket = new Socket(serverAddr, SERVER_PORT);
  }

  public int send(byte[] str) throws IOException {
    out = socket.getOutputStream();
    out.write(str);
    out.flush();
    // out.close();
    return str.length;
  }

  public byte[] receive() throws IOException {
    in = socket.getInputStream();
    in.read(buffer);
    in.close();
    socket.close()
    return this.buffer;
  }
}