【python学习笔记】第11天

本文深入探讨了Python在TFTP客户端、UDP广播、TCP服务器及客户端的编程实践,提供了详细的代码示例,包括TFTP文件传输、TCP服务器与客户端通信、以及基于TCP的QQ聊天应用实现。

继续今天的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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值