编辑:存在一个非常糟糕的原因,即术语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类时。我为这个问题的长度道歉。我想发布太多代码而不是太少。谢谢。