基于套接字的简单python聊天程序
问题描述:
我正在写一个简单的基于套接字的聊天程序,它允许服务器向客户端发送和接收消息。客户端可以发送消息给服务器,但是当我尝试从服务器发送消息时,它会崩溃,说'文件'对象的属性为'recv'。基于套接字的简单python聊天程序
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
而不是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/
这不是点对点,因为它有一个服务器 – ioanD 2014-02-23 06:00:10