python TCP网络通信


tcp通信模型
udp通信模型中,在通信开始之前,不需要建立相关的链接,只需要发送数据即可,类似于生活中,“写信"”
tcp通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,“打电话”"

一、概念

tcp客户端和服务端
所谓的服务器端:就是提供服务的一方,而客户端,就是需要被服务的一方

(顺序是先打开服务器,在打开客户端)

相关函数:

s = socket.socket(AddressFamily,Type)

函数socket.socket创建一个socket,返回该socket的描述符,该函数带有俩个参数:

  • AddressFamily: 可以选择AF_INET(用于Internet进程间通信)或者AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET。
  • Type:套接字类型,可以是SOCK_STREAM(流式套接字,主要用于TCP协议)或者SOCK_DGRAM(数据包套接字,主要用于UDP协议)。

例如:创建TCP/IP套接字,如下

 tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

创建UDP/IP套接字,如下

udpsocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

创建完成后,生成一个socket对象,socket对象的主要方法如下表所示:
socket对象的内置方法

函数描述
s.bind()绑定地址(host,port)到套接字,在AF_INET下,以元组(host,port)的形式表示地址
s.listen()开始TCP监听。在backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分程序设置为5就可以了
s.accept()被动接收TCP客户端连接(阻塞式),等待连接的到来
s.connect()主动初始化TCP服务器连接,一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误
s.recv()接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略
s.send()发送TCP数据,将string中的数据发送到连接的套接字。返回值是发送的字节数量,该数量可能小于string的字节大小
s.sendall()完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败抛出异常
s.recvfrom接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址
s.sendto()发送UDP数据,将数据发送到套接字,address是形式为(ipaddr,port)的元祖,指定远程地址。返回值是发送的字节数
s.close()关闭套接字

二、客户端构建流程

TCP客户端端流程
1、创建socket
2、配置服务器端口和ip
3、连接服务器
4、收发数据
5、关闭

import socket # 导入 socket 模块
s = socket.socket() # 创建 socket 对象
host = 服务器ip
port = 服务器端口 # 设置端口号

s.connect((host, port))
s.send(“hello”)
print s.recv(1024)
s.close()

client.py

# 导入 socket 模块
import socket

# 创建 socket 对象
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# 获取本地主机名
host = socket.gethostname() 

# 设置端口号
port = 9000

# 连接服务,指定主机和端口(请求连接)
clientsocket.connect((host, port))

#提示用户输入的数据(客户端向服务器端发送数据)
send_data = input("请输入要发送的数据:")
clientsocket.send(send_data.encode("gbk"))

# 接收小于 1024 字节的数据
server_to_client_msg = clientsocket.recv(1024)
print ("接收到的数据为",server_to_client_msg.decode('gbk'))

# 关闭套接字
clientsocket.close()

三、服务器端构建流程

TCP服务器端流程
1、使用socket()创建一个套接字
2、使用bind()绑定IP和端口
3、使用listen()使套接字变为可被动连接
4、使用accept()等待客户端的连接
5、使用recv/send()接收发送模块
6、关闭

import socket # 导入 socket 模块
host = socket.gethostname() # 获取本地主机名
ip = socket.gethostbyname(host)#获取本地计算机ip
port = 12345 # 设置端口
s = socket.socket() # 创建 socket 对象
s.bind((ip , port)) # 绑定端口
s.listen(5) # 等待客户端连接
print(“服务器等待客户端连接”)
while True:
c,addr = s.accept() # 建立客户端连接
print(‘连接地址:’, addr)
c.send(‘欢迎连接!’)
c.close() # 关闭连接

server.py

# 导入 socket模块
import socket

#创建socket对象
serversocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)


host = socket.gethostname()   #获取本地主机名
ip = socket.gethostbyname(host)#获取本地计算机ip
print(host)
print(ip)
port = 9001
# 绑定端口号
serversocket.bind((ip, port))

# 设置最大连接数,超过后排队
serversocket.listen(5)

while True:
    # 建立客户端连接
    clientsocket,addr = serversocket.accept()     
    print("连接地址: %s" % str(addr))
    msg=input("请输入要发送的数据:")
    clientsocket.send(msg.encode('gbk')) #向客户端发数据
    clientsocket.close()

四、用VScode 实现简单的服务器和客户端之间的对话(不用串口调试助手)

实现代码:
server.py

# TCP服务器端流程
# 1、使用socket()创建一个套接字
# 2、使用bind()绑定IP和端口
# 3、使用listen()使套接字变为可被动连接
# 4、使用accept()等待客户端的连接
# 5、使用recv/send()接收发送模块
# 6、关闭

import socket
# 1、使用socket()创建一个套接字
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print(s)
# 2、使用bind()绑定IP和端口
#2.1 获取IP和端口号
host = socket.gethostname()
ip = socket.gethostbyname(host)
print("服务器ip:",ip)
port = 12345

#2.2 使用bind()绑定
s.bind((ip,port))

# 3、使用listen()设置监听的最大个数   
s.listen(5)
while True:
    # 4、使用accept()等待客户端的连接
    c,addr = s.accept()
    print("连接地址",addr)
    # 5、使用recv/send()接收发送模块
    #word = "你好,我是服务器端"
    while(1):
        word = input("请输入服务器端要发送的数据:\n")
        c.send(word.encode('gbk'))
        rec_data = c.recv(1024)
        print("收到的数据:",rec_data.decode('gbk'))
        if(word == "q"):
            break
    c.close()
    

client.py

# TCP客户端端流程
# 1、创建socket
# 2、配置服务器端口和ip
# 3、连接服务器connect()
# 4、收发数据
# 5、关闭
import socket
c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host = socket.gethostname()
ip = socket.gethostbyname(host)
port = 12345
c.connect((ip,port))
#
while(1):
    server_to_client = c.recv(1024).decode('gbk')
    print(server_to_client)
    # data = input("")
    send_data = input("请输入客户端要发送的内容:\n")
    c.send(send_data.encode('gbk'))
    if(server_to_client=='q'):
        break
c.close()



  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值