python socket发送TCP数据方式

 更新时间:2023年09月06日 09:21:22   作者:MXG_ZZU  
这篇文章主要介绍了python socket发送TCP数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

python socket发送TCP数据

用python写socket发送 TCP的数据

import socket
import time

#客户端发送500个包 创建socket、连接、发送、关闭

tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#绑定端口,发送数据时会从绑定的端口发送,不会再生成随机端口
#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个包 创建socket、绑定端口、监听端口、接收连接请求、接收数据、关闭

tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_socket.bind(("192.168.1.128(本机私网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())  # 记录时间戳
    n = n+1
client_scoket.close()
tcp_socket.close()

Python Socket(TCP和UDP)

IP协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割为一块一块,然后通过IP包发送出去,IP包的特点是按块发送,途径多个路由,但是不保证可以到达,也不保证顺序到达

TCP协议建立在IP协议之上,负责在两台计算机之间建立可靠连接,保证数据包顺序到达,建立连接,对每个IP包编号,确保顺序收到,如果包丢了,就自动重发

TCP(比较可靠的传输)

TCP连接是可靠连接,如果传输比较重要,确保对方收到,可以用TCP。建立TCP连接时,主动发起连接的是客户端(client),而被动响应连接的是服务器(server)

下边例子实现:客户端向服务端发送数据,服务端接收此数据,进行计算,将该结果返回客户端。

服务端

利用docker容器运行服务端

起容器时应该将容器的12312端口(该端口号为服务端程序中暴露的端口号)映射到主机的端口

使用镜像test:v1启动一个容器,在容器内执行/bin/bash命令,将容器的12312端口映射到主机的12312端口,主机的目录/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          # 端口号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;)

上述程序是进行一次传输之后自动结束运行,如果服务端可循环接收数据,可手动控制停止,可用下述方法。

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          # 端口号
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!')

客户端

客户端容器不用指定端口,正常起容器

程序如下:

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))   # 服务端IP地址, 该地址为服务端的IP地址
print(s.recv(1024).decode('utf-8'))  # 端口号,与服务端暴露的端口号一致
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(不要求可靠到达传输)

UDP传输不需要建立连接,只需要知道对方的IP地址和端口号即可发送。但是对方能不能收到就不确定了。

当进行一个不要求可靠到达的数据传输,就可以使用UDP协议,该传输方式不可靠但是速度比较快。

以下程序UDP实现:服务端收到客户端的信息,进行计算,将结果返回客户端。客户端退出,而服务端需要手动退出。(下述程序需在同一主机上用两个终端运行)

服务端

程序如下:

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)

客户端

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地址设置为0.0.0.0,并不是一个真实的IP地址,表示本地中所有的IPV4地址,监听0.0.0.0的端口,就是监听本机中所有的IP端口

IP地址设置为127.0.0.1,表示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接,外部的计算机无法连接进来。一般会通过ping 127.0.0.1来测试某台机器上的网络设备是否正常。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解Flask数据库的连接与使用

    详解Flask数据库的连接与使用

    这篇文章主要为大家想想介绍了Python中Flask数据库的连接与使用,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以学习一下
    2023-02-02
  • Django 如何从request中获取前端数据

    Django 如何从request中获取前端数据

    这篇文章主要介绍了Django从request中获取前端数据的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 利用python脚本如何简化jar操作命令

    利用python脚本如何简化jar操作命令

    这篇文章主要给大家介绍了关于利用python脚本如何简化jar操作命令的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • Python数据分析pandas模块用法实例详解

    Python数据分析pandas模块用法实例详解

    这篇文章主要介绍了Python数据分析pandas模块用法,结合实例形式分析了pandas模块对象创建、数值运算等相关操作技巧与注意事项,需要的朋友可以参考下
    2019-11-11
  • Python实现清理重复文件功能的示例代码

    Python实现清理重复文件功能的示例代码

    在电脑上或多或少的存在一些重复文件,体积小的倒没什么,如果体积大的就很占内存了。本文用python制作了一个删除重复文件的小工具,核心代码很简单,希望对你有所帮助
    2022-07-07
  • Python3从零开始搭建一个语音对话机器人的实现

    Python3从零开始搭建一个语音对话机器人的实现

    这篇文章主要介绍了Python3从零开始搭建一个语音对话机器人的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Flask添加路由的三种方法

    Flask添加路由的三种方法

    Flask 是一个流行的 Python Web 框架,它提供了多种方法来添加路由,本文详细的介绍了Flask添加路由的三种方法,感兴趣的可以了解一下
    2023-11-11
  • 使用django-suit为django 1.7 admin后台添加模板

    使用django-suit为django 1.7 admin后台添加模板

    前面我们介绍了Django-grappelli给admin添加模板,可是使用中发现inline有点问题,所以就换了今天我们要谈的Django-suit,貌似要稍微好一些
    2014-11-11
  • python中的生成器、迭代器、装饰器详解

    python中的生成器、迭代器、装饰器详解

    本文详细讲解了python中的生成器、迭代器、装饰器,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Python中层次聚类的详细讲解

    Python中层次聚类的详细讲解

    层次聚类( Hierarchical Clustering )是聚类算法的一种,通过计算不同类别的相似度类创建一个有层次的嵌套的树,下面这篇文章主要给大家介绍了关于Python中层次聚类的详细讲解,需要的朋友可以参考下
    2022-12-12

最新评论