网络编程中TCP与UDP

288 阅读2分钟

网络通讯中,Socket是应用层与运输层中间的软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

下文出现的一些套接字属性:

s.bind() 绑定地址到套接字

s.listen() 开始TCP监听

s.accept() 被动接受TCP客户的连接

c.connect() 客户端主动初始化TCP服务器连接

s.recv() 接收TCP数据

s.send() 发送TCP数据

s.recvfrom() 接收UDP数据

s.sendto() 发送UDP数据

s.close() 关闭套接字

TCP 协议的服务器:

import socket

server = socket.socket()     #使用TCP可以直接默认
ip = '127.0.0.1'             #服务器的IP地址
port = 60000                 #端口0-1023是系统保留的
address = (ip,port)          #ip和port组成的地址

server.bind(address)         #服务器此绑定地址

server.listen(5)             #开始监听,设置最大半连接数为5

while True:

    c,addr = server.accept()                        #接受连接请求

    while True:
        try:
            #接受数据#
            data = c.recv(1024).decode("utf-8")     #接收数据并解码,1024为程序最大缓冲区容量

            if not data:
                print("client closed!")
                c.close()
                break

            print(data)
            #回复数据并将原始数据转为大写#
            c.send(data.upper().encode("utf-8"))    #转换完大写后进行编码

        except ConnectionResetError:                #保证服务器不会因客户端异常关闭而报错
            print("客户端异常关闭!!")
            c.close()
            break
    pass

TCP 协议的客户端:

import socket

client = socket.socket()
ip = '127.0.0.1'
port = 60000
address = (ip,port)

client.connect(address)                   #建立客户端与服务器的连接

while True:
    msg = input('<q.退出>>>:')       #等待输入数据

    if not msg:
        continue

    if msg == 'q':                   #输入q时退出
        c.close()
        break

    #发送数据#
    client.send(msg.encode('utf-8'))

    #接受数据#
    data = client.recv(1024).decode('utf-8')

    print(data)

UDP协议的服务器:

import socket

# 创建socket对象,指定type参数为socket.SOCK_DGRAM 表示使用UDP协议
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
ip = '127.0.0.1'
port = 8888
address = (ip,port)
server.bind(address)             # 绑定ip和端口

while True:
    #接收#
    msg,addr = server.recvfrom(1024)
    print("收到来自%s: 说:%s" % (addr[0] ,msg.decode("utf-8")))
    #发送#
    server.sendto(msg.upper(),addr)       #发送接收消息的大写给原地址

UDP协议的客户端:

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # datagram数据报的意思
ip = '127.0.0.1'
port = 8888
address = (ip,port)                                 #服务器地址

while True:
    msg = input(">>>:")                             #输入信息

    client.sendto(msg.encode("utf-8"),address)      #sendto需要给服务器地址

    data,addr = client.recvfrom(1024)               #recvfrom接收数据和地址
 
    print(data.decode("utf-8"))

UDP与TCP的区别: 不需要监听,不需要接收,type参数为 SOCK_DGRAM。 UDP 可以同时处理多个客户端,TCP有半连接池的概念。