0

我正在尝试在 Python 中实现一个小型聊天服务器-客户端对。我已经编写了服务器和客户端,但是尝试在我的网站上运行服务器时遇到了一点问题。

这个例子来自文档。我对其进行了一些修改以支持多个客户端:

#!/usr/bin/env python

import socket

TCP_IP = '127.0.0.1'
TCP_PORT = 9090
BUFFER_SIZE = 256

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

while True:
    conn, addr = s.accept()
    print('Connection address:', addr)
    while True:
        data = conn.recv(BUFFER_SIZE)
        if not data: continue
        # handle the request 
    conn.close()

此服务器使用一个 while 循环,这意味着它应该只运行一次。但是,我不知道如何只运行一次服务器。

我知道我必须socket.accept()在一个while循环中执行才能与多个客户端一起工作,但问题实际上是在我的 Web 服务器上运行它并让它永远等待连接。

帮我!~机会

4

4 回答 4

1

一方面,您的服务器将处理多个客户端,但一次只能处理一个。这对于基于请求-响应的服务器(如 HTTP 服务器)来说并不是那么糟糕。在您的情况下,您可能希望与每个客户端保持开放连接。

您可能想看看SocketServer库。这个库将帮助您创建一个同时处理多个客户端的服务器。为此,您可以使用 ThreadingMixin。

为这个库提供的示例非常类似于聊天服务器,因此您可以将其用作您自己的代码的基础。

在服务器中,您需要创建已连接客户端的列表。您应该创建一个 RequestHandlder,它将在无限循环中从客户端读取传入数据。从客户端接收到数据后,它应该将数据发送给列表中的所有其他客户端。

于 2012-09-15T19:22:33.030 回答
1

注意:这是指初始代码示例,而不是后续注释。

因此,不确定您从哪个文档中提取了此代码示例。如果您可以包含指向该链接的链接,那就太好了。

我认为您可能需要更改此行:

if not data: continue

对此:

if not data: break

我记得“继续”将放弃执行剩余的语句并立即将您带回循环的顶部,而“中断”将带您到循环的底部,这应该允许其余逻辑关闭连接以完成其工作。

据我所知,这将允许一个连接,然后在随后的连接尝试中似乎没有做任何事情。我想这就是你所说的“永远奔跑”的意思。就像在运行,但似乎没有响应后续请求,不是吗?

于 2012-09-16T02:23:14.910 回答
0

简单的问题。1)您的嵌套 while 循环没有结束。因此,您将只接收来自一个客户端的数据。2)您可能需要为每个新连接使用单独的线程。就像是:

While True:
    if new_connection:
        launch_new_thread_for_it

3)记得在客户端断开连接时发现情况!如果客户不在,检查是否有新数据是没有意义的。

于 2012-09-15T19:24:13.873 回答
0

要解决多客户端问题:

#!/usr/bin/env python

import threading
import socket

clients = {}

class ClientThread(threading.Thread):
    def __init__(self, conn, addr):
        threading.Thread.__init__(self)
        self.conn = conn
        self.addr = addr
        print("Connected to", str(self))
    def __str__(self):
        return "{0}:{1}".format(*self.addr)
    def run(self):
        while True:
            try:
                data = self.conn.recv(256)
            except socket.error:
                print("Disconnected from", str(self))
                break
            if not data: continue
            k = str(data, "UTF-8")
            print(k)
            if k.startswith("LOGN"):
                name = k.split()[1]
                clients[name] = self
                self.conn.send(bytes("[SVR] Logged in as @" + name + "\n", "UTF-8"))
            elif k == "QUIT": break
        conn.close()

TCP_IP = '127.0.0.1'
TCP_PORT = 9090
BUFFER_SIZE = 256

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
while True:
    conn, addr = s.accept()
    ClientThread(conn, addr).start()

但我仍然不知道如何在我的网站上运行它。

于 2012-09-15T20:38:42.820 回答