我正在尝试以下客户端和服务器聊天程序。虽然每当我尝试运行服务器程序时都会收到错误,但是当客户端程序运行时,它会保留在空白屏幕上,不允许我输入任何内容。我已经尝试先运行服务器并首先运行客户端,我得到相同的结果。我无法从服务器程序中读取错误,因为它会闪烁错误并关闭窗口。这是我的代码:
服务器:
#server
import socket
import time
HOST = ''
PORT = 8065
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((HOST,PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
conn.close()
客户端:
#client
import socket
import time
HOST = "localhost"
PORT = 8065
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((HOST,PORT))
s.sendall('Helloworld')
data = s.recv(1024)
s.close()
print 'Recieved', repr(data)
答案 0 :(得分:1)
我不是专家,但是我能够通过将套接字从数据报更改为流连接,然后编码发送的消息因为不支持字符串而使您的示例工作(尽管这可能不会影响您,因为我认为更改是用Python 3制作的......我不是百分百肯定的。
我认为主要的问题是你正在尝试listen()但是SOCK_DGRAM(UDP)不支持listen(),你只需绑定并从那里开始,而SOCK_STREAM(TCP)使用连接。
如果您只是想让程序继续运行,请使用以下代码,除非您有特殊原因要使用SOCK_DGRAM。
代码如下:
客户端
#client
import socket
import time
HOST = "localhost"
PORT = 8065
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST,PORT))
test = 'Helloworld'
s.sendall(test.encode())
data = s.recv(1024)
s.close()
print 'Recieved', repr(data)
服务器
#server
import socket
import time
HOST = ''
PORT = 8065
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST,PORT))
s.listen(1)
conn, addr = s.accept()
print ('Connected by', addr)
while 1:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
conn.close()