
测试UDP发送与接收数据
""" 网络编程
测试UDP发送与接收数据
"""
from socket import socket,AF_INET,SOCK_DGRAM
def use_udp_send_data():
"""使用UDP发送数据"""
s = socket(AF_INET,SOCK_DGRAM) # 创建UDP套接字
address = ('172.26.100.112',8080) # 接收方地址
send_data = input('请输入要发送的数据:')
s.sendto(send_data.encode('gbk'),address) # 发送数据时需要将字符串转成byte,编码格式为gbk
s.close() # 关闭套接字
def use_udp_send_receive_data():
"""使用UDP发送与接收数据"""
s = socket(AF_INET,SOCK_DGRAM)
s.bind(('',8788)) # 绑定一个地址(即ip与端口号,ip一般不用写)
address = ('172.26.100.112',8080) # 接收方地址
send_data = input('请输入要发送的数据:')
s.sendto(send_data.encode('gbk'), address) # 发送数据时需要将字符串转成byte,编码格式为gbk
receive_data = s.recvfrom(1024) # 1024为本次接收的最大字节数
print('接收到数据:{}'.format(receive_data[0].decode('gbk')))
s.close()
if __name__ == '__main__':
use_udp_send_receive_data()
""" 网络编程
使用多线程、UDP实现聊天
"""
from socket import socket,AF_INET,SOCK_DGRAM
from threading import Thread
udp_socket = socket(AF_INET,SOCK_DGRAM) # 创建socket
udp_socket.bind(('',8989)) # 绑定端口
def receive_data():
"""接收数据"""
while True:
data = udp_socket.recvfrom(1024) # 1024为本次接收的最大字节数
print('\n来自{}:{}'.format(data[1],data[0].decode('gbk')))
def send_data():
"""发送数据"""
while True:
address = ('172.26.100.112', 8080) # 接收方地址
data = input('请输入要发送的数据:')
udp_socket.sendto(data.encode('gbk'), address) # 发送数据时需要将字符串转成byte,编码格式为gbk
if __name__ == '__main__':
t1 = Thread(target=send_data)
t2 = Thread(target=receive_data)
t1.start()
t2.start()
t1.join()
t2.join()
TFTP文件下载器
TFTP(简单文件传输协议),使用此协议可以实现简单文件的下载,端口号为69
实现:从服务器上将一个文件复制到本机上
过程:在本地创建一个空文件(与下载文件同名)–>向文件内写入数据–>关闭
"""示例:TFTP文件下载客户端"""
from struct import pack,unpack
from socket import *
file_name = 'face.jpg' # 要下载的文件名称
server_ip = '127.0.0.1' # 下载的目标服务器ip地址
send_data = pack('!H{}sb5sb'.format(len(file_name)),1,file_name.encode(),0,'octet'.encode(),0) # 向服务器发送的数据
s = socket(AF_INET,SOCK_DGRAM) # 创建socket
s.sendto(send_data,(server_ip,69)) # 发送数据
file = open(file_name,'ab') # 以追加方式打开,二进制
while True:
receive_data = s.recvfrom(1024) # 接收数据 1024为最大数据量
i,j = unpack('!HH',receive_data[0][:4]) # 获取数据块编号
rand_port = receive_data[1][1] # 获取服务器随机端口
if int(i) == 5:
print('文件不存在')
break
print('操作码:{},ACK:{},服务器随机端口:{},数据长度:{}'.format(i,j,rand_port,len(receive_data[0])))
file.write(receive_data[0][4:]) # 向文件写入数据
if len(receive_data[0]) < 516:
break
ack_data = pack('!HH',4,j)
s.sendto(ack_data,(server_ip,rand_port)) # 发送ACK确认包
TCP服务器端接收数据
from socket import *
server_socket = socket(AF_INET,SOCK_STREAM) # 创建socket
server_socket.bind(('',8899)) # 绑定端口
server_socket.listen(5) # 设置最大等待数
client_socket,client_info = server_socket.accept() # 获取客户端socket以及客户端信息
receive_data = client_socket.recv(1024) # 获取客户端请求数据
print('{}:{}'.format(str(client_info),receive_data.decode('gbk')))
client_socket.close()
server_socket.close()
使用TCP模拟QQ聊天(一问一答)
from socket import *
def server_machine():
"""服务器端"""
# 创建服务器端套接字对象
server_socket = socket(AF_INET,SOCK_STREAM)
# 绑定端口
server_socket.bind(('',8888))
# 监听
server_socket.listen()
# 等待客户端连接
client_socket,client_info = server_socket.accept()
while True:
# 接收客户端消息
receive_data = client_socket.recv(1024)
print('{}:{}'.format(client_info,receive_data.decode('uft-8')))
# 发送消息
message = input('我:')
client_socket.send(message.encode('utf-8'))
def client_machine():
"""客户端"""
# 创建服务器端套接字对象
client_socket = socket(AF_INET, SOCK_STREAM)
# 与服务器建立连接
client_socket.connect(('172.26.100.112',8888))
while True:
# 客户端发送消息
message = input('我:')
client_socket.send(message.encode('uft-8'))
# 接收消息
receive_data = client_socket.recv(1024)
print('服务器端:{}'.format(receive_data.decode('utf-8')))