gpt4 book ai didi

python - 在Python套接字编程中,在服务器中等待来自客户端的消息

转载 作者:太空宇宙 更新时间:2023-11-03 17:10:02 25 4
gpt4 key购买 nike

我想按照以下步骤操作:1.client向server发送发起连接请求2.服务器接受请求(或不接受)3.服务器等待客户端发送用户名4.client向用户询问username的名称5.服务器收到客户端发来的包含用户名的消息后,检查它是否不存在,并为此连接创建一个新线程并注册该连接。

这是我的服务器代码:

import socket
import threading

class mainServer(threading.Thread):
userRegistered = list()
clntNames = list()

def __init__(self):
threading.Thread.__init__(self)
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind(('127.0.0.1', 14269))
self.sock.listen(5)

while True:
clientConn, clientAddr = self.sock.accept()
print("Got connection from", clientAddr)

clientNameReq = ""
while (1):
clientNameReq = self.sock.recv(10)
print("A")

clientConn.send("REG#OK".encode())
if(clientNameReq.decode() not in mainServer.clntNames):
clientThread(clientConn, clientAddr, clientNameReq)

其余代码已删除!这是客户端代码:

import threading
import socket
import sys
servername = '127.0.0.1'
class mainClients(threading.Thread):
def __init__(self, threadID, HOST, PORT):
threading.Thread.__init__(self)
self.id = threadID
self.port = PORT
self.host = HOST
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.sock.connect((self.host, self.port))
except:
print ("Unexpected error:", sys.exc_info()[0])
raise
clientName = input("Please enter your username:")
RegReq = "REG#EMAD"
self.sock.send(RegReq.encode())
RegReqResp = self.sock.recv(1024)
if (RegReqResp.decode()=="REG#OK"):
print("Ok Shod")
mainthread = mainClients(1, servername, 14269)

我从服务器代码中收到第 21 行 ( clientNameReq = self.sock.recv(10) ) 的 OSError: [Errno 107] Transport Endpoint is not connect 错误。在那一行中,我希望服务器等待,直到来自客户端的消息。

最佳答案

这里有几个问题。

第一个。当客户端连接(clientConn, clientAddr = self.sock.accept())时,会创建一个套接字clientConn。您使用此套接字与客户端通信,而不是 self.sock。在循环中,clientNameReq = self.sock.recv(10) 应更改为 clientNameReq = clientConn.recv(10)

第二个。纠正循环

while (1):
clientNameReq = clientConn.recv(10)
print("A")

程序没有机会跳出这个循环。这只是无限的。确保在这里引入某种条件。

got_the_name = False
while not got_the_name:
clientNameReq += clientConn.recv(10)
got_the_name = foo(clientNameReq)

第三个。请注意,在最后一段代码中,我将 clientNameReq = 更改为 clientNameReq +=。我这样做是因为in TCP, message boundaries are not preserved 。同样的情况也适用于以下行中的客户端代码 RegReqResp = self.sock.recv(1024)

第四个。不确定为什么需要设置 SO_REUSEADDR 选项。

<小时/>

另外一点,Python 有自己的编码风格指南:PEP8 。显然,没有人有义务遵循它,但我认为您会发现读起来很有趣。

关于python - 在Python套接字编程中,在服务器中等待来自客户端的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34188497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com