欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python socket發(fā)送TCP數(shù)據(jù)方式

 更新時(shí)間:2023年09月06日 09:21:22   作者:MXG_ZZU  
這篇文章主要介紹了python socket發(fā)送TCP數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

python socket發(fā)送TCP數(shù)據(jù)

用python寫(xiě)socket發(fā)送 TCP的數(shù)據(jù)

import socket
import time

#客戶(hù)端發(fā)送500個(gè)包 創(chuàng)建socket、連接、發(fā)送、關(guān)閉

tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#綁定端口,發(fā)送數(shù)據(jù)時(shí)會(huì)從綁定的端口發(fā)送,不會(huì)再生成隨機(jī)端口
#tcp_socket.bind(("*.*.*.*", 8001))
tcp_socket.connect(("127.0.0.1", 8000))
n = 0
while(n<500):
? ? send_data = str(n)
? ? tcp_socket.send(send_data.encode("utf-8"))
? ? time.sleep()
? ? n=n+1
tcp_socket.close()

#接收端接收500個(gè)包 創(chuàng)建socket、綁定端口、監(jiān)聽(tīng)端口、接收連接請(qǐng)求、接收數(shù)據(jù)、關(guān)閉

tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_socket.bind(("192.168.1.128(本機(jī)私網(wǎng)IP)", 8000))
tcp_socket.listen()
client_scoket,client_addr = tcp_socket.accept()
timestamps = []
n = 0
while(n<500):
? ? recv_data = client_scoket.recv(1024)
? ? print(recv_data.decode('utf-8'))
? ? timestamps.append(time.perf_counter()) ?# 記錄時(shí)間戳
? ? n = n+1
client_scoket.close()
tcp_socket.close()

Python Socket(TCP和UDP)

IP協(xié)議負(fù)責(zé)把數(shù)據(jù)從一臺(tái)計(jì)算機(jī)通過(guò)網(wǎng)絡(luò)發(fā)送到另一臺(tái)計(jì)算機(jī)。數(shù)據(jù)被分割為一塊一塊,然后通過(guò)IP包發(fā)送出去,IP包的特點(diǎn)是按塊發(fā)送,途徑多個(gè)路由,但是不保證可以到達(dá),也不保證順序到達(dá)。

TCP協(xié)議建立在IP協(xié)議之上,負(fù)責(zé)在兩臺(tái)計(jì)算機(jī)之間建立可靠連接,保證數(shù)據(jù)包順序到達(dá),建立連接,對(duì)每個(gè)IP包編號(hào),確保順序收到,如果包丟了,就自動(dòng)重發(fā)。

TCP(比較可靠的傳輸)

TCP連接是可靠連接,如果傳輸比較重要,確保對(duì)方收到,可以用TCP。建立TCP連接時(shí),主動(dòng)發(fā)起連接的是客戶(hù)端(client),而被動(dòng)響應(yīng)連接的是服務(wù)器(server)。

下邊例子實(shí)現(xiàn):客戶(hù)端向服務(wù)端發(fā)送數(shù)據(jù),服務(wù)端接收此數(shù)據(jù),進(jìn)行計(jì)算,將該結(jié)果返回客戶(hù)端。

服務(wù)端

利用docker容器運(yùn)行服務(wù)端

起容器時(shí)應(yīng)該將容器的12312端口(該端口號(hào)為服務(wù)端程序中暴露的端口號(hào))映射到主機(jī)的端口

使用鏡像test:v1啟動(dòng)一個(gè)容器,在容器內(nèi)執(zhí)行/bin/bash命令,將容器的12312端口映射到主機(jī)的12312端口,主機(jī)的目錄/data映射到容器的/data

docker run -it -p 12312:12312 -v /test:/test test:v1 /bin/bash

程序如下:

import socketimport numpy as npimport time s &#61; socket.socket(socket.AF_INET, socket.SOCK_STREAM)host &#61; &#39;0.0.0.0&#39;      # ip地址port &#61; 12313          # 端口號(hào)s.bind((host, port))s.listen(5)print(&#39;Waiting for connection...&#39;)sock, addr &#61; s.accept()print(&#39;Connection successful&#xff1a;&#39;, addr)sock.send(b&#39;Send data please&#39;)while True:    client_data &#61; sock.recv(400000)    time.sleep(1)    if not client_data:        break    get_data &#61; np.fromstring(client_data, np.float32)    get_data &#61; np.array(get_data).reshape(1,2,3,4)    print(get_data)    result &#61; get_data    cilent_result &#61; result.tostring()    sock.send(cilent_result)sock.close()print(&#39;Connection closed!&#39;)

上述程序是進(jìn)行一次傳輸之后自動(dòng)結(jié)束運(yùn)行,如果服務(wù)端可循環(huán)接收數(shù)據(jù),可手動(dòng)控制停止,可用下述方法。

import socket
import numpy as np
import time 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '0.0.0.0'      # ip地址
port = 12313          # 端口號(hào)
s.bind((host, port))
s.listen(5)
print('Waiting for connection...')
sock, addr = s.accept()
print('Connection successful:', addr)
sock.send(b'Send data please')
while True:
    client_data = sock.recv(400000)
    time.sleep(1)
    if not client_data:
        break
    get_data = np.fromstring(client_data, np.float32)
    get_data = np.array(get_data).reshape(1,2,3,4)
    print(get_data)
    result = get_data
    cilent_result = result.tostring()
    sock.send(cilent_result)
sock.close()
print('Connection closed!')

客戶(hù)端

客戶(hù)端容器不用指定端口,正常起容器

程序如下:

import socket
import numpy as np 
data = np.ones((1,2, 3, 4),np.float32)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('123.123.0.1', 12313))   # 服務(wù)端IP地址, 該地址為服務(wù)端的IP地址
print(s.recv(1024).decode('utf-8'))  # 端口號(hào),與服務(wù)端暴露的端口號(hào)一致
client_data = data.tostring()
s.send(client_data)
serve_result = s.recv(40000)
result = np.fromstring(serve_result, np.float32)
result = np.array(result).reshape(1,2,3,4)
print(result)
s.close()

UDP(不要求可靠到達(dá)傳輸)

UDP傳輸不需要建立連接,只需要知道對(duì)方的IP地址和端口號(hào)即可發(fā)送。但是對(duì)方能不能收到就不確定了。

當(dāng)進(jìn)行一個(gè)不要求可靠到達(dá)的數(shù)據(jù)傳輸,就可以使用UDP協(xié)議,該傳輸方式不可靠但是速度比較快。

以下程序UDP實(shí)現(xiàn):服務(wù)端收到客戶(hù)端的信息,進(jìn)行計(jì)算,將結(jié)果返回客戶(hù)端??蛻?hù)端退出,而服務(wù)端需要手動(dòng)退出。(下述程序需在同一主機(jī)上用兩個(gè)終端運(yùn)行)

服務(wù)端

程序如下:

import socket
import numpy as np
import time
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host = '127.0.0.1'
port = 9999
s.bind((host, port))
while True:
    data, addr = s.recvfrom(4000)
    if not data:
        break
    get_data = np.fromstring(data, np.float32)
    get_data = np.array(get_data).reshape(1,2,3,4)
    print(get_data)
    result = get_data
    client_result = result.tostring()
    s.sendto(client_result, addr)

客戶(hù)端

import socket
import numpy as np
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host = '127.0.0.1'
port = 9999
data = np.ones((1,2, 3, 4),np.float32)
client_data = data.tostring()
s.sendto(client_data, (host, port))
serve_result, addr = s.recvfrom(40000)
result = np.fromstring(serve_result, np.float32)
result = np.array(result).reshape(1,2,3,4)
print(result)
s.close()

注:IP地址設(shè)置為0.0.0.0,并不是一個(gè)真實(shí)的IP地址,表示本地中所有的IPV4地址,監(jiān)聽(tīng)0.0.0.0的端口,就是監(jiān)聽(tīng)本機(jī)中所有的IP端口

IP地址設(shè)置為127.0.0.1,表示本機(jī)地址,如果綁定到這個(gè)地址,客戶(hù)端必須同時(shí)在本機(jī)運(yùn)行才能連接,外部的計(jì)算機(jī)無(wú)法連接進(jìn)來(lái)。一般會(huì)通過(guò)ping 127.0.0.1來(lái)測(cè)試某臺(tái)機(jī)器上的網(wǎng)絡(luò)設(shè)備是否正常。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Flask數(shù)據(jù)庫(kù)的連接與使用

    詳解Flask數(shù)據(jù)庫(kù)的連接與使用

    這篇文章主要為大家想想介紹了Python中Flask數(shù)據(jù)庫(kù)的連接與使用,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-02-02
  • Django 如何從request中獲取前端數(shù)據(jù)

    Django 如何從request中獲取前端數(shù)據(jù)

    這篇文章主要介紹了Django從request中獲取前端數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 利用python腳本如何簡(jiǎn)化jar操作命令

    利用python腳本如何簡(jiǎn)化jar操作命令

    這篇文章主要給大家介紹了關(guān)于利用python腳本如何簡(jiǎn)化jar操作命令的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Python數(shù)據(jù)分析pandas模塊用法實(shí)例詳解

    Python數(shù)據(jù)分析pandas模塊用法實(shí)例詳解

    這篇文章主要介紹了Python數(shù)據(jù)分析pandas模塊用法,結(jié)合實(shí)例形式分析了pandas模塊對(duì)象創(chuàng)建、數(shù)值運(yùn)算等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • Python實(shí)現(xiàn)清理重復(fù)文件功能的示例代碼

    Python實(shí)現(xiàn)清理重復(fù)文件功能的示例代碼

    在電腦上或多或少的存在一些重復(fù)文件,體積小的倒沒(méi)什么,如果體積大的就很占內(nèi)存了。本文用python制作了一個(gè)刪除重復(fù)文件的小工具,核心代碼很簡(jiǎn)單,希望對(duì)你有所幫助
    2022-07-07
  • Python3從零開(kāi)始搭建一個(gè)語(yǔ)音對(duì)話機(jī)器人的實(shí)現(xiàn)

    Python3從零開(kāi)始搭建一個(gè)語(yǔ)音對(duì)話機(jī)器人的實(shí)現(xiàn)

    這篇文章主要介紹了Python3從零開(kāi)始搭建一個(gè)語(yǔ)音對(duì)話機(jī)器人的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Flask添加路由的三種方法

    Flask添加路由的三種方法

    Flask 是一個(gè)流行的 Python Web 框架,它提供了多種方法來(lái)添加路由,本文詳細(xì)的介紹了Flask添加路由的三種方法,感興趣的可以了解一下
    2023-11-11
  • 使用django-suit為django 1.7 admin后臺(tái)添加模板

    使用django-suit為django 1.7 admin后臺(tái)添加模板

    前面我們介紹了Django-grappelli給admin添加模板,可是使用中發(fā)現(xiàn)inline有點(diǎn)問(wèn)題,所以就換了今天我們要談的Django-suit,貌似要稍微好一些
    2014-11-11
  • python中的生成器、迭代器、裝飾器詳解

    python中的生成器、迭代器、裝飾器詳解

    本文詳細(xì)講解了python中的生成器、迭代器、裝飾器,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Python中層次聚類(lèi)的詳細(xì)講解

    Python中層次聚類(lèi)的詳細(xì)講解

    層次聚類(lèi)( Hierarchical Clustering )是聚類(lèi)算法的一種,通過(guò)計(jì)算不同類(lèi)別的相似度類(lèi)創(chuàng)建一個(gè)有層次的嵌套的樹(shù),下面這篇文章主要給大家介紹了關(guān)于Python中層次聚類(lèi)的詳細(xì)講解,需要的朋友可以參考下
    2022-12-12

最新評(píng)論