Python服务器 - 客户端

时间:2014-12-11 22:14:01

标签: python networking

我需要一些帮助。我有一个简单的服务器:

host="localhost"                
port=4447

from socket import *                
import thread

def func():
    while 1:
        data = conn.recv(1024)
        if not data: 
            continue
        else: 

            print("%s said: %s")%(player, data)

    conn.close()

s=socket(AF_INET, SOCK_STREAM)
s.bind((host,port))                  


s.listen(2)                 
print("Waiting for clients on localhost, port %s")%port
while 1:
    conn, addr = s.accept()
    player = addr[1]
    print(conn)
    thread.start_new_thread(func,())

一个简单的客户:

import socket

TCP_IP = '127.0.0.1'
TCP_PORT = 4447

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))

while 1:
    data = raw_input("Input: ")
    s.send(data)

因此,当我连接到服务器时,我可以输入任何内容,然后将其打印在服务器的终端中。当我打开另一个终端并启动第二个客户端时,我也可以输入任何内容并将其发送到服务器,但当我回到第一个客户端的终端并输入多个消息时,它会返回:

Traceback (most recent call last):
  File "Client.py", line 18, in <module>
    s.send(data)
socket.error: [Errno 32] Broken pipe

所以我通过在conn中添加func()作为参数来修复此问题,但我不明白为什么会发生此错误?有人可以向我解释一下吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您的func除了需要更好的名称外,还会在程序中使用全局状态与客户端进行通信。无论您开始处理客户端连接多少线程,仍然只有一个全局conn变量。每次新客户端连接时,主线程循环都会将conn重新绑定到新连接。抛弃旧套接字并由Python运行时自动关闭。

您可以通过删除使用全局变量来跟踪每个连接状态来解决此问题。不过,更好的探索途径是Twisted