Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python套接字编程中,在服务器中等待来自客户端的消息_Python_Sockets - Fatal编程技术网

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

在python套接字编程中,在服务器中等待来自客户端的消息,python,sockets,Python,Sockets,我想遵循以下步骤: 1.客户端向服务器发送启动连接请求 2.服务器接受请求(或不接受) 3.服务器等待,直到客户端发送用户名 4.客户向用户询问username 5.服务器从客户端接收到包含用户名的聚合后,检查该聚合是否不存在,并为此连接创建新线程并注册连接 这是我的服务器代码: import socket import threading class mainServer(threading.Thread): userRegistered = list() clntNames

我想遵循以下步骤: 1.客户端向服务器发送启动连接请求 2.服务器接受请求(或不接受) 3.服务器等待,直到客户端发送
用户名
4.客户向用户询问
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]传输端点未连接的错误。
在这一行中,我希望服务器等待客户机发送消息。

这里有几个问题

第一个。当客户端连接(
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+=
。我这样做是因为。同样的情况也适用于以下行中的客户机代码
RegReqResp=self.sock.recv(1024)

第四个。不确定您为什么需要
以便重新使用EADDR
选项集



另一方面,Python有自己的编码风格指南:。显然,没有人必须遵循它,但我认为您会发现这本书很有趣。

我想您需要在空sock.recv上打破无限循环。即使客户端关闭套接字,您也在尝试无限读取。另一个问题是线程:它不能以这种方式工作。线程子类需要实现
run()
方法,实例需要
start()
ed才能在单独的线程中运行代码。