2013-05-13 6 views
7

मैं एक साधारण सॉकेट-आधारित चैट प्रोग्राम लिख रहा हूं जो सर्वर को क्लाइंट को संदेश भेजने और प्राप्त करने की अनुमति देता है। ग्राहक सर्वर को संदेश भेज सकता है लेकिन जब मैं सर्वर से संदेश भेजने का प्रयास करता हूं, तो यह कहता है कि 'फ़ाइल' ऑब्जेक्ट्स में '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() 
+0

इसका कारण यह है कि यह एक सर्वर है सहकर्मी सहकर्मी नहीं है – ioanD

उत्तर

4

खैर, अपने सर्वर में आप कर रहे हैं (संक्षिप्त)

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 पर जाता है औरपर जाता है, लेकिन यह एक सॉकेट नहीं है। stdinreadrecv का उपयोग नहीं करना चाहिए। नीचे दिए गए की तरह संरचना मुझे सबसे ज्यादा समझ में आता है।

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 से हाथ कुछ: अगर जुर्राब == stdin: msg = sys .stdin.readline() server_socket.send() प्रॉम्प्ट() – jtd92

+0

निश्चित रूप से, 'stdin' प्रसंस्करण अलग रखने के किसी भी तरीके से अलग – cmd

+0

ठीक है अब मैं server_socket.send (' \ r ) से टूटी पाइप त्रुटि [Errno 32] प्राप्त कर रहा हूँ : '+ msg)। क्या मुझे क्लाइंट से सर्वर से कनेक्ट करने की ज़रूरत है? धन्यवाद – jtd92

0

मैं नीचे दिए गए लिंक से कार्यक्रम के समान प्रकार की कोशिश की, लेकिन समस्या select() विंडोज़ ऑपरेटिंग सिस्टम में समर्थित नहीं था।

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/

संबंधित मुद्दे