我有一个用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)
在服务器断开连接之前永远不会返回。
可能有什么问题?这是客户端的完整源代码。
答案 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;
}
}