首頁 > 軟體

Python基於socket實現TCP使用者端和伺服器端

2022-04-11 22:00:23

一、基於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()

到此這篇關於Python基於socket實現TCP使用者端和伺服器端的文章就介紹到這了,更多相關socket實現 TCP使用者端和伺服器端內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com