简体   繁体   English

Python非阻塞对等聊天socket.error:[Errno 32]管道损坏

[英]Python Non-blocking peer to peer chat socket.error: [Errno 32] Broken pipe

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 但是对于服务器端,当我想发送消息时,第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()

You should use accept() . 您应该使用accept() It seems newSocket is not ready to output when you try to .send() with it. 尝试使用.send()时,似乎newSocket尚未准备好输出。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 socket.error:[Errno 32]管道破裂 - socket.error: [Errno 32] Broken pipe Python socket.error:[Errno 32]管道损坏 - Python socket.error: [Errno 32] Broken pipe Python socket.error:[Errno 104]由peer重置连接 - Python socket.error: [Errno 104] Connection reset by peer Python 处理 socket.error: [Errno 104] Connection reset by peer - Python handling socket.error: [Errno 104] Connection reset by peer 带有Java客户端的python套接字服务器-socket.error:[Errno 32]管道损坏 - python socket server with java client - socket.error: [Errno 32] Broken pipe Python socket.send() 只能发送一次,然后 socket.error: [Errno 32] Broken pipe 发生 - Python socket.send() can only send once, then socket.error: [Errno 32] Broken pipe occurred Python套接字ConnectionResetError:[Errno 54]对等方与socket.error的连接重置:[Errno 104]对等方重置连接 - Python socket ConnectionResetError: [Errno 54] Connection reset by peer vs socket.error: [Errno 104] Connection reset by peer MRJob:socket.error:[Errno 104]通过对等方重置连接 - MRJob: socket.error: [Errno 104] Connection reset by peer Python请求/ urllib2 socket.error:[Errno 104]对等重置连接 - Python requests / urllib2 socket.error: [Errno 104] Connection reset by peer socket.error:[Errno 54]由对等Selenium-python重置连接 - socket.error: [Errno 54] Connection reset by peer Selenium-python
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM