TCP Socket低层次网络编程和UDP Socket低层次网

2019-12-22  本文已影响0人  wangyu2488

2019年12月12日

TCP/IP协议的传输层又有两种传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP是面向连接的可靠数据传输协议。

一.TCP Socket低层次网络编程

TCP就像好比电话,电话接通后双方才能通话,在挂断电话之前,电话一直占线。

image.png

1.简单聊天工具
1.1服务器端代码

# coding=utf-8

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 8888))
s.listen()
print('服务器启动...')

# 等待客户端连接
conn, address = s.accept()
# 客户端连接成功
print(address)

# 从客户端接收数据
data = conn.recv(1024)
print('从客户端接收消息:{0}'.format(data.decode()))
# 给客户端发送数据
conn.send('你好'.encode())  # conn.send(b'你好')

# 释放资源
conn.close()
s.close()

1.2客户端代码

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
s.connect(('127.0.0.1', 8888))

# 给服务器端发送数据
s.send(b'Hello')
# 从服务器端接收数据
data = s.recv(1024)
print('从服务器端接收消息:{0}'.format(data.decode()))

# 释放资源
s.close()

1.3测试先启动服务器端代码

image.png image.png

2.文件上传工具

2.1服务器端

import socket

HOST = ''
PORT = 8888

f_name = 'coco2dxcplus_copy.jpg'

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(10)
    print('服务器启动...')

    while True:
        with s.accept()[0] as conn:
            # 创建字节序列对象列表,作为接收数据的缓冲区
            buffer = []
            while True:  # 反复接收数据
                data = conn.recv(1024)
                if data:
                    # 接收的数据添加到缓冲区
                    buffer.append(data)
                else:
                    # 没有接收到数据则退出
                    break
            # 将接收的字节序列对象列表合并为一个字节序列对象
            b = bytes().join(buffer)
            with open(f_name, 'wb') as f:
                f.write(b)

            print('服务器接收完成。')

2.2客户端

import socket

HOST = '127.0.0.1'
PORT = 8888
f_name = 'coco2dxcplus.jpg'

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    with open(f_name, 'rb') as f:
        b = f.read()
        s.sendall(b)
        print('客户端上传数据完成。')

2.3印证 先开服务器

image.png image.png

二.UDP Socket低层次网络编程

UDP(用户数据报协议)就像日常生活中的邮件投递,是不能保证可靠的寄到目的地.UDP是无连接的,对系统资源的要求较少.UDP可能丢包不保证数据顺序。但是对于网络游戏和在线视频等要求传输快、实时性高,质量可稍差一点的数据传输,UDP还是非常不错的。(优点不会一直占线)

1.简单聊天工具

1.1服务器

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('', 8888))
print('服务器启动...')

# 从客户端接收数据
data, client_address = s.recvfrom(1024)
print('从客户端接收消息:{0}'.format(data.decode()))
# 给客户端发送数据
s.sendto('你好'.encode(), client_address)  # 如果数据量很大会多次调用

# 释放资源
s.close()

1.2客户端

import socket

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

# 服务器地址
server_address = ('127.0.0.1', 8888)

# 给服务器端发送数据
s.sendto(b'Hello', server_address)
# 从服务器端接收数据
data, _ = s.recvfrom(1024)
print('从服务器端接收消息:{0}'.format(data.decode()))

# 释放资源
s.close()

1.3测试

image.png image.png

2.文件上传工具 上传图片容易丢失,用文件替代

2.1服务器

import socket

HOST = '127.0.0.1'
PORT = 8888

f_name = 'test_copy.txt'

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
    s.bind((HOST, PORT))
    print('服务器启动...')

    # 创建字节序列对象列表,作为接收数据的缓冲区
    buffer = []
    while True:  # 反复接收数据
        data, _ = s.recvfrom(1024)
        if data:
            flag = data.decode()
            if flag == 'bye':  # 和客户端约定好的结束符号
                break
            buffer.append(data)
        else:
            # 没有接收到数据,进入下次循环继续接收
            continue
    # 将接收的字节序列对象列表合并为一个字节序列对象
    b = bytes().join(buffer)
    with open(f_name, 'w') as f:
        f.write(b.decode())

    print('服务器接收完成。')

2.2客户端

import socket

HOST = '127.0.0.1'
PORT = 8888

f_name = 'test.txt'

# 服务器地址
server_address = (HOST, PORT)

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
    with open(f_name, 'r') as f:
        while True:  # 反复从文件中读取数据
            data = f.read(1024)
            if data:
                # 发送数据
                s.sendto(data.encode(), server_address)
            else:
                # 发送结束标志
                s.sendto(b'bye', server_address)
                # 文件中没有可读取的数据则退出
                break

        print('客户端上传数据完成。')

2.3测试

image.png image.png

如果您发现本文对你有所帮助,如果您认为其他人也可能受益,请把它分享出去。

上一篇下一篇

猜你喜欢

热点阅读