日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python Socket模块实现服务端与客户端通信

發布時間:2023/12/20 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python Socket模块实现服务端与客户端通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Socket是TCP/IP提供的外部編程接口,是對TCP/IP的封裝和應用。

Socket被稱作“套接字”,用于描述IP地址和端口,是一個通信、鏈的句柄,可以實現不同虛擬機 或不同計算機之間的通信。網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,應用程序通過“套接字”向網絡發出請求或者應答網絡請求。

Socket模塊的主要目的是幫助在網絡上的兩個程序之間建立信息通道。在Python中提供了兩個基本的Socket模塊:服務端Socket客戶端Socket

當創建一個服務端Socket之后,這個Socket就會在本機的一個端口上等待連接,客戶端Socket會訪問這個端口,當兩者完成連接之后,就可以進行交互了。

使用Socket編寫一個簡單的服務端和客戶端

多線程服務端程序:

# -*- coding: UTF-8 -*- import socket # 導入 socket 模塊 import threading# 處理客戶端的請求操作 def handle_client_request(service_client_socket, ip_port):# 循環接收客戶端發送的數據while True:# 接收客戶端發送的數據recv_data = service_client_socket.recv(1024)# 容器類型判斷是否有數據可以直接使用if語句進行判斷,如果容器類型里面有數據表示條件成立,否則條件失敗# 容器類型: 列表、字典、元組、字符串、set、range、二進制數據if recv_data:message = recv_data.decode()print(message)print(ip_port)# 回復service_client_socket.send("已接收...".encode())else:print("客戶端下線了:", ip_port)print()break# 終止和客戶端進行通信service_client_socket.close()if __name__ == '__main__':# 創建tcp服務端套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 設置端口號復用,讓程序退出端口號立即釋放tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 綁定端口號tcp_server_socket.bind(("", 9090))# 設置監聽, listen后的套接字是被動套接字,只負責接收客戶端的連接請求tcp_server_socket.listen(128)# 循環等待接收客戶端的連接請求while True:# 等待接收客戶端的連接請求service_client_socket, ip_port = tcp_server_socket.accept()print("客戶端連接成功:", ip_port)# 當客戶端和服務端建立連接成功以后,需要創建一個子線程,不同子線程負責接收不同客戶端的消息sub_thread = threading.Thread(target=handle_client_request, args=(service_client_socket, ip_port))# 設置守護主線程sub_thread.setDaemon(True)# 啟動子線程sub_thread.start()# tcp服務端套接字可以不需要關閉,因為服務端程序需要一直運行# tcp_server_socket.close()

客戶端程序:

# -*- coding: UTF-8 -*- import socket # 導入 socket 模塊if __name__ == '__main__':sk = socket.socket() # 創建 socket 對象host = socket.gethostname() # 獲取本地主機名port = 9090 # 設置端口號sk.connect((host, port))message = "connect······"sk.sendall(message.encode())print(sk.recv(1024).decode())i = 0while True:try:message = input(">>>")sk.send(message.encode())print(sk.recv(1024).decode())except KeyboardInterrupt:breaksk.close()

運行結果:

Socket實例化

格式:

sk = socket.socket(family,type[,protocal])

family:地址族,常用地址族有AF_INET、AF_INET6、AF_LOCAL(或稱AF_UNIX、UNIX域Socket)、AF_ROUTE等。默認為AF_INET,通常使用默認即可。

type:Socket類型
SOCK_STREAM,TCP類型(默認)
SOCK_DGRAM,UDP類型
SOCK_RAM,原始類型,允許對底層協議如IP或ICMP進行直接訪問,基本用不到。

protocol:可選項,使用的協議,通常賦值“0”,由系統自動選擇。

Socket常用函數

  • bind()
    服務端 Socket調用,將之前創建Socket與指定的IP地址和端口進行綁定。
  • sk.bind(("127.0.0.1",9090))
  • listen()
    用于在使用TCP的服務端開啟監聽模式。
  • #服務端開啟一個監聽,最大連接數為5 sk.listen(128)
  • accept()
    用于在使用TCP的服務端接收連接,一般是阻塞態。接受TCP連接并返回(conn, adress),其中conn為新的套接字對象,可以用來接收和發送數據,address為連接客戶端的地址。
  • socket_new, port = sk.accept()
  • connect()
    用于在使用TCP的客戶端去連接服務端時使用
  • sk.connect(("127.0.0.1", 9090))
  • send()
    用于在使用TCP時發送數據,可能未將指定的內容全部發送。
  • sk.send(string[,flag]) #返回值是發送字節數量
  • sendall()
    用于在使用TCP時發送數據,完整發送TCP數據。
  • # 發送一段字符到Socket sk.sendall("Hello!".encode()) # 成功返回None,失敗拋出異常
  • recv()
    用于使用TCP接收數據。
  • sk.recv(bufsize[,flag]) # bufsize指定最多可以接收的數量
  • sendto()
    用于使用UDP時發送數據

  • recvfrom()
    UDP專用,接收數據,返回遠端的IP地址和端口

  • close()
    關閉Socket

  • 總結

    以上是生活随笔為你收集整理的Python Socket模块实现服务端与客户端通信的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。