网络编程

centuryw4年前 (2020-03-01)Python402

测试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')))

    相关文章

    json模块使用

    json模块使用

    注意: json中的字符串都是双引号引起来的如果不是双引号eval:能实现简单的字符串和python类型的转化replace:把单引号替换为双引号往一个文件中写入多个jso...

    xpath使用

    xpath使用

    w3school教程 使用注意: 节点选择语法...

    flask笔记

    flask笔记

    相关文档 第一个应用程序 # 导入Flask扩展 from flask import Flask # 创建Flask应用程序实例(需要传入__name__,作用是为了...

    time库的使用

    time库的使用

    time库是Python提供的处理时间的标准库。time库提供系统级精确计时器的计时功能,可以用来分析程序性能,也可以让程序暂停运行时间。 time库概述 t...

    wordcloud(词云)库的使用

    wordcloud(词云)库的使用

    说明: 词云以词语为基本单元,根据其在文本中出现的 频率设计不同大小以形成视觉上不同效果,形成 “关键词云层”或“关键词渲染” ,从而使读者 只要“一瞥”即可领略...

    Scikit-learn库(机器学习工具)

    介绍 Python语言的机器学习工具Scikit-learn包括许多知名的机器学习算法的实现Scikit-learn文档完善,容易上手,丰富的API,使其在学术界颇受欢迎...

    发表评论

    访客

    看不清,换一张

    ◎欢迎参与讨论,请在这里发表您的看法和观点。