[英]waiting in server for a massage from client in python socket programming
我要執行以下步驟:1.客戶端向服務器發送初始化連接請求2.服務器接受請求(或不接受)3.服務器等待客戶端發送username
4.客戶端詢問用戶username
5 .server從客戶端收到包含username
的Massge后,檢查它是否不存在,並為此連接創建新線程並注冊連接。
這是我的服務器代碼:
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)
我從服務器代碼中得到OSError: [Errno 107] Transport endpoint is not connected
第21行的OSError: [Errno 107] Transport endpoint is not connected
錯誤(clientNameReq = self.sock.recv(10))。 在那條線中,我希望從服務器等待直到來自客戶端的消息。
這里有幾個問題。
第一個 。 當客戶端連接時( 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 +=
。 我這樣做是因為在TCP中,不保留消息邊界 。 以下行RegReqResp = self.sock.recv(1024)
的客戶端代碼也是RegReqResp = self.sock.recv(1024)
第四個 。 不知道為什么需要SO_REUSEADDR
選項集。
單獨說明一下,Python有其自己的編碼風格指南: PEP8 。 顯然,沒有人有義務遵循它,但是我想您會發現這很有趣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.