ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python:网络编程(udp 和 tcp)

2020-03-13 17:06:15  阅读:232  来源: 互联网

标签:udp socket python tcp server client recv addr


一、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

 

标签:udp,socket,python,tcp,server,client,recv,addr
来源: https://www.cnblogs.com/KeenLeung/p/12487526.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有