簡體   English   中英

在服務器上等待python套接字編程中來自客戶端的消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM