python创建tcp socket_Python Socket如何建立TCP连接
在 Python 程序中創建 TCP 服務器時,創建通用 TCP 服務器的一般演示代碼如下。需要記住的是,這僅是設計服務器的一種方式。一旦熟悉了服務器設計,可以修改下面的代碼來操作服務器。
ss = socket() #創建服務器套接字
ss.bind() #綁定套接字與地址
ss.listen() #監聽連接
inf_loop: #服務器無限循環
cs = ss.accept() #接受客戶端連接
comm_loop: #通信循環
cs.recv()/cs.send() #對話(接收/發送)
cs.close() #關閉客戶端套接字
ss.close() #關閉服務器套接字#(可選)
在 Python 程序中,所有套接字都是通過 socket.socket() 函數創建的。因為服務器需要占用一個端口并等待客戶端的請求,所以它們必須綁定到一個本地地址。因為 TCP 是一種面向連接的通信系統,所以在 TCP 服務器開始操作之前,必須安裝一些基礎設施。特別地,TCP 服務器必須監聽(傳入)的連接。一旦這個安裝過程完成,服務器就可以開始它的無限循環。
在調用 accept() 函數之后,就開啟了一個簡單的(單線程)服務器,它會等待客戶端的連接。默認情況下,accept() 函數是阻塞的,這說明執行的操作會被暫停,直到一個連接到達為止。一旦服務器接受了一個連接,就會利用 accept() 方法返回一個獨立的客戶端套接字,用來與即將到來的消息進行交換。
下面的實例代碼演示了通過套接字建立 TCP“客戶端/服務器”連接的過程,這是一個可靠的、相互通信的“客戶端/服務器”。
實例文件 ser.py 的功能是以 TCP 連接方式建立一個服務器端程序,該程序能夠將收到的信息直接發回到客戶端。文件 ser.py 的具體實現代碼如下:
import socket #導入socket模塊
HOST = '' #定義變量HOST的初始值
PORT = 10000 #定義變量PORT的初始值
#創建socket對象s,參數分別表示地址和協議類型
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT)) #將套接字與地址綁定
s.listen(1) #監聽連接
conn, addr = s.accept() #接受客戶端連接
print('客戶端地址', addr) #顯示客戶端地址
while True: #連接成功后
data = conn.recv(1024) #實現對話操作(接收/發送)
print("獲取信息:",data.decode('utf-8'))#顯示獲取的信息
if not data: #如果沒有數據
break #終止循環
conn.sendall(data) #發送數據信息
conn.close() #關閉連接
在上述實例代碼中,建立 TCP 連接之后使用 while 語句多次與客戶端進行數據交換,直到收到的數據為空時才會終止服務器的運行。因為這只是一個服務器端程序,所以運行之后程序不會立即返回交互信息,還要等待和客戶端建立連接,等與客戶端建立連接后才能看到具體的交互效果。
實例文件 cli.py 的功能是建立客戶端程序,在此需要創建一個 socket 實例,然后調用這個 socket 實例的 connect() 函數來連接服務器端。connect() 函數的語法格式如下所示:
connect (address)
參數“address”通常也是一個元組(由一個主機名/IP地址、端口構成),如果要連接本地計算機,則主機名可直接使用“localhost”,connect() 函數能夠將套接字連接到遠程地址為“address”的計算機。
實例文件 cli.py 的具體實現代碼如下:
import socket #導入socket模塊
HOST = 'localhost' #定義變量HOST的初始值
PORT = 10000 #定義變量PORT的初始值
#創建socket對象s,參數分別表示地址和協議類型
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT)) #建立和服務器端的連接
data = "你好!" #設置數據變量
while data:
s.sendall(data.encode('utf-8')) #發送數據"你好"
data = s.recv(512) #實現對話操作(接收/發送)
print("獲取服務器信息:\n",data.decode('utf-8')) #顯示接收到的服務器信息
data = input('請輸入信息:\n') #信息輸入
s.close() #關閉連接
上述代碼使用套接字以 TCP 連接方式建立一個簡單的客戶端程序,基本功能是將從鍵盤錄入的信息發送給服務器,并從服務器接收信息。因為服務器端是建立在本地“localhost”的 10000 端口上,所以上述代碼作為客戶端程序,連接的就是本地“localhost”的 10000 端口。
當連接成功之后,向服務器端發送一條默認的信息“你好!”,再將從鍵盤錄入的信息發送給服務器端,直到錄入空信息(按 Enter 鍵)時才退出 while 循環,關閉套接字連接。先運行 ser.py 服務器端程序,然后運行 cli.py 客戶端程序,除發送一條默認的信息之外,從鍵盤中錄入的信息都會發送給服務器,服務器收到信息后顯示并再次轉發回客戶端進行顯示。
執行效果如圖 1 所示。
圖 1:執行文件 cli.py 后的效果
再看下面的這個實例,功能是建立一個 TCP“客戶端/服務器”模式的機器人聊天程序。
在這個實例中,看服務器端的實例文件 jiqirenser.py。具體實現代碼如下:
import socketserver
class Myserver(socketserver.BaseRequestHandler):
def handle(self):
conn = self.request conn.sendall(bytes("你好,我是機器人",encoding="utf-8"))
while True:
ret_bytes = conn.recv(1024)
ret_str = str(ret_bytes,encoding="utf-8")
if ret_str == "q":
break
conn.sendall(bytes(ret_str+"你好我好大家好",encoding="utf-8"))
if __name__ == "__main__":
server = socketserver.ThreadingTCPServer(("127.0.0.1",8000),Myserver)
server.serve_forever()
在這個實例中,看客戶端的實例文件 jiqirencli.py。具體實現代碼如下:
import socket
obj = socket.socket()
obj.connect(("127.0.0.1",8000))
ret_bytes = obj.recv(1024)
ret_str = str(ret_bytes,encoding="utf-8")
print(ret_str)
while True:
inp = input("請問您有什么問題? \n >>>")
if inp == "q":
obj.sendall(bytes(inp,encoding="utf-8"))
break
else:
obj.sendall(bytes(inp, encoding="utf-8"))
ret_bytes = obj.recv(1024)
ret_str = str(ret_bytes,encoding="utf-8")
print(ret_str)
執行后的效果如圖 2 所示。
圖 2:執行文件 jiqirencli.py 后的效果
再看下面的這個實例,功能是實現文件上傳。
在這個實例中,看服務器端的實例文件 shangchuanfuwu.py。具體實現代碼如下:
import socket
sk = socket.socket()
sk.bind(("127.0.0.1",8000))
sk.listen(5)
while True:
conn,address = sk.accept()
conn.sendall(bytes("歡迎光臨我愛我家",encoding="utf-8"))
size = conn.recv(1024)
size_str = str(size,encoding="utf-8")
file_size = int(size_str)
conn.sendall(bytes("開始傳送", encoding="utf-8"))
has_size = 0
f = open("123.jpg","wb")
while True:
if file_size == has_size:
break
date = conn.recv(1024)
f.write(date)
has_size += len(date)
f.close()
在這個實例中,看客戶端的實例文件 shangchuancli.py。具體實現代碼如下:
import socket
import os
obj = socket.socket()
obj.connect(("127.0.0.1",8000))
ret_bytes = obj.recv(1024)
ret_str = str(ret_bytes,encoding="utf-8")
print(ret_str)
size = os.stat("yan.jpg").st_size
obj.sendall(bytes(str(size),encoding="utf-8"))
obj.recv(1024)
with open("yan.jpg","rb") as f:
for line in f:
obj.sendall(line)
總結
以上是生活随笔為你收集整理的python创建tcp socket_Python Socket如何建立TCP连接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 太阳出来了教学设计一等奖
- 下一篇: 陈涉世家重点字词翻译