欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python TCP接收/发送信息

程序员文章站 2024-01-07 11:09:10
...

一 简单介绍一下几个知识点

  1. TCP: 他是 传输控制协议 是 是一种面向连接的、基于字节流的传输层通信协议 . 这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。
  2. socket: 套接字,是一个模块,我们用它来完成收发信息
  3. 网路协议版本: IPV4 和 ipv6 , 因为后者还没有推广开,所有现在普遍还是用的IPV4版本.
  4. ip,和端口 :要给谁发送,就写谁的ip(这里就写自己本地ip就行要是不知道就打开cmd输入ipconfig查看) ; 端口号就随便用一个(除知名端口)
  5. encode:就是编码,把字符串转换成字节,因为sendto方法的格式.(反之decode就是解码)

二 tcp接收信息(TCP服务器):

因为tcp协议是一对一的连接,所以要先创建一个接收信息的服务器
简单来说有六个步骤

  1. 导入socket模块
  2. 创建TCP套接字
  3. 绑定ip和port
  4. 设置为被动监听模式 最大并发接收的数量是128(设置监听模式才能是服务器)
  5. 等待接收链接请求 接收到的是一个元组 (客户端的socket对象包含了:(客户端的地址,端口))
  6. 关闭套接字

下面直接看代码: ↓ (因为ip的问题,测试时把WiFi关掉)

# 导包
import socket

# 2初始化套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 3 服务器绑定ip和port
tcp_socket.bind(('192.168.52.1', 12000))

# 4 设置为被动监听模式  最大并发接收的数量是128
tcp_socket.listen(128)

# 5 等待接收链接请求  接收到一个元组 (客户端的socket对象,(客户端的地址,端口))
client, addr = tcp_socket.accept()


# 接收要用客户端的socket对象接收,因为发的时候就是用他的对象发的
data = client.recv(1024)

# 发送的格式是字节,要解码,decode()默认gbk
print(data.decode())

# 6断开
tcp_socket.close()

这里有个网络调试助手,在百度网盘,2M,用于测试 ↓
链接:网络调试助手下载

三 tcp发送数据(TCP客户端)

客户端 就是要向服务端 发数据 所以比较好理解
简单说一下步骤:

  1. 导入socket模块
  2. 创建TCP套接字
  3. 建立连接(与服务端)
  4. 发数据
  5. 关闭套接字

看代码:

# 1导包 
import socket

# 2初始化套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 3建立链接  要传入链接的服务器ip和port
tcp_socket.connect(('192.168.52.1', 11000))

# 4发数据
tcp_socket.send('哈哈呵呵呵'.encode())

# 5断开
tcp_socket.close()

现在客户端有了,服务端也有了,那我们完善一下代码

1.完善服务端代码:

先说服务端的,不能只接收一次数据就完了,所以加个循环,一直接受

import socket

# 1初始化套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 设置地址可以复用,解决了 端口没有及时释放的问题
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

# 2 服务器绑定ip和port
tcp_socket.bind(('192.168.52.1', 12000))

# 3 设置为被动监听模式  最大并发接收的数量是128
tcp_socket.listen(128)

while True:
    # 4 等待接收链接请求  接收到一个元组 (客户端的socket对象,(客户端的地址,端口))
    client, addr = tcp_socket.accept()
    print('client:', client)
    print('addr:', addr)

    while True:
        data = client.recv(1024)
        print(data.decode('gbk'))
        if not data:
            # 如果数据为空 说明客户端关闭了链接  这里的client也就可以关闭
            client.close()
            break

# 5断开
tcp_socket.close()

说一下 : 服务器接收到的client(客户端发过来的:客户端套接字对象) , 那既然是客户发过来的,我们回复的时候也是用这个套接字对象回复的 , 那想一下,如果同时有多个客户端发过来数据呢? 也是ok的,因为他是对每个发过来的socket(客户端对象)进行处理.(这里就像是很多人打人工客服,他会内部给你分配一个客服和你沟通)

2.完善客户端代码:

客户端用socket对象发送数据 也可以用socket接受数据(因为服务器端就是用客户端的socket对象接收的呀)

import socket

# 1初始化套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2建立链接  要传入链接的服务器ip和port
tcp_socket.connect(('192.168.52.1', 11000))

while True:
    text = input('发送的数据')
    # 3发数据
    tcp_socket.send(text.encode('gbk'))
    # 4接收数据
    data = tcp_socket.recv(1024)
    print(data.decode('gbk'))

# 5断开
tcp_socket.close()

测试时注意编码格式,和地址问题,端口问题,这些都是不一样的根据自己情况

最后结尾了,说一下TCP 和 UDP 的不同点:

  • 面向连接(确认有创建三方交握,连接已创建才作传输。)
  • 有序数据传输
  • 重发丢失的数据包
  • 舍弃重复的数据包
  • 无差错的数据传输
  • 阻塞/流量控制

还有一个tcp的小案例 : TCP下载文件 tcp下载文件案例

udp的收发信息 UDP收发信息

相关标签: Python知识点

上一篇:

下一篇: