网络编程 简述tcp与udp

网络编程概念:

网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。中间最主要的就是[数据包]的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理,代码、开发工具、数据库、服务器架设和网页设计这5部分你都要接触。


Socket:

套接字:

面向文件的套接字:通过文件进行数据交互
面向网络的套接字:通过网络进行数据交互 (tcp,udp)
地址家族 :Adress Family,也经常简写为 AF。
协议家族 :Protocal Family,可以简写为 PF。

PYTHON 中的套接字

面向连接的套接字模型(tcp)
面向无连接的套接字模型 (udp)

基本结构:

引入需要模块
定义连接数据
创建服务端/客户端 套接字对象
绑定端口
监听端口
收发消息
断开连接



TCP 编程

TCP:Transmission Control Protocal 传输控制协议
是一种面向连接的,可靠的、 基于字节流的传输层通信协议
三次握手 建立连接
四次挥手 断开连接

服务端

定义需要监听的主机 I P 和端口号
绑定 I P 地址和端口号到套接字对象
开始监听
等待连接
连接成功 - 开始数据通信
断开连接
代码:

'''TCP服务端模块'''
#  引入需要的模块
import socket

# 定义连接信息
HOST = ''
PORT = 8888
ADDRESS = (HOST, PORT)

# 定义缓冲区大小
BUFFER = 1024

# 创建一个TCP服务端套接字对象
# socket.AF_INET : Ipv4网络协议
# socket.SOCK_STREAM: 提供面向连接的稳定数据传输,即TCP协议。
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 绑定主机端口号
tcp_server.bind(ADDRESS)

# 监听端口:参数~排队的客户端
tcp_server.listen(5)

while True:
    # 等待客户端的接入,建立连接
    print("waiting for connect...")
    # 接受连接
    server_socket, addr = tcp_server.accept()
    print("client already connect! welcome to server: ", addr)

    while True:
        # 发送一个欢迎消息给客户端
        info = input("请输入您要发送的消息:")
        server_socket.send(info.encode("utf-8"))

        # 接受客户端发送的消息
        msg = server_socket.recv(BUFFER)
        print("client:",msg.decode("utf-8"))
        if msg == b'bye':
            # 关闭套接字,释放资源
            server_socket.close()
            break

客户端

定义需要监听的主机 I P 和端口号
绑定 I P 地址和端口号到套接字对象
创建 T CP 连接套接字对象
向指定的 I P 和 P ORT 发起请求,请求连接
连接成功,进行数据收发操作
关闭连接,释放资源

代码 :

'''TCP客户端'''
# 引入需要的模块
import socket

# 定义连接信息
TARGET_HOST = '192.168.13.43'
TARGET_PORT = 8888
TARGET_ADDRESS = (TARGET_HOST,TARGET_PORT)
BUFFER = 1024

# 创建一个TCP套接字对象
# socket.AF_INET : Ipv4网络协议
# socket.SOCK_STREAM: 提供面向连接的稳定数据传输,即TCP协议。
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 向指定的主机发送连接请求
client.connect(TARGET_ADDRESS)

# 收发消息
while True:
    # 接收服务器消息
    msg = client.recv(BUFFER)
    print("server:", msg.decode("utf-8"))

    #向服务器发送消息
    info = input("请输入您要发送的消息:")
    client.send(info.encode("utf-8"))
    if info == 'bye':
        #关闭套接字
        client.close()
        break
print("客户端退出")

UDP

UDP:User Datagram Protocal 用户数据报协议
是 OSI/RM 模型中隶属于传输层的面向无连接的网络数据传输协议

udp服务端

引入依赖的模块
定义服务器描述信息
创建 U DP 套接字对象 并绑定主机
消息循环:和连接进入的客户端之间发送 / 收取消息
关闭连接,释放资源

代码:

# 引入需要的模块
import  socket

# 定义服务器信息
HOST = ''
PORT = 8888
ADDRESS = (HOST, PORT)
BUFFER = 1024

# 创建UDP类型的套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

# 绑定主机
udp_socket.bind(ADDRESS)
print("udp server is starting, waiting for data....")

# 不需要监听,直接等待收发数据
while True:
    # 接收数据
    msg, addr = udp_socket.recvfrom(BUFFER)
    try:
        print("client:", addr, msg.decode('utf-8'))
    except:
        print("client:", addr, msg.decode('gbk'))
    # 发送消息
    info = input("enter message: ")
    udp_socket.sendto(info.encode('utf-8'),addr)


# 服务器退出的情况,先关闭套接字
udp_socket.close()

udp客户端

引入依赖的模块
定义服务器描述信息
创建 udp 连接套接字对象
向指定的 I P 和 P ORT 收发消息
关闭连接,释放资源

代码:

# 引入以来的模块
import socket

# 目标主机信息
HOST = '192.168.13.43'
PORT = 8888
ADDRESS = (HOST,PORT)
BUFFER = 1024

# 发送/接收消息
# socket.AF_INET : Ipv4网络协议
# socket.SOCK_DGRAM: 提供面向无连接的稳定数据传输,即udp协议。
udp_client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

while True:
    info = input("输入消息:")
    udp_client.sendto(info.encode('utf-8'), ADDRESS)
    if info == 'bye':
        udp_client.close()
        break

    msg, addr = udp_client.recvfrom(BUFFER)
    try:
        print(addr," say :",msg.decode('utf-8'))
    except:
        print(addr, " say :", msg.decode('gbk'))

你可能感兴趣的:(网络编程 简述tcp与udp)