我正在进行套接字级别的聊天分配,这需要我拥有一个存储用户名和IP地址和端口号的服务器,并将其发送给需要它的任何客户端以启用它们之间的聊天。 在Python中使用套接字编程的新手,所以我很难分配IP地址,并且还要挑选从服务器发送到客户端的序列化列表,
服务器端:
import pickle
import socket
udp_ip = '127.0.0.1'
udp_port = 8014
fd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
fd.bind((udp_ip,udp_port))
x=[]
while True:
r = fd.recvfrom(2048)
x.append(r)
print x
datas=pickle.dumps(x)
reply = r[0]
client_address = r[1]
#fd.sendto(bytearray(reply,"utf-8"), client_address)
fd.sendto(datas,client_address)
客户方:
import pickle
import socket
fd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM )
fd.getsockname()
udp_ip = '127.0.0.1'
udp_port = 8014
b=[]
print "SIGN-IN"
message= raw_input("USERNAME :")
fd.sendto(message, (udp_ip, udp_port))
while(True):
reply = fd.recvfrom(1000)
list1=raw_input("\n").lower().strip()
if list1=="list":
a=pickle.loads(reply)
b.append(a)
print "Here is the list of IP addr and ports",a
else:
print("Sorry didn't get that.")
问题1-需要弄清楚如何为客户端和服务器分配正确的IP地址。除localhost之外的任何其他IP都会返回错误,`ERRNO99无法分配请求的地址。
问题2- Pickle序列化非常棒,我正试图从服务器到客户端获取列表x,但它在客户端抛出错误,
`File"client1.py", line 21, in <module>
a=pickle.loads(reply)
File "/usr/lib/python2.7/pickle.py", line 1387, in loads
file = StringIO(str)
TypeError: StringIO() argument 1 must be string or buffer, not tuple
问题3-我仍然试图了解客户端如何能够从服务器列表中检索其他客户端的ip和端口信息,然后直接联系其他客户端(不涉及服务器)。还想了解bytearrays(如果我使用pickle序列化,我可以完全摆脱它们)
我会尽可能多地感谢你的帮助,但不要问任何人在这里完全编码,只是告诉我的方式,让我知道我错在哪里。良好范例的链接将是完美的。
答案 0 :(得分:-2)
因为
reply = fd.recvfrom(1000)
返回元组(地址,味精)