Python 服务器和 Java 客户端:服务器收到消息但客户端未收到回复
Python Server and Java Client: Server recieves message but Client doesn't receive reply
我制作了一个 python 服务器和一个 java 客户端。我的问题很简单:
服务器收到客户端的消息,但客户端没有收到回复。
Java 客户:
package fgd;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
public class fdassd {
public static void main(String[] args){
new Thread(){
public void run(){
while (true)
{
try {Socket socke=new Socket("censored",1977);
DataOutputStream dout=new DataOutputStream(socke.getOutputStream());
DataInputStream din = new DataInputStream(socke.getInputStream());
dout.writeUTF("Heey");
dout.flush();
String str = din.readUTF();
System.out.println(str);
dout.close();
socke.close();
}catch(Exception e){
e.printStackTrace();
}
try {
Thread.sleep(17000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
}
Python 服务器:
hosto = '0.0.0.0'
porto = 1979
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created!'
try:
soc.bind((hosto, porto))
except socket.error as e:
print(e)
sys.exit()
print 'Socket bind complete'
soc.settimeout(30)
soc.listen(10)
print 'Listening...'
timeout = 8
timeout_start = time.time()
while time.time() < timeout_start + timeout:
try:
conn, addr = soc.accept()
if addr[0] != opip:
conn.shutdown(socket.SHUT_RDWR)
conn.close()
else:
msg = conn.recv(1024)
print ('--------------------------------------')
print (msg)
conn.send((playername).encode('UTF-8'))
print ('Success! The following command has been sent to: ' + opip + ':' + playername )
print ('--------------------------------------')
soc.close()
break
except socket.timeout as e:
print(e,': Server not online or wrong ip')
soc.close()
break
else:
我见过一个非常相似的问题,答案是添加到 conn.send 之前的行(Link:)。
但是我不能在那个问题中使用解决方案,因为
conn.send(len(message_to_send).to_bytes(2, byteorder='big'))
似乎在 python 2.x 中不起作用。这意味着我需要另一种解决方案来使用 UTF-8 发送消息,但我不知道该怎么做。
此致
在发送 playername
之前添加以下行。这应该适用于 python2 和 3:
conn.send(struct.pack(">H", len(playername)))
此行将玩家名称的长度作为消息的前缀,正如 java DataInputStream#readUTF
方法所要求的那样。它被编码为一个双字节整数,因此 struct.pack
调用中的 'H'
。
您还需要一个 import struct
声明。
有关详细信息,请参阅 Python 2,3 Convert Integer to "bytes" Cleanly。
我制作了一个 python 服务器和一个 java 客户端。我的问题很简单: 服务器收到客户端的消息,但客户端没有收到回复。
Java 客户:
package fgd;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
public class fdassd {
public static void main(String[] args){
new Thread(){
public void run(){
while (true)
{
try {Socket socke=new Socket("censored",1977);
DataOutputStream dout=new DataOutputStream(socke.getOutputStream());
DataInputStream din = new DataInputStream(socke.getInputStream());
dout.writeUTF("Heey");
dout.flush();
String str = din.readUTF();
System.out.println(str);
dout.close();
socke.close();
}catch(Exception e){
e.printStackTrace();
}
try {
Thread.sleep(17000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
}
Python 服务器:
hosto = '0.0.0.0'
porto = 1979
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created!'
try:
soc.bind((hosto, porto))
except socket.error as e:
print(e)
sys.exit()
print 'Socket bind complete'
soc.settimeout(30)
soc.listen(10)
print 'Listening...'
timeout = 8
timeout_start = time.time()
while time.time() < timeout_start + timeout:
try:
conn, addr = soc.accept()
if addr[0] != opip:
conn.shutdown(socket.SHUT_RDWR)
conn.close()
else:
msg = conn.recv(1024)
print ('--------------------------------------')
print (msg)
conn.send((playername).encode('UTF-8'))
print ('Success! The following command has been sent to: ' + opip + ':' + playername )
print ('--------------------------------------')
soc.close()
break
except socket.timeout as e:
print(e,': Server not online or wrong ip')
soc.close()
break
else:
我见过一个非常相似的问题,答案是添加到 conn.send 之前的行(Link:
conn.send(len(message_to_send).to_bytes(2, byteorder='big'))
似乎在 python 2.x 中不起作用。这意味着我需要另一种解决方案来使用 UTF-8 发送消息,但我不知道该怎么做。
此致
在发送 playername
之前添加以下行。这应该适用于 python2 和 3:
conn.send(struct.pack(">H", len(playername)))
此行将玩家名称的长度作为消息的前缀,正如 java DataInputStream#readUTF
方法所要求的那样。它被编码为一个双字节整数,因此 struct.pack
调用中的 'H'
。
您还需要一个 import struct
声明。
有关详细信息,请参阅 Python 2,3 Convert Integer to "bytes" Cleanly。