python:网络编程(udp 和 tcp)

Posted 若岁月轻狂,愿你可以笑看夕阳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于python:网络编程(udp 和 tcp)的主要内容,如果未能解决你的问题,请参考以下文章

Python之UDP编程

python socket编程tcp/udp俩连接

python网络编程实现TCP和UDP连接

Python web编程 初识TCP UDP

python学习之TCP/UDP

Python 网络编程 TCP/UDP