python界面编程和网口通信_Python—网络通信编程之tcp通信编程
服務端代碼
import socket
# 1.創建流式套接字實例
# server = socket.socket()
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
# 2.使用bind方法綁定端口號。服務端綁定的ip和port(參數是元組)
server.bind(("127.0.0.1", 8832))
# 3.調用listen方法監聽,并指定最大的連接數量。設置監聽套接字,創建監聽隊列
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 設置端口重用
server.listen(5)
# 4.等待客戶端鏈接
while True:
print("正在等待客戶端鏈接...")
conn, addr = server.accept()
print("client connent...{0}:{1}".format(addr[0], addr[1]))
# python3.x以上,網絡數據的發送接收都是byte類型,如果發送的數據是str類型的則需要進行編碼.
conn.send(("連接成功,服務端端口:%s,客戶端端口:%s" % (8832, addr[1])).encode())
# 5.收發消息
while True:
data = conn.recv(1024) # 接收客戶端發來的消息
# if not data or data.decode("utf-8") == "exit":
if not data or data == b"exit":
break
print(data.decode())
conn.send(("服務端返回信息:%s" % data.decode()).encode()) # 處理客戶端數據
conn.close() # 主動關閉連接
# 6.關閉套接字
server.close()
知識點1:設置端口重用:server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)。
知識點2:conn, addr = server.accept()的返回值是一個元組:返回的conn代表一個新的套接字用來和客戶端通信。返回的addr是連接的客戶端的地址(也是元組,包含ip與端口)。
知識點3:發送send()函數,與接收recv()函數,操作的都是字節串。recv()函數是阻塞函數。
客戶端代碼
import socket
# 1.socket實例初始化
# client = socket.socket()
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.發起連接:根據服務端綁定的ip和端口,進行連接訪問服務端
client.connect(("127.0.0.1", 8832))
# 3.與服務端交互,接收發送信息
while True:
data = client.recv(1024) # 接收主機信息
print(data.decode()) # 打印接收的數據,此處的byte類型數據特指python3.x以上
msg = input("請輸入要發送的信息...")
client.send(msg.encode())
if not msg or msg == "exit":
break
# 4.關閉套接字
client.close()
1.服務端與客戶端可以一直通信,收發消息。直到客戶端輸入"exit",客戶端退出,服務端等待下一個客戶端連接。
2.當第一個客戶端與服務端一直連著的時候,第二個客戶端無法與服務器連接。直到第一個客戶端退出與服務器的連接,第二個客戶端才能與服務器連接。
3.當第一個客戶端退出時,服務器會立馬連接第二個客戶端。第二個客戶端之前發的信息,服務器就會收到,并返回信息。可能第二個發送端發的信息都在發送緩沖區里。
封裝服務端代碼
import socket, threading
class Server():
# 創建socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
# 綁定端口號
server.bind(("127.0.0.1", 3120))
# 調用listen()方法監聽端口,并限制最大數量連接
server.listen(5)
def tcpLink(self, sock, addr):
print('Connection from %s:%s' % addr)
sock.send(b'Welcome...')
while True:
data = sock.recv(1024)
if not data or data.decode("utf-8") == "exit":
break
print(data.decode())
sock.send(('Received data:{0}'.format(data.decode())).encode())
sock.close()
def tcpServer(self):
while True:
sock, addr = self.server.accept() # 接受一個連接
t = threading.Thread(target=self.tcpLink, args=(sock, addr))
t.start()
if __name__ == "__main__":
tcpserver = Server()
tcpserver.tcpServer()
封裝客戶端代碼
import socket
class Client():
# 建立一個連接,指定TCP方式
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
# 連接服務端的3120端口
client.connect(("127.0.0.1", 3120))
print(client.recv(1024).decode('utf-8'))
def tcpClient(self):
while True:
msg = input("請輸入要發送的信息...")
self.client.send(msg.encode())
if not msg or msg == "exit":
break
data = self.client.recv(1024)
print(data.decode())
if __name__ == "__main__":
tcpclient = Client()
tcpclient.tcpClient()
總結
以上是生活随笔為你收集整理的python界面编程和网口通信_Python—网络通信编程之tcp通信编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据集获取方式和数据加强方式
- 下一篇: python保存模型_MNIST数据集训