0

Hi i write simple chat program for peer to peer chat between server and client. This code is working for Client side and client can send message and server recives that messages. but for server side when i want to send a message i have error in line 40

  File "server.py", line 40, in <module>
    newSocket.send('\r<Server>: ' + msg)
    socket.error: [Errno 32] Broken pipe

and server crashes.

Server :

import socket
import os
import select
import sys

def prompt():
    sys.stdout.write('Server :  ')
    sys.stdout.flush()

try:
    newSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    newSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
except:
    print 'socket Error'
    sys.exit(1)

newSocket.bind(('127.0.0.1', 8000))
newSocket.listen(5)

input_list = [newSocket, sys.stdin]

print 'Chat Program'
prompt()

while True:

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

    for sock in inputready:

        if sock == newSocket:
            (client, (ip, port)) = newSocket.accept()
            input_list.append(client)
            data = client.recv(2048)
            if data:
                sys.stdout.write(data)

        elif sock == sys.stdin:
            msg = sys.stdin.readline()
            newSocket.send('\r<Server>: ' + msg)
            prompt()

        else:
            data = sock.recv(2048)
            if data:
                sys.stdout.write(data)

newSocket.close()

client :

import socket
import os
import select
import sys

def prompt():
   sys.stdout.write('Client ')
   sys.stdout.flush()


try:
    newSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    newSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
except:
    print 'socket Error'
    sys.exit(1)


newSocket.connect(('127.0.0.1', 8000))

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

while 1:

    socket_list = [sys.stdin, newSocket]

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

    for sock in read_sockets:
        if sock == newSocket:
            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()
            newSocket.send('\r<Client>: ' + msg)
            prompt()
rezakamalifard
  • 1,289
  • 13
  • 24

2 Answers2

1

You should use accept(). It seems newSocket is not ready to output when you try to .send() with it.

Ofir Israel
  • 3,785
  • 2
  • 15
  • 13
  • I accept connection but it seems to be not connected and doesn't do anything elif sock == sys.stdin: (client, (ip, port)) = newSocket.accept() msg = sys.stdin.readline() client.send('\r: ' + msg) prompt() – rezakamalifard Sep 13 '13 at 14:54
0

I change Server code to this and problem has been solved:

import socket
import select
import sys

CONNECTION_LIST = []
RECV_BUFFER = 4096
PORT = 1245

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('0.0.0.0', PORT))
server_socket.listen(5)

CONNECTION_LIST.append(server_socket)
CONNECTION_LIST.append(sys.stdin)


print 'Chat server Started on port ' + str(PORT)


def broadcast_data(sock, message):

    for socket in CONNECTION_LIST:
        if socket != server_socket and socket != sock and socket != sys.stdin:
            try:
                socket.send(message)
            except:
                socket.close()
                CONNECTION_LIST.remove(socket)

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

prompt()

while True:
    read_sockets, write_sockets, error_sockets = select.select(CONNECTION_LIST, [], []) # NON_blocking I/O with 0

    for sock in read_sockets:
        if sock == server_socket:
            # new Connection
            sockfd, addr = server_socket.accept()
            CONNECTION_LIST.append(sockfd)
            print 'Clinet (%s, %s) connected ' % addr
            broadcast_data(sockfd, "[%s:%s] entered room" % addr)
        elif sock == sys.stdin:
            msg = sys.stdin.readline()
            broadcast_data(sock, 'Server > ' + msg)
            prompt()
        else:
            try:
                #In Windows, sometimes when a TCP program closes abruptly,
                # a "Connection reset by peer" exception will be thrown
                data = sock.recv(RECV_BUFFER)
                if data:
                    print "\r" + '<' + str(sock.getpeername()) + '>' + data
                    broadcast_data(sock, "\r" + '<' + str(sock.getpeername()) + '>' + data)
            except:
                broadcast_data(sock, "Client (%s, %s) is offline" % addr)
                print "Client (%s, %s) is offline" % addr
                sock.close()
                CONNECTION_LIST.remove(sock)
                continue
rezakamalifard
  • 1,289
  • 13
  • 24