Python3.7 实现TCP通信

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字节数据发送出去的。

  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值