基于套接字的简单python聊天程序

基于套接字的简单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() 
+0

这不是点对点,因为它有一个服务器 – ioanD 2014-02-23 06:00:10

那么,在你的服务器,你正在做的(略)

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: 
    ... 
+0

所以我应该有一个声明,如果手中的东西从像keyobard: 如果袜子==标准输入:味精= SYS .stdin.readline()server_socket.send()提示() – jtd92 2013-05-13 20:45:11

+0

当然,任何方式来保持'stdin'处理分开 – cmd 2013-05-13 20:47:53

+0

好吧现在我正在从server_socket.send('\ r :'+ msg)。我需要从服务器连接到客户端吗?谢谢 – jtd92 2013-05-13 20:55:26

我试图从下面提供的链接相似类型的节目,但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/