Python3.7 实现TCP通信

2023-05-16

TCP 连接程序分为服务端和客户端两部分
服务端步骤如下:
1. 创建套接字Socket

什么是套接字
应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。*** 为了区别不同的应用程序进程和连接 *** , 许多计算机操作系统为应用程序与TCP/IP协议提供了称为套接字(Socket)的接口,区分不同应用程序进程间的网络通信和连接。

2.为套接字绑定端口和IP,IP为服务端自IP,端口选空闲可用端口
3.开启监听,检测客户端连接申请
4.接收到连接申请,且服务端空闲,处理连接,连接成功后开始工作
5.接收客户端发送的消息,回传给客户端消息回复
6.工作完毕,关闭套接字

服务端完整代码

import socket
# TCP连接
# 创建 socket
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# AF_INET IPv4;AF_INET6 IPv6;SOCK_STREAM 数据流,面向连接的(TCP); SOCK_DGRAM 数据报,无连接的(UDP)

# 配置ip和端口
host = socket.gethostname()  # 本地计算机名
ip = socket.gethostbyname(host)   # 获取本地IP
port = 2022  # 设置可用端口

# 绑定ip和端口
tcp_server.bind((ip, port))    # bind函数绑定端口,有两个括号是因为参数传入的是元组,其中包含IP和端口号

# 监听
tcp_server.listen(2)   # 2(int)参数为backlog,代表同时最多接收n个客户端的连接申请

#  accept函数等待连接,若连接成功返回conn和address, conn为新的套接字用于连接后的消息传输,address 连接上的客户端的地址
conn, addr = tcp_server.accept()
print(addr, "连接上了")

# 单次接收处理
data = conn.recv(1024)   # 接收数据,1024 -- bufsize参数为接收的最大数据量
print(data.decode())  # 以字符串编码解析
# decode函数 解码:将接收到的bytes类型二进制数据转换为str类型
conn.send("ok".encode())  # 发送数据给客户端
# encode函数 编码:将str类型转为bytes类型二进制数据去传输

# 循环接收处理
'''
while True:
    data = conn.recv(1024)  
    if not data:
        print("消息已读完")
        break
    operation = data.decode() 
    print(operation)
    conn.send("ok".encode())

'''
tcp_server.close()  # 关闭套接字

客户端步骤如下
与客户端类似,但是服务端需先启动,并且等待客户端的连接,属于被动处理
客户端需要主动发出连接申请给服务端,所以在服务端启动后再启动,连接成功后可操作

1.创建套接字
2.套接字以目标服务端的IP和端口号发送连接申请
3.连接成功后发送数据,和接收数据
4.处理完成后,关闭客户端套接字

客户端完整代码

import socket

#  开始连接
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 需连接的客户端ip和端口
server_ip = "192.168.0.101"
server_port = 2022

# 单次传输操作
tcp_client.connect((server_ip, server_port))
outdata = "hello server! This is client."
tcp_client.send(outdata.encode())
recdata = tcp_client.recv(1024)
print("server:", recdata.decode())

# 循环发送操作
'''
# 开始传数据
while True:
    outdata = input()
    if outdata == "quit":
        print("输入结束。")
        break
    tcp_client.send(outdata.encode())
    recdata = tcp_client.recv(1024)
    if not recdata:
        print("无接受")
        break
    print("server:", recdata.decode())

'''

tcp_client.close()

所遇问题:

假如客户端某次输入,在不小心情况下,一开始就敲了回车,就进入死循环,服务端也收不到,客户端也送不出去了。

注意:客户端或服务端都不能向对方发送空字节消息;当客户端发送0字节数据时,操作系统时不会把这个0字节数据发送出去的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python3.7 实现TCP通信 的相关文章

  • 如何进行 TCP 打孔?

    问题如下 这是我当前的测试代码 但没有成功 static void Main string args if args Count 3 Console WriteLine Bad args var ep new IPEndPoint IPAd
  • TCP 代理:在后端不可用时保持连接

    在 Docker 设置的上下文中 我想使用类似大使的模式来允许某些容器 例如数据库服务器 正常重新启动 而不必重新启动所有依赖的容器 例如 Web 服务器 并且没有错误消息 因为 数据库服务器不可用 因此 我想知道 是否有一个 TCP 代理
  • Android TCP 连接最佳实践

    我正在开发一个需要 TCP 连接到 TCP 服务器的 Android 应用程序 用 Node js 编写 我的 Android TCP 客户端正在工作 可以来回发送消息 我的具体问题是 在 Android 中处理与服务器的 TCP 连接的最
  • Scapy 不需要的 RST TCP 数据包

    为了理解TCP是如何工作的 我尝试伪造自己的TCP SYN SYN ACK ACK 基于教程 http www thice nl creating ack get packets with scapy http www thice nl c
  • 如何在NodeJS中测试socket.setKeepAlive

    我尝试在NodeJS中测试setKeepAlive 的功能 我在同一本地网络中的不同计算机上运行 Server js 和 client js 然后 我关闭了客户端计算机上的 WiFi 连接 断开互联网连接 15分钟后 仍然没有消息抛出 这是
  • net.TCPConn 允许在 FIN 数据包后写入

    我正在尝试为一些服务器端代码编写单元测试 但我在确定关闭测试用例时遇到了困难 环回 TCP 连接似乎无法正确处理干净关闭 我在一个示例应用程序中重现了这一点 该应用程序按顺序执行以下操作 创建客户端和服务器连接 通过从客户端向服务器成功发送
  • Go TCP 读取是非阻塞的

    我正在尝试用 Go 创建服务器和客户端 我已经成功地与服务器和客户端进行通信 但我遇到的问题是golang中的TCP读取是非阻塞的 我想知道 golang 中的读取是否有可能像 C 中的读取一样阻塞 谢谢 EDIT 这是服务器的源代码 fu
  • PHP 上的多个 TCP 套接字请求

    是否可以使用 PHP 上的套接字服务器接受多个请求 并行 如果可以的话 怎样做 普通的 PHP 脚本无法接收多个请求 但如果你真的计划创建一个套接字服务器 作为 cmdline php 脚本启动 那么是的 这是可能的 调查http pear
  • C# - 从客户端检查 TCP/IP 套接字状态

    我想为我的 TCP IP 客户端类提供 CheckConnection 函数 以便我可以检查是否发生了错误 我自己的客户端断开连接 服务器断开连接 服务器卡住等 我有类似的东西 bool isConnectionActive false i
  • 如何在java应用程序中检测FIN - tcp标志?

    我在两台计算机之间有持久的 TCP 连接 第二台计算机不受我的控制 第二台计算机可以随时发送FIN标志 并且首先必须关闭当前连接 将FIN标志发送回第二台计算机 我如何知道第二台计算机正在发送 FIN 标志 以及何时必须调用 Java 应用
  • 数据包丢失和数据包重复

    我试图找出数据包丢失和数据包重复问题之间的区别 有谁知道 数据包重复 是什么意思 和TCP检测到丢失时重传数据包一样吗 No In TCP 数据包 的传递是可靠的 我认为在这种情况下术语数据应该更好 因为它是面向流的协议 数据包丢失和重复是
  • 两个http请求可以合并在一起吗?如果可以的话,nodeJS服务器如何处理呢?

    昨天我做了一些关于 NodeJS 的演讲 有人问我以下问题 我们知道nodeJS是一个单线程服务器 多个请求是 到达服务器并将所有请求推送到事件循环 如果什么 两个请求同时到达服务器 服务器将如何处理 处理这种情况 我猜到了一个想法并回复如
  • C# Socket.receive连续接收0字节且循环中不阻塞

    我正在尝试用 C 编写一个最简单的多线程 TCP 服务器 它接收来自多个客户端的数据 每次连接新客户端时 都会建立套接字连接 并将套接字作为参数传递给新类函数 之后运行 while 循环并接收数据 直到客户端连接为止 这里的问题是 sock
  • ZeroMQ可以用来接受传统的套接字请求吗?

    我正在尝试使用 ZeroMQ 重写我们的旧服务器之一 现在我有以下服务器设置 适用于 Zmq 请求 using var context ZmqContext Create using var server context CreateSoc
  • 自动打开命名管道和 tcp\ip

    我正在安装一个需要修改 SQL Server 的新产品 具体来说 启用 tcp ip 并打开命名管道 我知道如何手动完成 我想要的是一种通过 SQL 或 C 代码为新客户自动化执行此操作的方法 我希望有任何关于正确方向的建议 您可以使用 C
  • 简单的跨平台 TCP IP API?

    我不打算使用像 QT 或 wxWidgets 的 API 这样的大东西 我只想要可以在 Android iOS Windows Mac Linux 上运行的简单套接字 我正在制作一个事件驱动的纸牌游戏 所以 TCP 是最好的 本质上 我只想
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • 建立 TCP 连接边界的正确方法

    我的问题是关于如何正确处理使用 tcp 连接接收的数据 事实上 通过建立 tcp 连接 创建了一个流 假设我想发送一条有开头和结尾的消息 由于数据在流中流动而没有指定任何边界 我如何识别消息的开始和结束 我想在消息的开头和结尾处放置一些特殊
  • Apache HttpClient TCP Keep-Alive(套接字保持活动)

    我的 http 请求需要太多时间才能被服务器处理 大约 5 分钟 由于连接闲置 5 分钟 代理服务器将关闭连接 我正在尝试在 Apache DefaultHttpClient 中使用 TCP Keep Alive 来使连接长时间处于活动状态

随机推荐