Python 网络通信

Python 网络通信

UDP 网络通信

UDP 没有严格的服务端 和 客户端的区别 不管对方是否能接收 都会发送

发送

import socket

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 第一个参数 是发生的数据 第二个参数是 地址 和 端口号 是一个元组
info = input('发送的消息')
s.sendto(info.encode('utf8'),('192.168.8.34',9000))

s.close()

接收

recvfrom() 是阻塞方法所以只能单个发送

import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('192.168.8.34',9000)) # 绑定指定的端口 和 ip地址
date = s.recvfrom(1024) # 阻塞接收
print(date)

s.close()

TCP 网络通信

TCP 是区分客户端和服务端的 必须要确定对方能接收 才会发送

客户端

import socket
# 基于tcp的socket连接
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# TCP 必须要和服务端建立连接才能 发送请求
s.connect(('192.168.8.34',9000))
s.send('hello python'.encode('utf8'))
s.close()

服务端

import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定地址
s.bind(('192.168.8.34',9000))
# 128 表示 最大请求数
s.listen(128) # 把socket 变成一个被动的监听器
one,two = s.accept() #  拆包
x = one.recv(1024) # 1024 表示 每一次获取的数据大小
print(x) #   返回  b'hello python'  返回的数据在第一个元组中
# 返回 一个元组 第0个数据是 客户端的 socket 连接 第一个是客户端的ip地址和端口号
# (<socket.socket fd=364,
# family=AddressFamily.AF_INET,
# type=SocketKind.SOCK_STREAM,
# proto=0,
# laddr=('192.168.8.34', 9000),
# raddr=('192.168.8.34', 1158)>,
# ('192.168.8.34', 1158))

例子 文件下载 TCP

客户端

import socket
# 基于tcp的socket连接
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# TCP 必须要和服务端建立连接才能 发送请求
s.connect(('192.168.8.34',9000))
name = input('输入你要下载的文件名')

s.send(name.encode('utf8'))

with open(name,'wb') as file:
    while True:
        f = s.recv(1024)
        if not f:
            break
        file.write(f)


s.close()

服务端

import socket
import os
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('192.168.8.34',9000))
# 128 表示 最大请求数
s.listen(128) # 把socket 变成一个被动的监听器
cli_socket,cli_addr = s.accept() #  拆包
name = cli_socket.recv(128)
if os.path.exists(name):
    with open(name,'rb') as file:
        f = file.read(1024)
        print(f)
    cli_socket.send(f)
else:
    print('没有该文件')



posted @ 2021-08-20 12:36  zhiy  阅读(56)  评论(0)    收藏  举报