日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python基于socket實現TCP客戶端和服務端_python

作者:程序員班長 ? 更新時間: 2022-06-12 編程語言

一、基于socket實現的TCP客戶端

import socket
?
# 建立socket對象
# 參數一表示IP地址類型(AF_INET為IPV4,AF_INET6為IPV6),參數二表示連接的類型(SOCK_STREAM表示TCP形式,SOCK_DGRAM表示UDP形式)
client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) ?# 代表(ipv4,TCP)
?
# 連接服務器(元組中填目標ip地址和端口號)
client_socket.connect(('127.0.0.1',7777))
# 準備數據,需要轉換為二進制數據,encode()中填寫的是本地的字符串編碼格式,mac、linux填utf-8
data='hello'.encode('gbk')
# 向服務器發送數據
client_socket.send(data)
# 接收數據,必須要指定接收數據的大小,單位字節,最大4096,即4k
recv_data=client_socket.recv(1024)
# 接收的數據要進行decode()解碼,發送的時候用啥編碼就填啥編碼
recv_data=recv_data.decode('gbk')
print(recv_data)
# 關閉連接
client_socket.close()

二、基于socket實現的TCP服務端

import socket
# 建立socket對象
server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 如果服務器是一次性的,如果服務器結束后馬上重新啟動會出現一個錯誤,原因是地址和端口沒有被釋放
# OSError: [Errno 48] Address already in use
# 如果想馬上釋放,要設置一下socket選項
server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
# 綁定IP和端口,如果在綁定IP時沒有給定IP,默認是綁定本地IP
server_socket.bind(('',7777))
# 設置監聽(最大監聽數),設置完后服務端會進入被動模式,不能主動連接客戶端,只能被動地等待客戶端的連接
server_socket.listen(128)
# 等待客戶端連接,連接上后,函數會返回客戶端的Socket對象和地址信息
client_socket,ip_port=server_socket.accept()
print(f'客戶端{ip_port[0]}使用端口{ip_port[1]}連接成功...')
# 接收客戶端數據
data=client_socket.recv(1024)
# 查看客戶端發送的數據長度
if len(data)!=0:
? ? data=data.decode('gbk')
? ? print(f'客戶端{ip_port[0]}使用端口{ip_port[1]}發送是數據是{data}')
else:
? ? print(f'客戶端{ip_port[0]}使用端口{ip_port[1]}關閉了連接')
?
# 給客戶端發送數據
data='你好'.encode('gbk')
client_socket.send(data)
# 關閉客戶端
client_socket.close()
# 關閉服務端
server_socket.close()

三、socket實現的多任務版TCP服務端

import socket
import threading
?
?
def client_task(client_socket,ip_port):
? ? print(ip_port,'加入連接')
? ? # 持續接收客戶端的消息
? ? while True:
? ? ? ? data=client_socket.recv(1024).decode('gbk')
? ? ? ? if len(data)!=0:
? ? ? ? ? ? print(f'客戶端{ip_port[0]}發來的信息是{data}')
? ? ? ? else:
? ? ? ? ? ? print(f'客戶端{ip_port[0]}已經斷開連接')
? ? ? ? ? ? break
? ? ? ? send_data=('Hello--'+data).encode('gbk')
? ? ? ? client_socket.send(send_data)
?
?
if __name__ == '__main__':
? ? server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
? ? server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
? ? server_socket.bind(('',7777))
? ? server_socket.listen(128)
? ? # 循環接收客戶連接
? ? while True:
? ? ? ? client_socket,ip_port=server_socket.accept() ? ?# 會一直等待接收連接
? ? ? ? t_client=threading.Thread(target=client_task,args=(client_socket,ip_port))
? ? ? ? t_client.setDaemon(True)
? ? ? ? t_client.start()

1、面向對象版本

'''
基于socket實現的多任務版TCP服務端(面向對象)
'''
?
import socket
import threading
?
class SocketServer(object):
? ? def __init__(self, port):
? ? ? ? self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
? ? ? ? self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
? ? ? ? self.server_socket.bind(('', port))
? ? ? ? self.server_socket.listen(128)
?
?
? ? def start(self):
? ? ? ? # 循環接收客戶連接
? ? ? ? while True:
? ? ? ? ? ? client_socket, ip_port = self.server_socket.accept() ?# 會一直等待接收連接
? ? ? ? ? ? t_client = threading.Thread(target=self.client_task, args=(client_socket, ip_port))
? ? ? ? ? ? t_client.setDaemon(True)
? ? ? ? ? ? t_client.start()
?
? ? def client_task(self,client_socket, ip_port):
? ? ? ? print(ip_port, '加入連接')
? ? ? ? # 持續接收客戶端的消息
? ? ? ? while True:
? ? ? ? ? ? data = client_socket.recv(1024).decode('gbk')
? ? ? ? ? ? if len(data) != 0:
? ? ? ? ? ? ? ? print(f'客戶端{ip_port[0]}發來的信息是{data}')
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? print(f'客戶端{ip_port[0]}已經斷開連接')
? ? ? ? ? ? ? ? break
? ? ? ? ? ? send_data = ('Hello--' + data).encode('gbk')
? ? ? ? ? ? client_socket.send(send_data)
?
?
if __name__ == '__main__':
? ?server_socket=SocketServer(7777)
? ?server_socket.start()

原文鏈接:https://kantlee.blog.csdn.net/article/details/122665383

欄目分類
最近更新