回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我刚开始编写python。
我的目标是建造一个有三个屏幕的数码相框。因此,我使用3个Raspis,每个监视器一个。
为了这些raspi的通信,我需要编写一个服务器和一个客户端。你知道吗</p>
<p>对于第一个测试,我想构建一个服务器,它能够向多个客户机发送和接收消息。
所以我从一些socket教程开始,创建了以下程序。你知道吗</p>
<p>服务器类(TcpServer.py文件)你知道吗</p>
<pre><code>class TcpServer:
clients = []
serverIsRunning = 0
port = 0
def __init__(self, port):
self.port = port
self.serverIsRunning = 0
self.serverRunning = 0
def startServer (self):
print("start Server...")
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.bind(("", self.port))
self.server.listen(1)
self.serverRunning = 1
while self.serverRunning:
read, write, oob = select.select([self.server] + self.clients, [], [])
for sock in read:
if sock is self.server:
client, addr = self.server.accept()
self.clients.append(client)
print ("+++ Client ", addr[0], " verbunden")
else:
nachricht = sock.recv(1024)
ip = sock.getpeername()[0]
if nachricht:
print (ip, nachricht)
else:
print ("+++ Verbindung zu ", ip , " beendet")
sock.close()
self.clients.remove(sock)
for c in self.clients:
c.close()
self.clients.remove(c)
self.server.close()
def send(self, message):
message = message.encode()
self.server.send(message)
</code></pre>
<p>客户端类(TcpClient.py文件)你知道吗</p>
<pre><code>import socket
class TcpClient:
def __init__(self, ip, port):
self.serverAdress = (ip, port)
self.connected = 0
self.connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.connection.connect(self.serverAdress)
print ("connectet to ", self.serverAdress)
def send(self, message):
message = message.encode()
self.connection.send(message)
</code></pre>
<p>服务器:</p>
<pre><code>import threading
import TcpServer
tcpServer = TcpServer.TcpServer(50000)
threadTcpServer = threading.Thread(target = tcpServer.startServer)
threadTcpServer.start()
while True:
tcpServer.send(input("Nachricht eingeben: "))
</code></pre>
<p>客户:</p>
<pre><code>import threading
import TcpClient
tcpClient = TcpClient.TcpClient("192.168.178.49", 50000)
while True:
tcpClient.send(input("Nachricht eingeben: "))
</code></pre>
<p>我可以将消息从客户端发送到服务器,但是当我要将消息从服务器发送到客户端时,它会生成以下错误:</p>
<blockquote>
<p>BrokenPipeError: [Errno 32] Broken pipe</p>
</blockquote>
<p>我假设这是因为服务器线程在等待传入消息时阻塞了套接字。但我不知道怎么处理。
如何编程一个可以发送和接收消息的服务器?你能推荐一个教程吗?我没有找到一个教程来描述我的问题的解决方案。你知道吗</p>
<p><strong>编辑:</strong></p>
<p>现在我试着用socketserver库来解决这个问题,但是我仍然不能解决这个问题。
以下是我的服务器新代码:</p>
<pre><code>import socketserver
import threading
import time
class MyTCPHandler(socketserver.BaseRequestHandler):
"""
The RequestHandler class for our server.
It is instantiated once per connection to the server, and must
override the handle() method to implement communication to the
client.
"""
def handle(self):
# self.request is the TCP socket connected to the client
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
# just send back the same data, but upper-cased
self.request.sendall(self.data.upper())
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
# Create the server, binding to localhost on port 9999
server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
threadTcpServer = threading.Thread(target = server.serve_forever)
threadTcpServer.start()
print("server started")
time.sleep(10)
print("sending Data")
server.request.sendall("Server is sending...")
</code></pre>
<p>它生成错误:</p>
<blockquote>
<p>AttributeError: 'TCPServer' object has no attribute 'request'</p>
</blockquote>
<p>我的目标是用一个线程编写一个服务器,该线程接收数据,但仍然能够从另一个线程发送数据。
只有一个插座就可以吗?你知道吗</p>