Easy to use socket based python program

I am writing a simple socket-based chat program that allows a server to send and receive a message to a client. The client can send messages to the server, but when I try to send a message from the server, it displays a message that the "file" objects have the attribute "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() 
+7
source share
2 answers

Ok, on your server you do (abbreviated)

 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) 

So, when something goes into sys.stdin , its not server_socket , so it goes into else and tries to recv , but it is not a socket. stdin should use read not recv . A structure like the one below is of the utmost importance to me.

 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: ... 
+4
source

I tried a similar type of program from the link below, but the problem was select() not supported on the Windows operating system.

 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/

0
source

All Articles