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

歡迎訪問 生活随笔!

生活随笔

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

python

python创建tcp socket_Python Socket如何建立TCP连接

發布時間:2023/12/2 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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连接的全部內容,希望文章能夠幫你解決所遇到的問題。

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