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