python:网络编程(udp 和 tcp)

一、udp

1、发送数据

python:网络编程(udp 和 tcp)
# 发送数据

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、循环发送数据

python:网络编程(udp 和 tcp)
# 发送数据

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、接收数据

python:网络编程(udp 和 tcp)
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、循环接收数据

python:网络编程(udp 和 tcp)
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、客户端

python:网络编程(udp 和 tcp)
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、服务器

python:网络编程(udp 和 tcp)
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、循环-服务器

python:网络编程(udp 和 tcp)
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-服务器

python:网络编程(udp 和 tcp)
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、文件下载器:

服务器:

python:网络编程(udp 和 tcp)
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

客户端:

python:网络编程(udp 和 tcp)
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

 

上一篇:linux socket编程recv、recvfrom、recvmsg函数详解


下一篇:C#阻塞模式和非阻塞模式