没有来自套接字服务器的打印消息,从客户端发送的消息接收响应

时间:2021-05-13 13:53:09

标签: python sockets python-multithreading

我正在用 Python 设置一个能够处理多个客户端的客户端/服务器。

服务器代码:

import socket
import threading

class Server:
    def __init__(self):
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind(('127.0.0.1',1234 ))
        print("Waiting for connection")
        self.server.listen()

        self.loop()

    def thread_client(self, conn, addr):
        print(addr, ' has connected')
        while True:
            data = conn.recv(1024)
            conn.sendall(data)

    def loop(self):
        while True:
            conn, addr = self.server.accept()
            x = threading.Thread(target = self.thread_client, args=(conn, addr,))
            x.start()
        self.server.close()

s = Server()

客户端代码:

import socket

class Client:
    def __init__(self):
        self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connect()
    
    def connect(self):
        try:
            self.client.connect(('127.0.0.1', 1234))
        except:
            print("Something went wrong...")

    def send(self, data):
        self.client.sendall(data)
        return self.client.recv(1024)

c = Client()
print(c.send(b'Hello World'))
print(c.send(b'Hello World'))

当我在一个终端中运行 py server.py 时,这就是我所得到的: enter image description here

从客户端看,它是这样的: enter image description here

我的问题是,为什么我没有收到来自服务器初始化的简单打印消息?运行 netstat 时 CLOSE_WAIT 和 FIN_WAIT_2 是什么意思?

1 个答案:

答案 0 :(得分:0)

服务器线程将永远循环,直到套接字超时导致创建的套接字上出现等待状态,如 netstat 命令所示。在服务器线程中添加检查以检查来自客户端的数据何时完成。

Socket Programming HOWTO 声明:

<块引用>

当一个socket.recv返回0字节时,表示对方已经关闭 (或正在关闭)连接。您将不会收到任何 有关此连接的更多数据。

服务器更新:

import socket
import threading

class Server:
    def __init__(self):
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind(('127.0.0.1', 1234))
        print("Waiting for connection")
        self.server.listen()

        self.loop()

    def thread_client(self, conn, addr):
        print(addr, ' has connected')
        while True:
            data = conn.recv(1024)
            if len(data) == 0:
                break
            print("recv:", data)
            conn.sendall(data)
        conn.close()

    def loop(self):
        while True:
            conn, addr = self.server.accept()
            x = threading.Thread(target=self.thread_client, args=(conn, addr,))
            x.start()
        self.server.close()

s = Server()

对于客户端,完成后关闭套接字连接。

客户端更新:

c = Client()
print(c.send(b'Hello World'))
print(c.send(b'Hello World'))
c.client.close()  # added
相关问题