Python套接字Errno 107:传输端点未连接

时间:2011-04-06 20:45:04

标签: python sockets tcp

编辑:存在一个非常糟糕的原因,即术语RTFM存在。阅读...手册有效。如果我实际上已经阅读过本手册,我就会知道socket.accept()会生成一个客户端套接字,用于与客户端进行通信。显然你应该使用它!

我正在使用套接字在Python中编写一个简单的聊天程序。到目前为止我的代码在下面(我是编码,真实的东西太长了。)

服务器类和导入:

import socket
import os
import socket
from subprocess import Popen, PIPE
import threading

class Server:
    def __init__(self,name,port=5001):
        self.name = name
        self.port = port
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_socket.bind(('',self.port))
        self.server_listen()

    def server_listen(self):
        self.server_socket.listen(5)
        while 1:
            self.client, self.address = self.server_socket.accept()
            self.discourse()

    def discourse(self):
        DisplayMessages(self.server_socket).start() #This is defined below
        while 1:
            #This sends messages to the client, also listening with DisplayMessages
            user_input = str(input(self.name + ' > '))
            send_bufr = '!dmsg :' + self.name + ' ' + user_input + '\r\n'
            self.client.send(bytearray(send_bufr, 'utf-8'))

我将省略Client类,因为它连接的是相同的东西:

    self.client_socket.connect((self.host,self.port))

而不是接受像服务器这样的连接。它使用与服务器中的self.discourse相同的方法发送输入。 DisplayMessage类如下所示。它以它自己的线程开始,并且是发生错误的地方(仅在服务器上,而不是客户端)。

class DisplayMessages(threading.Thread):
def __init__(self, socket):
    self.pipe = '/tmp/pyimPipe'
    if not os.path.exists(self.pipe):
        os.mkfifo(self.pipe)
    self.term = Popen(['xterm','-e','cat', self.pipe])
    self.pipe_interface = open(self.pipe, 'w', 1)
    self.socket = socket
    threading.Thread.__init__(self)

def run(self):
    self.display()

def display(self):
    recv_bufr = ''
    while 1:
        recv_bufr = (recv_bufr + 
                     self.socket.recv(1024).decode('utf-8'))
        messages = recv_bufr.split('\n')
        recv_bufr = messages.pop()

        for line in messages:
            line = line.rstrip()
            if line.find('!dmsg') != -1:
                self.message(line)
            else:
                print("Alert: Broken Message Recieved")

def message(self, line):
    message = line.split(':')[1:]
    if len(message) != 1:
        message = ':'.join(message)
    else:
        message = message[0]
    sender_name = message.split()[0]
    message = message.split()[1:]
    if len(message) != 1:
        message_text = ''
        for bit in message:
            message_text = message_text + ' ' + bit
    else:
        message_text = message[0]
    wrt_bufr = str(sender_name) + ':' + ' ' + message_text.strip() + '\n'
    self.pipe_interface.write(wrt_bufr)
    self.pipe_interface.flush()


def alert(self):
    pass 

此行发生错误:

recv_bufr = (recv_bufr + 
             self.socket.recv(1024).decode('utf-8'))

但仅在服务器类使用DisplayMessage类时。我为这个问题的长度道歉。我想发布太多代码而不是太少。谢谢。

0 个答案:

没有答案