python中的聊天服务器/客户端

Posted

技术标签:

【中文标题】python中的聊天服务器/客户端【英文标题】:chat server/client in python 【发布时间】:2014-11-28 08:47:05 【问题描述】:

我使用此聊天服务器/客户端尝试运行客户端时遇到问题 我在 windows 下为该行使用 python 3.4

ready_to_read,ready_to_write,in_error = select.select(socket_list , [], [])

WinError 10038 尝试对非套接字的操作进行操作

当我更改此行 socket_list = [sys.stdin,s] to socket_list = [s] 时错误消失但程序不会等待来自客户端的输入

有什么想法吗?

这是代码

# chat_client.py

import sys
import socket
import select

def chat_client():
    #if(len(sys.argv) < 3) :
      #  print ('Usage : python chat_client.py hostname port')
      #  sys.exit()

    host = 'localhost'
    port = 10000

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(2)

    # connect to remote host
    try :
        s.connect((host, port))
    except :
        print ('Unable to connect')
        sys.exit()

    print ('Connected to remote host. You can start sending messages')
    sys.stdout.write('[Me] '); sys.stdout.flush()
    prompt()
    while 1:
        socket_list = [sys.stdin,s]

        # Get the list sockets which are readable
        ready_to_read,ready_to_write,in_error = select.select(socket_list , [], [])

        for sock in ready_to_read:
            print('tset')
            if sock == s:
                # incoming message from remote server, s
                data = sock.recv(4096)
                if not data :
                    print ('\nDisconnected from chat server')
                    sys.exit()
                else :
                    #print data
                    sys.stdout.write(data)
                    sys.stdout.write('[Me] '); sys.stdout.flush()     

            else:
                print('tset')
                # user entered a message
                #msg= input()
                msg = sys.stdin.readline()
                s.send(msg)
                sys.stdout.write('[Me] '); sys.stdout.flush() 

if __name__ == "__main__":

    sys.exit(chat_client())

【问题讨论】:

【参考方案1】:

引用select doc

请注意,在 Windows 上,它仅适用于套接字;在其他操作系统上,它也适用于其他文件类型(特别是在 Unix 上,它适用于管道)。它不能用于常规文件来确定文件自上次读取后是否已增长。

可能问题出在windows的限制上。

编辑

这证实了windows上的问题:

select.select(rlist, wlist, xlist[, timeout])

允许空序列,但接受三个空序列取决于平台。 (众所周知,它可以在 Unix 上工作,但不能在 Windows 上工作。)

您应该看到文档的注释部分,该部分提供了 WinSock 库的解决方法: https://docs.python.org/2/library/select.html?highlight=select#select.select

【讨论】:

我正在使用空序列并且它工作以及在删除 system.stdin 时我很困惑我应该做什么。你说的库不能导入?? 这在您删除 sys.stdin 时起作用,因为这是 windows 不接受的。 也许您应该尝试input = sys.stdin.readline()socket.send(input) 发送您的信息。我不习惯使用套接字,所以我不确定它是否有效

以上是关于python中的聊天服务器/客户端的主要内容,如果未能解决你的问题,请参考以下文章

Python聊天室

Python实现多用户全双工聊天(一对一)

具有客户端-服务器架构的聊天应用程序使用啥? [关闭]

在Python中使用select()方法进行客户端/服务器聊天

Python socket实现服务器客户端聊天通讯

一个python程序——聊天