zoukankan      html  css  js  c++  java
  • python:网络编程(udp 和 tcp)

    一、udp

    1、发送数据

    # 发送数据
    
    from socket import *
    
    # 创建udp套接字
    udp_socket = socket(AF_INET, SOCK_DGRAM)
    
    # 接收方的地址
    dest_addr = ('192.168.0.109', 8080)
    
    # 要发送的数据
    # send_data = 'hi~'
    send_data = input('请输入你要发送的数据:')
    
    # 发送数据到指定的电脑上的指定程序中
    udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
    
    # 关闭套接字
    udp_socket.close()
    View Code

    2、循环发送数据

    # 发送数据
    
    from socket import *
    
    # 创建udp套接字
    udp_socket = socket(AF_INET, SOCK_DGRAM)
    
    # 接收方的地址
    dest_addr = ('127.0.0.1', 8080)
    
    while True:
        # 要发送的数据
        # send_data = 'hi~'
        send_data = input('请输入你要发送的数据:')
    
        # 发送数据到指定的电脑上的指定程序中
        udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
    
    # 关闭套接字
    udp_socket.close()
    View Code

    3、接收数据

    from socket import *
    
    # 创建套接字
    udp_socket = socket(AF_INET, SOCK_DGRAM)
    
    # 绑定本地信息
    localaddr = ('', 8080)
    udp_socket.bind(localaddr)
    
    print('等待接收数据中....')
    
    # 接收数据
    # 1024:表示本次接收的最大字节数
    recv_data = udp_socket.recvfrom(1024)
    recv_msg = recv_data[0]
    from_addr = recv_data[1]
    print('来自{}的信息:{}'.format(str(from_addr), recv_msg.decode('gbk')))
    
    # 关闭套接字
    udp_socket.close()
    
    print('Done.')
    View Code

    4、循环接收数据

    from socket import *
    
    # 创建套接字
    udp_socket = socket(AF_INET, SOCK_DGRAM)
    
    # 绑定本地信息
    localaddr = ('', 8080)
    udp_socket.bind(localaddr)
    
    while True:
        print('等待接收数据中....')
        # 接收数据
        # 1024:表示本次接收的最大字节数
        recv_data = udp_socket.recvfrom(1024)
        recv_msg = recv_data[0]
        from_addr = recv_data[1]
        print('来自{}的信息:{}'.format(str(from_addr), recv_msg.decode('gbk')))
    
    # 关闭套接字
    udp_socket.close()
    
    print('Done.')
    View Code

    二、tcp

    1、客户端

    from socket import *
    
    # 1.创建套接字
    tcp_socket = socket(AF_INET, SOCK_STREAM)
    
    # 2.链接服务器
    server_ip = '192.168.0.108'
    server_port = 8899
    server_addr = (server_ip, server_port)
    tcp_socket.connect(server_addr)
    
    # 3.发送数据
    send_data = input('请输入你要发送的数据:')
    tcp_socket.send(send_data.encode('utf-8'))
    
    # 4.关闭套接字
    tcp_socket.close()
    View Code

    2、服务器

    from socket import *
    
    # 创建套接字
    tcp_server_socket = socket(AF_INET, SOCK_STREAM)
    
    # 绑定本地信息
    addr = ('', 8899)
    tcp_server_socket.bind(addr)
    
    # 让套接字由主动变为被动
    tcp_server_socket.listen(128)
    
    # 等待客户端链接
    print('-'*10 + '等待客户端链接' + '-'*10)
    new_client_sock, client_addr = tcp_server_socket.accept()
    print('-'*10 + '客户端' + str(client_addr) + '已连接上了' + '-'*10)
    
    # 接收客户端发送过来的数据
    recv_data = new_client_sock.recv(1024) # 最多接收 1024 个字节
    print('接收到的数据为:{}'.format(recv_data.decode('utf-8')))
    
    # 回送一部分数据给客户端
    new_client_sock.send('Success.'.encode('utf-8'))
    
    # 关闭套接字
    new_client_sock.close()
    tcp_server_socket.close()
    View Code

    3、循环-服务器

    from socket import *
    
    # 创建套接字
    tcp_server_socket = socket(AF_INET, SOCK_STREAM)
    
    # 绑定本地信息
    addr = ('', 8899)
    tcp_server_socket.bind(addr)
    
    # 让套接字由主动变为被动
    tcp_server_socket.listen(128)
    
    while True:
    
        # 等待客户端链接
        print('-'*10 + '等待客户端链接' + '-'*10)
        new_client_sock, client_addr = tcp_server_socket.accept()
        print('-'*10 + '客户端' + str(client_addr) + '已连接上了' + '-'*10)
    
        # 接收客户端发送过来的数据
        recv_data = new_client_sock.recv(1024) # 最多接收 1024 个字节
        print('接收到的数据为:{}'.format(recv_data.decode('utf-8')))
    
        # 回送一部分数据给客户端
        new_client_sock.send('Success.'.encode('utf-8'))
    
        # 关闭套接字
        new_client_sock.close()
    
    tcp_server_socket.close()
    View Code

    4、循环2-服务器

    from socket import *
    
    # 创建套接字
    tcp_server_socket = socket(AF_INET, SOCK_STREAM)
    
    # 绑定本地信息
    addr = ('', 8899)
    tcp_server_socket.bind(addr)
    
    # 让套接字由主动变为被动
    tcp_server_socket.listen(128)
    
    while True:
    
        # 等待客户端链接
        print('-'*10 + '等待客户端链接' + '-'*10)
        new_client_sock, client_addr = tcp_server_socket.accept()
        print('-'*10 + '客户端' + str(client_addr) + '已连接上了' + '-'*10)
    
        while True:
            # 循环,一直为这个客户端服务,知道客户端关闭连接为止
    
            # 接收客户端发送过来的数据
            recv_data = new_client_sock.recv(1024) # 最多接收 1024 个字节
            if recv_data:
                print('接收到的数据为:{}'.format(recv_data.decode('utf-8')))
    
                # 回送一部分数据给客户端
                new_client_sock.send('Success.'.encode('utf-8'))
            else:
                print('客户端{}已关闭连接.'.format(str(client_addr)))
                break
    
        # 关闭套接字
        new_client_sock.close()
    
    tcp_server_socket.close()
    View Code

    5、文件下载器:

    服务器:

    from socket import *
    
    def get_file_content(filename):
        try:
            with open(filename, 'rb') as f:
                content = f.read()
            return content
        except:
            print('没有该文件信息:' + filename)
    
    def main():
        # 创建套接字
        tcp_server_socket = socket(AF_INET, SOCK_STREAM)
        # 绑定本地信息
        addr = ('', 8899)
        tcp_server_socket.bind(addr)
        # 将主动套接字变为被动套接字
        tcp_server_socket.listen(128)
    
        while True:
            print('-'*10 + "等待客户端链接" + '-'*10)
            # 等待客户端连接
            new_client_socket, client_addr = tcp_server_socket.accept()
            print('-'*10 + "客户端" + str(client_addr) + "已连接" + '-'*10)
            # 接收对方发过来的数据
            recv_data = new_client_socket.recv(1024)
            # 数据为文件名称
            filename = recv_data.decode('utf-8')
            print('客户端请求下载的文件名为:' + filename)
            # 获取文件内容
            file_content = get_file_content(filename)
            # 因为获取打开文件时是以rb方式打开,所以file_content中的数据已经是二进制的格式,因此不需要encode编码
            if file_content:
                # 把数据发送给客户端
                new_client_socket.send(file_content)
            # 关闭客户端
            new_client_socket.close()
    
        # 关闭tcp 套接字
        tcp_server_socket.close()
    
    if __name__ == '__main__':
        main()
    View Code

    客户端:

    from socket import *
    
    def main():
        # 创建套接字
        tcp_client_socket = socket(AF_INET, SOCK_STREAM)
        # 链接服务器
        addr = ('192.168.0.108', 8899)
        tcp_client_socket.connect(addr)
        # 获取要下载的文件名
        filename = input('请输入你要下载的文件名:')
        # 发送文件下载请求
        tcp_client_socket.send(filename.encode('utf-8'))
        # 接收服务器返回的数据
        # 接收的数据是二进制的格式,不需要decode转码
        recv_data = tcp_client_socket.recv(1024)
        if recv_data:
            with open('[接收]' + filename, 'wb') as f:
                f.write(recv_data)
        else:
            print('服务器没有找到相关的文件!')
    
        # 关闭套接字
        tcp_client_socket.close()
    
    if __name__ == '__main__':
        main()
    View Code
  • 相关阅读:
    PHP二维数组排序(感谢滔哥lvtao.net)
    MySQL 日志的类型
    PHP安装Xdebug扩展并配置PHPstorm调试(Centos、Windows)
    $.post 和 $.get 设置同步和异步请求
    Jquery获取敲击回车时光标所在的位置
    Jquery 数组与字符串之间的转换
    使整个页面变灰的css代码
    PHP的性能优化方法总结
    Android中完全退出当前应用系统
    Android 遮罩层效果
  • 原文地址:https://www.cnblogs.com/KeenLeung/p/12487526.html
Copyright © 2011-2022 走看看