title: Python Sockets Errno 107: Transport Endpoint is not Connected
body: <p><strong>Edit:</strong> There is a very goos reason that the term RTFM exists. Reading the ... Manual works. If I had actually read the manual, I would have known that socket.accept() produces a client socket, to be used for the purpose of communication with the client. Apparently you are supposed to use that!</p>
  
  <p>I am writing a simple chat program in Python using sockets. My code so far is below (I'm para-coding, the real thing is too long).</p>
  
  <p><strong>Server Class and Imports:</strong></p>
  
  <pre><code>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 + ' &gt; '))
              send_bufr = '!dmsg :' + self.name + ' ' + user_input + '\r\n'
              self.client.send(bytearray(send_bufr, 'utf-8'))
  </code></pre>
  
  <p>I will omit the Client class as it's the same thing except for it connects with:</p>
  
  <pre><code>    self.client_socket.connect((self.host,self.port))
  </code></pre>
  
  <p>rather than accepting connections like the server. It sends input with an identical method to self.discourse in the server. The DisplayMessage class is below. It starts as it's own thread and is where the error occurs (only on the server, not the client).</p>
  
  <pre><code>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 
  </code></pre>
  
  <p>The error occurs on this line:</p>
  
  <pre><code>recv_bufr = (recv_bufr + 
               self.socket.recv(1024).decode('utf-8'))
  </code></pre>
  
  <p>but only when the server class is using the DisplayMessage class. I apologize for the length of this question. I wanted to post too much code rather than too little. Thanks.   </p>