基于简单的Python聊天程序

我正在编写一个简单的基于套接字的聊天程序,它允许服务器向客户端发送和接收消息。 客户端可以发送消息给服务器,但是当我尝试从服务器发送消息时,它会崩溃,说'文件'对象的属性为'recv'。

Server.py

import socket
import os
import select
import sys

def prompt():
    sys.stdout.write('<You> ')
    sys.stdout.flush()

try:
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except:
    print 'Failed to create socket'
    sys.exit()

PORT = 9050
HOST = '127.0.0.1'
RECV_BUFFER = 4096

server_socket.bind((HOST, PORT))
server_socket.listen(10)

input = [server_socket, sys.stdin]

print 'Chat Program'
prompt()

while 1:

    inputready, outputready, exceptready = select.select(input,[],[])

    for sock in inputready:

        if sock == server_socket:
            client, address = server_socket.accept()
            input.append(client)
            #data = sock.recv(RECV_BUFFER)
            #if data:
                #sys.stdout.write(data)
        else:
            data = sock.recv(RECV_BUFFER)
            if data:
                sys.stdout.write(data)
            else:
                msg = sys.stdin.readline()
                server_socket.send('r<Server>: ' + msg)
                prompt()



server_socket.close()

Client.py

import socket
import os
import select
import sys

def prompt():
   sys.stdout.write('<You> ')
   sys.stdout.flush()

HOST = '127.0.0.1'
PORT = 9050
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
    print 'Failed to create socket'
    sys.exit()

s.connect((HOST, PORT))

print 'Connected to remote host. Start sending messages'
prompt()

while 1:

    socket_list = [sys.stdin, s]

    read_sockets, write_sockets, error_sockets = select.select(socket_list, [], [])

    for sock in read_sockets:
        if sock == s:
            data = sock.recv(4096)
            if not data:
                print 'nDisconnected from chat server'
                sys.exit()
            else:
                sys.stdout.write(data)
                prompt()
        else:
            msg = sys.stdin.readline()
            s.send('r<Client>: ' + msg)
            prompt()

那么,在你的服务器上你正在做(缩写)

input = [server_socket, sys.stdin]
inputready, outputready, exceptready = select.select(input,[],[])
for sock in inputready:
    if sock == server_socket:
        ...
    else:
        data = sock.recv(RECV_BUFFER)

所以当sys.stdin ,它不是server_socket因此它转到else并尝试recv ,但它不是套接字。 stdin应该使用read not recv 。 像下面这样的结构对我来说最有意义。

if sock == server_socket:
    ...
elif sock == sys.stdin:
    data = sock.readline()
    for s in input:
        if s not in (server_socket, sys.stdin):
            s.send(data)
else:
    ...

我尝试了下面提供的链接类似的程序,但问题是select()在Windows操作系统中不受支持。

File objects on Windows are not acceptable, but sockets are. On
Windows, the underlying select() function is provided by the WinSock
library, and does not handle file descriptors that don’t originate
from WinSock.

http://www.binarytides.com/code-chat-application-server-client-sockets-python/

链接地址: http://www.djcxy.com/p/71509.html

上一篇: based simple python chat program

下一篇: Qt UI testing: How to simulate a click on a QMenuBar item using QTest?