使用Python和Java打开套接字的区别
我在用Java打开和关闭多个连接到同一个主机时,遇到了一个很奇怪的问题。
我想用一个for
循环来打开一个tcp连接,发送一些数据,接收响应,然后关闭连接。但是在这个循环执行到第三次的时候,它就不工作了。虽然打开和写入socket还是可以的,但读取就不行了。
我最开始以为是远程主机的问题,但我写了一个小的python脚本来调试,结果一切正常,这个脚本轻松执行了超过50次的for
循环,远程主机也总是按预期回复。
那么,python在打开和关闭socket时和Java有什么不同吗?我该怎么调试这个问题呢?
谢谢。
更新:
这是我在两种情况下使用的代码:
Python:
for i in range(0, 10):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(command)
data = s.recv(1024)
data = data[2:]
print 'Received', "--->%s<--" % data.decode()
Java:
for (int i = 0; i < 10; i++) {
Socket socket = new Socket("localhost", 9998);
OutputStream bos = socket.getOutputStream();
InputStream bis = socket.getInputStream();
byte[] raw = "XX0000NC".getBytes();
raw[0] = 0x0;
raw[1] = 0x6;
bos.write(raw);
bos.flush();
byte[] buffer = new byte[1024];
int readCount = bis.read(buffer);
System.out.println(new String(Arrays.copyOfRange(buffer, 2, readCount)));
socket.shutdownOutput();
socket.shutdownInput();
socket.close();
}
1 个回答
0
你没有显示出在Python代码中使用的command
的值。也许你发送了不同的命令?
我能看到的唯一其他区别是,在Python中你使用socket.send
,而在Java中你使用OutputStream.write
:
当没有足够的缓冲区空间来写入所有数据时,会出现不同的行为:
send
只发送它能发送的那部分数据,如果不能发送任何数据,它就会阻塞,直到可以发送为止。write
会一直阻塞,直到所有字节都发送完。
老实说,我觉得这种情况不太可能,因为你发送的命令非常短……
你可以很简单地测试这个情况,把你的Python代码改成:
for i in range(0, 10):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
sent = s.send(command)
if sent != len(command):
print 'Some bytes not sent!!!\n'
data = s.recv(1024)
data = data[2:]
print 'Received', "--->%s<--" % data.decode()