我正在用 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
时,这就是我所得到的:
我的问题是,为什么我没有收到来自服务器初始化的简单打印消息?运行 netstat 时 CLOSE_WAIT 和 FIN_WAIT_2 是什么意思?
答案 0 :(得分:0)
服务器线程将永远循环,直到套接字超时导致创建的套接字上出现等待状态,如 netstat 命令所示。在服务器线程中添加检查以检查来自客户端的数据何时完成。
<块引用>当一个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