Java与Python的recv()网络功能等效

时间:2015-04-13 22:15:39

标签: java python network-programming

我有一个用Java实现的客户端,以及一个在客户端实现的服务器。 客户端向服务器发送消息(字符串),例如“嵌套: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)在服务器断开连接之前永远不会返回。

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

1 个答案:

答案 0 :(得分:1)

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

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

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;
  }
}