python3模块socket怎么安装_Python中socket模块的使用方法(一)
socket(中文名稱:套接字)是應用層與傳輸層(TCP/UDP協議)的接口。是對TCP/IP的封裝。是操作系統的通信機制。應用程序通過socket進行網絡數據的傳輸。Python中的socket是我們常用的模塊,當然還有socketserver模塊(對socket模塊的進一步封裝)
socket 通信方式,常用的主要是兩種
TCP
UDP
下面以一個例子來介紹Socket編程。服務端文件base_socket_server.py,客戶端文件base_socket_clent.py。該例子主要介紹了socket的單連接最簡單的用法,要深入使用??春罄m文章
在使用socket模塊進行編碼之前我們先介紹一個socket的參數
family(地址簇):
socket.AF_INET IPv4(默認)
socket.AF_INET6 IPv6
socket.AF_UNIX用于單一的Unix系統進程間通信
type(類型):
socket.SOCK_STREAM 流式socket TCP協議(默認)
socket.SOCK_DGRAM 數據報式socket UDP協議
socket.SOCK_RAW 原始套接字
socket.SOCK_RDM 可靠UDP
socket.SOCK_SEQPACKET 可靠的連接數據包服務
1.socket最基本用法
服務端base_socket_server.py
# -*- coding: utf-8 -*-
# 導入socket模塊
import socket
# 創建實例
# 默認AF_INET,SOCK_STREAM可以不填寫
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 定義綁定的ip和port
ip_port = ("127.0.0.1",8000)
#綁定監聽
sk.bind(ip_port)
# 監聽
sk.listen()
print("等待接受數據..........")
# 接受數據
sock,addr = sk.accept()
# 獲取從客戶端發過來的數據
# 一次獲取1k的數據
# python3.x以上的版本。網絡數據的發送接受都是byte類型。
# 如果發送的數據是str類型則需要進行編解碼
data = sock.recv(1024)
str_data = data.decode("utf8")
print(str_data)
# 給客戶端返回數據
msg = "服務端返回的數據:"+str_data
sock.send(msg.encode())
# 主動關閉連接
sock.close()
這段代碼的意思是開啟一個socket服務,客戶端發送過來消息后。經過服務端的處理后。再返回給客戶端,然后斷開連接。接下來看客戶端的代碼。
客戶端base_socket_client.py
# -*- coding: utf-8 -*-
import socket
# 創建實例
# 默認AF_INET,SOCK_STREAM可以不填寫
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 定義綁定的ip和port
ip_port = ("127.0.0.1",8000)
#綁定監聽
client.connect(ip_port)
# 給服務器發送數據
str = input("輸入數據:")
client.send(str.encode("utf8"))
data = client.recv(1024)
print(data.decode())
client.close()
客戶端的代碼的意思是,開啟連接,連接到指定端口,用戶輸入數據發送到服務端,然后接受服務端返回的數據。最后再關閉這個連接
運行結果如下:
image
image
2.客服端連續消息發送
上面兩個文件最后都關閉了連接,我們怎么保持消息的連續發送呢?僅僅是不做關閉就可以了嗎?即使我們注釋掉base_socket_server.py文件里的st.close()。就會發現依舊是不可以的。我們怎么實現一次連接,就可以持續發送呢,我們可以在一次連接成功后做一個while true的循環,這樣我們就可以持續發送消息了。下面是對代碼的進一步改寫。
服務端base_socket_server.py改寫后的代碼
# -*- coding: utf-8 -*-
# 導入socket模塊
import socket
# 創建實例
# 默認AF_INET,SOCK_STREAM可以不填寫
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 定義綁定的ip和port
ip_port = ("127.0.0.1", 8000)
# 綁定監聽
sk.bind(ip_port)
# 監聽
sk.listen()
while True:
print("等待接受數據..........")
# 接受數據
sock, addr = sk.accept()
message = "連接成功"
sock.send(message.encode("utf8"))
while True:
# 獲取從客戶端發過來的數據
# 一次獲取1k的數據
# python3.x以上的版本。網絡數據的發送接受都是byte類型。
# 如果發送的數據是str類型則需要進行編解碼
data = sock.recv(1024)
str_data = data.decode("utf8")
print(str_data)
if str_data == "exit":
break
# 給客戶端返回數據
msg = "服務端返回的數據:" + str_data
sock.send(msg.encode("utf8"))
# 主動關閉連接
sock.close()
客戶端base_socket_client.py改寫后的代碼
# -*- coding: utf-8 -*-
import socket
# 創建實例
# 默認AF_INET,SOCK_STREAM可以不填寫
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 定義綁定的ip和port
ip_port = ("127.0.0.1", 8000)
# 綁定監聽
client.connect(ip_port)
while True:
# 接受消息
data = client.recv(1024)
print(data.decode("utf8"))
# 給服務器發送數據
input_str = input("輸入數據:")
client.send(input_str.encode("utf8"))
if input_str == "exit":
break
運行結果如下:
image
image
這樣便實現了一個用戶連續發送信息連接不斷開的要求,即使這樣當一個用戶連接的時候,另一個用戶是不能連接的。我們怎樣才能進行多連接呢?這里我們就會用到多線程了,每一個用戶連接開啟一個線程。就能保證多用戶同時連接了。
3. 多用戶連接
上面也提到了,在實際應用中,我們需要多個用戶連接的,我們可以通過開啟線程的方式進行多用戶連接
服務端middle_socket_server.py
# -*- coding: utf-8 -*-
# 導入socket、threading模塊
import socket
import threading
# 創建實例
# 默認AF_INET,SOCK_STREAM可以不填寫
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 定義綁定的ip和port
ip_port = ("127.0.0.1", 8000)
# 綁定監聽
sk.bind(ip_port)
# 監聽
sk.listen()
# 定義線程執行函數
def handle_sock(sock,addr):
message = "連接成功"
sock.send(message.encode("utf8"))
while True:
# 獲取從客戶端發過來的數據
# 一次獲取1k的數據
# python3.x以上的版本。網絡數據的發送接受都是byte類型。
# 如果發送的數據是str類型則需要進行編解碼
data = sock.recv(1024)
str_data = data.decode("utf8")
print(str_data)
if str_data == "exit":
break
# 給客戶端返回數據
msg = "服務端返回的數據:" + str_data
sock.send(msg.encode("utf8"))
# 主動關閉連接
sock.close()
while True:
print("等待接受數據..........")
# 接受數據
sock, addr = sk.accept()
client_thread = threading.Thread(target=handle_sock,args=(sock,addr))
client_thread.start()
客戶端middle_socket_client.py
# -*- coding: utf-8 -*-
import socket
# 創建實例
# 默認AF_INET,SOCK_STREAM可以不填寫
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 定義綁定的ip和port
ip_port = ("127.0.0.1", 8000)
# 綁定監聽
client.connect(ip_port)
while True:
# 接受消息
data = client.recv(1024)
print(data.decode("utf8"))
# 給服務器發送數據
input_str = input("輸入數據:")
client.send(input_str.encode("utf8"))
if input_str == "exit":
break
運行結果如下:
image
image
image
提到多連接我們不得不提另一個模塊socketserver。
4.socketserver模塊的使用
socketserver模塊是對socket的封裝。它也可以進行用戶的多連接(其內部實現源碼也使用了threading模塊)。使用起來更加方便。
服務端socketserver_socket_server.py
# -*- coding: utf-8 -*-
# 導入模塊
from socketserver import BaseRequestHandler,ThreadingTCPServer
# 定義類
class MyServer(BaseRequestHandler):
# 重寫handle方法
def handle(self):
# 定義連接對象
conn = self.request
message = "連接成功"
conn.send(message.encode())
while True:
# 接受客戶端消息
data = conn.recv(1024)
# 打印接受的消息
print(data.decode("utf8"))
#如果接受到exit的消息,則進行循環的退出
if data == b'exit':
break
conn.send(data)
conn.close()
if __name__ == "__main__":
# 創建多線程實例
server = ThreadingTCPServer(("127.0.0.1",8000),MyServer)
# 開啟socketserver異步多線程
server.serve_forever()
客戶端base_socket_client.py
# -*- coding: utf-8 -*-
import socket
# 創建實例
# 默認AF_INET,SOCK_STREAM可以不填寫
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 定義綁定的ip和port
ip_port = ("127.0.0.1", 8000)
# 綁定監聽
client.connect(ip_port)
while True:
# 接受消息
data = client.recv(1024)
print(data.decode("utf8"))
# 給服務器發送數據
input_str = input("輸入數據:")
client.send(input_str.encode("utf8"))
if input_str == "exit":
break
運行結果如下:
image
image
image
總結
以上是生活随笔為你收集整理的python3模块socket怎么安装_Python中socket模块的使用方法(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: json解析 子类和父类同名属性如何赋值
- 下一篇: ubuntu安装ffmpeg_安装 Je