两段代码分别运行
# 服务端
import sys
import json
import requests
from PyQt5.QtNetwork import QTcpServer, QHostAddress
from PyQt5.QtWidgets import QApplication, QWidget, QTextBrowser, QVBoxLayout
class Server(QWidget):
def __init__(self):
super(Server, self).__init__()
self.resize(500, 450)
# 1
self.browser = QTextBrowser(self)
self.v_layout = QVBoxLayout()
self.v_layout.addWidget(self.browser)
self.setLayout(self.v_layout)
# 2
self.server = QTcpServer(self)
if not self.server.listen(QHostAddress.LocalHost, 6666):
self.browser.append(self.server.errorString())
self.server.newConnection.connect(self.new_socket_slot)
def new_socket_slot(self):
sock = self.server.nextPendingConnection()
peer_address = sock.peerAddress().toString()
peer_port = sock.peerPort()
news = 'Connected with address {}, port {}'.format(peer_address, str(peer_port))
self.browser.append(news)
sock.readyRead.connect(lambda: self.read_data_slot(sock))
sock.disconnected.connect(lambda: self.disconnected_slot(sock))
# 3
def read_data_slot(self, sock):
while sock.bytesAvailable():
datagram = sock.read(sock.bytesAvailable())
message = datagram.decode()
answer = self.get_answer(message).replace('{br}', '\n')
new_datagram = answer.encode()
sock.write(new_datagram)
def get_answer(self, message):
payload = {'key': 'free', 'appid': '0', 'msg': message}
r = requests.get("http://api.qingyunke.com/api.php?", params=payload)
answer = json.loads(r.text)['content']
return answer
# 4
def disconnected_slot(self, sock):
peer_address = sock.peerAddress().toString()
peer_port = sock.peerPort()
news = 'Disconnected with address {}, port {}'.format(peer_address, str(peer_port))
self.browser.append(news)
sock.close()
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Server()
demo.show()
sys.exit(app.exec_())
# 客户端
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtNetwork import QTcpSocket, QHostAddress
from PyQt5.QtWidgets import QApplication, QWidget, QTextBrowser, QTextEdit, QSplitter, QPushButton, \
QHBoxLayout, QVBoxLayout
class Client(QWidget):
def __init__(self):
super(Client, self).__init__()
self.resize(500, 450)
# 1
self.browser = QTextBrowser(self)
self.edit = QTextEdit(self)
self.splitter = QSplitter(self)
self.splitter.setOrientation(Qt.Vertical)
self.splitter.addWidget(self.browser)
self.splitter.addWidget(self.edit)
self.splitter.setSizes([350, 100])
self.send_btn = QPushButton('Send', self)
self.close_btn = QPushButton('Close', self)
self.h_layout = QHBoxLayout()
self.v_layout = QVBoxLayout()
# 2
self.sock = QTcpSocket(self)
self.sock.connectToHost(QHostAddress.LocalHost, 6666)
self.layout_init()
self.signal_init()
def layout_init(self):
self.h_layout.addStretch(1)
self.h_layout.addWidget(self.close_btn)
self.h_layout.addWidget(self.send_btn)
self.v_layout.addWidget(self.splitter)
self.v_layout.addLayout(self.h_layout)
self.setLayout(self.v_layout)
def signal_init(self):
self.send_btn.clicked.connect(self.write_data_slot) # 3
self.close_btn.clicked.connect(self.close_slot) # 4
self.sock.connected.connect(self.connected_slot) # 5
self.sock.readyRead.connect(self.read_data_slot) # 6
def write_data_slot(self):
message = self.edit.toPlainText()
self.browser.append('Client: {}'.format(message))
datagram = message.encode()
self.sock.write(datagram)
self.edit.clear()
def connected_slot(self):
message = 'Connected! Ready to chat! :)'
self.browser.append(message)
def read_data_slot(self):
while self.sock.bytesAvailable():
datagram = self.sock.read(self.sock.bytesAvailable())
message = datagram.decode()
self.browser.append('Server: {}'.format(message))
def close_slot(self):
self.sock.close()
self.close()
def closeEvent(self, event):
self.sock.close()
event.accept()
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Client()
demo.show()
sys.exit(app.exec_())