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

时间:2014-11-28 08:47:05

标签: python sockets

我使用这个聊天服务器/客户端我在尝试运行客户端时出现问题 我在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 个答案:

答案 0 :(得分:0)

来自select doc

的引用
  

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

也许问题来自于Windows的限制。

编辑

这确认了Windows上的问题:

  

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

     

允许空序列,但接受三个空序列是平台相关的。 (众所周知,它可以在Unix上运行,但不能在Windows上运行。)

您应该看到doc的Note部分,它提供了WinSock Library的解决方法: https://docs.python.org/2/library/select.html?highlight=select#select.select