继续今天的python学习
今日学习关键字:TFTP客户端,udp广播,tcp服务器,tcp客户端。
由于今天下载到了课件,课件上的内容也很完备,所以今日就只记录放出的代码啦
TFTP客户端:
from socket import *
import struct
import sys
import os
if len(sys.argv) != 2:
print('-'*30)
print("tips:")
print("python xxxx.py 192.168.1.1")
print('-'*30)
exit()
else:
ip = sys.argv[1]
# 创建udp套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
#构造下载请求数据
cmd_buf = struct.pack("!H8sb5sb",1,"test.jpg".encode("utf-8"),0,"octet".encode("utf-8"),0)
#发送下载文件请求数据到指定服务器
sendAddr = (ip, 69)
udpSocket.sendto(cmd_buf, sendAddr)
p_num = 0
recvFile = ''
#检测文件是否已经存在
try:
os.remove("./test.jpg")
print("成功删除文件!!")
except:
print("该文件不存在!!")
while True:
# 接收消息数据和地址
recvData,recvAddr = udpSocket.recvfrom(1024)
recvDataLen = len(recvData)
# 常用print来调试代码
# print recvAddr # for test
# print len(recvData) # for test
#对收到的数据进行解包
cmdTuple = struct.unpack("!HH", recvData[:4])
# print cmdTuple # for test
# 第一位代表操作码
cmd = cmdTuple[0]
# 第二位代表块编号(用于反馈信息
currentPackNum = cmdTuple[1]
if cmd == 3: #是否为数据包
# 如果是第一次接收到数据,那么就创建文件
if currentPackNum == 1:
recvFile = open("test.jpg", "ab")
# 包编号是否和上次相等
if p_num+1 == currentPackNum:
recvFile.write(recvData[4:]);
p_num +=1
print ('(%d)次接收到的数据'%(p_num))
ackBuf = struct.pack("!HH",4,p_num)
udpSocket.sendto(ackBuf, recvAddr)
# 如果收到的数据小于516则认为出错
if recvDataLen<516:
recvFile.close()
print ('已经成功下载!!!')
break
elif cmd == 5: #是否为错误应答
print ("error num:%d"%currentPackNum)
break
udpSocket.close()
上面的代码是基本是课件上的代码,只是修改成了python3的版本
TCP服务器:
from socket import *
# Create a socket for tcp.
tcpSocket = socket(AF_INET, SOCK_STREAM)
# Bind ip and port
tcpSocket.bind(("",6789))
tcpSocket.listen(5)
newSocket, clientAddr = tcpSocket.accept()
recvData = newSocket.recv(1024)
print("接收到的数据:", recvData.decode("gb2312"))
sendData = input("请输入要发送的数据:")
newSocket.send(sendData.encode("gb2312"))
newSocket.close()
tcpSocket.close()
TCP客户端:
from socket import *
tcpClient = socket(AF_INET, SOCK_STREAM)
serverAddr = ("192.168.78.1", 8855)
tcpClient.connect(serverAddr)
tcpClient.send("Hello world.".encode("gb2312"))
recvData = tcpClient.recv(1024)
print("收到的消息:", recvData.decode("gb2312"))
tcpClient.close()
TCP实现qq聊天(客户端):
from socket import *
#创建套接字
tcpClient = socket(AF_INET, SOCK_STREAM)
#连接服务器
serverAddr = ("192.168.78.144", 7788)
tcpClient.connect(serverAddr)
#通讯开始
while True:
#向服务器发送数据
sendData = input("请输入要发送的数据:")
#判断客户端是否结束
if len(sendData) > 0:
tcpClient.send(sendData.encode("gb2312"))
else:
break
#接收服务器发送的数据
recvData = tcpClient.recv(1024)
print("收到的数据: %s" % recvData.decode("gb2312"))
tcpClient.close()
TCP实现qq聊天(服务器):
from socket import *
#创建套接字
tcpServer = socket(AF_INET, SOCK_STREAM)
#绑定端口
bindAddr = ("", 7788)
tcpServer.bind(bindAddr)
#设置为listen
tcpServer.listen(5)
while True:
newServer, clientAddr = tcpServer.accept()
while True:
#接收数据
recvData = newServer.recv(1024)
if len(recvData) > 0:
print("收到的数据: %s" % recvData.decode("gb2312"))
else:
break
#发送数据
sendData = input("请输入要发送的数据:")
newServer.send(sendData.encode("gb2312"))
newServer.close()
tcpServer.close()