Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.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,(我有以下代码,希望在其中实现服务器端应用程序并向客户端发送响应: class client(Thread): def __init__(self, socket, address): Thread.__init__(self) self.sock = socket self.addr = address self.start() def run(self): request = '' while 1: data = se

(我有以下代码,希望在其中实现服务器端应用程序并向客户端发送响应:

class client(Thread):
  def __init__(self, socket, address):
     Thread.__init__(self)
     self.sock = socket
     self.addr = address
     self.start()

def run(self):
    request = ''
    while 1:
      data = self.sock.recv(1024).decode() # The program hangs here with large message
      if not data:
         break
      request += data
   print(request, self.addr[1], self.addr[0]))
   message = "test"
   self.sock.send(message.encode())


def init_server():
  serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  serversocket.bind((host, int(port)))
  serversocket.listen(5)
  while 1:
      clients, address = serversocket.accept()
      client(clients, address)
  return
现在我编写一个简单的客户端:

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8000))
client_socket.send(message)
request = ''
while 1:
  data = client_socket.recv(2048).decode()
  if not data:
  break
  request += data
print(request)
client_socket.close()

现在的问题是服务器挂起在带有一条大消息的recv中。如何解决它?

您的客户端套接字和服务器套接字是不同的套接字

您可以使用
serversocket
对象获取服务器信息,方法与您尝试的
self.sock
相同

我建议将
serversocket
作为第三个参数解析到
client
类中,然后在类中使用它,如下所示:

类客户端(线程):
定义初始化(self、套接字、地址、服务器):
线程。\uuuu初始化\uuuuu(自)
self.sock=socket
self.addr=地址
self.server=server
self.start()
def运行(自):
请求=“”
而1:
data=self.sock.recv(1024).decode()
如果没有数据:
打破
请求+=数据
打印(请求,self.server.getsockname()[1],self.server.getsockname()[0]))
def init_server():
serversocket=socket.socket(socket.AF\u INET,socket.SOCK\u流)
绑定((主机,int(端口)))
serversocket.listen(5)
而1:
客户端,地址=serversocket.accept()
客户端(客户端、地址、服务器套接字)
返回
它应该输出服务器信息


如果您需要客户端信息,它将在“地址”中解析为元组,您可以看到远程IP地址和用于通信的套接字端口(而不是开放端口)。

我修改了问题以澄清问题