测试UDP发送与接收数据

""" 网络编程
    测试UDP发送与接收数据
"""

from socket import socket,AF_INET,SOCK_DGRAM

def use_udp_send_data():
    """使用UDP发送数据"""
    s = socket(AF_INET,SOCK_DGRAM)  # 创建UDP套接字
    address = ('172.26.100.112',8080)    # 接收方地址
    send_data = input('请输入要发送的数据:')
    s.sendto(send_data.encode('gbk'),address)   # 发送数据时需要将字符串转成byte,编码格式为gbk
    s.close()   # 关闭套接字

def use_udp_send_receive_data():
    """使用UDP发送与接收数据"""
    s = socket(AF_INET,SOCK_DGRAM)
    s.bind(('',8788)) # 绑定一个地址(即ip与端口号,ip一般不用写)
    address = ('172.26.100.112',8080)    # 接收方地址
    send_data = input('请输入要发送的数据:')
    s.sendto(send_data.encode('gbk'), address)  # 发送数据时需要将字符串转成byte,编码格式为gbk
    receive_data = s.recvfrom(1024) # 1024为本次接收的最大字节数
    print('接收到数据:{}'.format(receive_data[0].decode('gbk')))
    s.close()

if __name__ == '__main__':
    use_udp_send_receive_data()
""" 网络编程
    使用多线程、UDP实现聊天
"""

from socket import socket,AF_INET,SOCK_DGRAM
from threading import Thread

udp_socket = socket(AF_INET,SOCK_DGRAM)     # 创建socket
udp_socket.bind(('',8989))      # 绑定端口

def receive_data():
    """接收数据"""
    while True:
        data = udp_socket.recvfrom(1024)   # 1024为本次接收的最大字节数
        print('\n来自{}:{}'.format(data[1],data[0].decode('gbk')))

def send_data():
    """发送数据"""
    while True:
        address = ('172.26.100.112', 8080)  # 接收方地址
        data = input('请输入要发送的数据:')
        udp_socket.sendto(data.encode('gbk'), address)  # 发送数据时需要将字符串转成byte,编码格式为gbk

if __name__ == '__main__':
    t1 = Thread(target=send_data)
    t2 = Thread(target=receive_data)
    t1.start()
    t2.start()
    t1.join()
    t2.join()

TFTP文件下载器

TFTP(简单文件传输协议),使用此协议可以实现简单文件的下载,端口号为69

实现:从服务器上将一个文件复制到本机上

过程:在本地创建一个空文件(与下载文件同名)–>向文件内写入数据–>关闭

"""示例:TFTP文件下载客户端"""
from struct import pack,unpack
from socket import *

file_name = 'face.jpg'  # 要下载的文件名称
server_ip = '127.0.0.1'  # 下载的目标服务器ip地址
send_data = pack('!H{}sb5sb'.format(len(file_name)),1,file_name.encode(),0,'octet'.encode(),0)  # 向服务器发送的数据
s = socket(AF_INET,SOCK_DGRAM)  # 创建socket
s.sendto(send_data,(server_ip,69))  # 发送数据
file = open(file_name,'ab') # 以追加方式打开,二进制
while True:
    receive_data = s.recvfrom(1024) # 接收数据  1024为最大数据量
    i,j = unpack('!HH',receive_data[0][:4]) # 获取数据块编号
    rand_port = receive_data[1][1]  # 获取服务器随机端口

    if int(i) == 5:
        print('文件不存在')
        break
    print('操作码:{},ACK:{},服务器随机端口:{},数据长度:{}'.format(i,j,rand_port,len(receive_data[0])))
    file.write(receive_data[0][4:]) # 向文件写入数据
    if len(receive_data[0]) < 516:
        break
    ack_data = pack('!HH',4,j)
    s.sendto(ack_data,(server_ip,rand_port))    # 发送ACK确认包

TCP服务器端接收数据

from socket import *

server_socket = socket(AF_INET,SOCK_STREAM) # 创建socket
server_socket.bind(('',8899))   # 绑定端口
server_socket.listen(5) # 设置最大等待数
client_socket,client_info = server_socket.accept()  # 获取客户端socket以及客户端信息
receive_data = client_socket.recv(1024) # 获取客户端请求数据
print('{}:{}'.format(str(client_info),receive_data.decode('gbk')))
client_socket.close()
server_socket.close()

使用TCP模拟QQ聊天(一问一答)

from socket import *

def server_machine():
    """服务器端"""
    # 创建服务器端套接字对象
    server_socket = socket(AF_INET,SOCK_STREAM)
    # 绑定端口
    server_socket.bind(('',8888))
    # 监听
    server_socket.listen()
    # 等待客户端连接
    client_socket,client_info = server_socket.accept()
    while True:
        # 接收客户端消息
        receive_data = client_socket.recv(1024)
        print('{}:{}'.format(client_info,receive_data.decode('uft-8')))
        # 发送消息
        message = input('我:')
        client_socket.send(message.encode('utf-8'))

def client_machine():
    """客户端"""
    # 创建服务器端套接字对象
    client_socket = socket(AF_INET, SOCK_STREAM)
    # 与服务器建立连接
    client_socket.connect(('172.26.100.112',8888))
    while True:
        # 客户端发送消息
        message = input('我:')
        client_socket.send(message.encode('uft-8'))
        # 接收消息
        receive_data = client_socket.recv(1024)
        print('服务器端:{}'.format(receive_data.decode('utf-8')))

发表回复