栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

网络编程实验三

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

网络编程实验三

用python语言编写客户端与服务器程序 一、设计思路,程序流程图 1、客户端程序需完成功能:

1)从名为’pswd.txt’的文件中读取密码。
2)把密码发送到服务器程序。
3)显示服务器程序的返回结果

2、服务器程序需完成功能:

1)接受来自客户端程序发送的密码。
2)显示客户端的socket信息(IP地址,端口号)
3)验证密码是否正确(正确的密码为“123456”)
4)密码正确发送”correct”,否则返回”false”

二、程序源代码
#客户端代码client.py  
#1)从名为’pswd.txt’的文件中读取密码。  
#2)把密码发送到服务器程序。  
#3)显示服务器程序的返回结果  
  
import socket  
  
def getPassWordFromTxt(filepath='.pswd.txt'):  
    with open(filepath, 'r') as f:  
        return f.read()  
  
def main():  
    client = socket.socket()  
    client.connect(('127.0.0.1', 10086))  
    string = getPassWordFromTxt()  
    print('发送密码文件中内容:'+string)  
    client.send(string.encode('utf-8'))  
    recvData = client.recv(1024).decode('utf-8')  
    while True:  
        if recvData=='correct':  
            print('收到服务端信息:'+recvData)  
            break  
        else:  
            print('收到服务端信息:'+recvData)  
            recvData = client.recv(1024).decode('utf-8')  
    client.close()  
  
if __name__ == '__main__':  
    main()

#服务器代码server.py  
#1)接受来自客户端程序发送的密码。  
#2)显示客户端的socket信息(IP地址,端口号)  
#3)验证密码是否正确(正确的密码为“123456”)  
#4)密码正确发送”correct”,否则返回”false”  
  
import socket  
  
def main():  
    #password = '123454'  
    server = socket.socket()  
    server.bind(('127.0.0.1', 10086))  
    server.listen(1)  
    conn, addr = server.accept()  
    print("与客户端连接:"+str(addr))  
    recvData = conn.recv(1024).decode('utf-8')  
    print("收到客户端发来的密码:"+recvData)  
    password = input("请输入验证密码:")  
    while True:  
        if recvData == password:  
            conn.send(("correct").encode('utf-8'))  
            print("验证成功")  
            break  
        else:  
            conn.send(("false").encode('utf-8'))  
            password = input("验证失败,请重新输入:")  
    server.close()  
  
if __name__ == '__main__':  
    main()

三、实验运行结果

客户端:

服务器:

txt文件

猜数字游戏 一、设计思路,程序流程图

服务器上存储了一个0到1,000,000之间的整数,接收来自客户端猜测的数字,如果数字与服务器数字相等则发送成功,否则如果猜测的数字大于服务器上数字则发送“big”,小于则发送“small”。服务器统计每个客户端猜测正确所需次数,选出猜测次数最小的成为获胜者,并公布所有客户端的成绩。

二、程序源代码
#客户端程序client.py  
  
import socket, random, time  
  
def main():  
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
    client.connect(('127.0.0.1', 10086))  #不同客户端应使用不同端口号  
    time.sleep(3)  
    maxGuess = 1000000  
    minGuess = 0  
    while True:  
        guessNum = random.randint(minGuess, maxGuess)  
        client.send(str(guessNum).encode('utf-8'))  
        recvData = client.recv(1024).decode('utf-8')  
        if recvData == 'big':  
            maxGuess = guessNum  
        elif recvData == 'small':  
            minGuess = guessNum  
        elif recvData == 'correct':  
            print('已猜到正确数字:'+str(guessNum))  
            break  
                  
if __name__ == '__main__':  
    main()
#服务器程序server.py  
  
import socket, random, time  
import threading  
  
connAndTimes = {} #存放连接的客户端信息以及其猜数次数,key:(ip, address), value:尝试次数  
acceptStatus = True # 指示应该开多线程  
  
def acceptAndGuess(serverSocket, correctNum):  
    global connAndTimes  
    global acceptStatus  
    conn, addr = serverSocket.accept()  
    connAndTimes[str(addr)] = 0  
    acceptStatus = True # 指示应该开新线程接收等待新的客户端连接  
    print("第"+str(len(connAndTimes))+"个客户端接入: "+str(addr))  
    while True:  
        recvNum = int(conn.recv(1024).decode('utf-8'))  
        connAndTimes[str(addr)] += 1  
        if recvNum > correctNum:  
            conn.send("big".encode('utf-8'))  
        elif recvNum < correctNum:  
            conn.send("small".encode('utf-8'))  
        elif recvNum == correctNum:  
            conn.send('correct'.encode('utf-8'))  
            break  
    print("客户端"+str(addr)+"已尝试出正确答案,尝试次数:"+str(connAndTimes[str(addr)]))  
  
def main():  
    global connAndTimes  
    global acceptStatus  
    # ipv4 tcp 协议 socket  
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
    server.bind(('127.0.0.1', 10086))  
    server.listen(5)  
    threads = [] # 存储线程列表  
    correctNum = random.randint(0, 1000000)  
    print("随机谜底为:"+str(correctNum))  
    while True:  
        if acceptStatus:  
            acceptStatus = False  
            threads.append(threading.Thread(target=acceptAndGuess, args=[server, correctNum], daemon=True))  
            threads[-1].start()  
            timeTick = time.time()  
        if time.time() - timeTick > 10:  
            print("超过 10 秒无客户端接入,停止监听。当前参与猜数游戏的客户端数量:"+str(len(connAndTimes)))  
            break  
      
# 判断与客户端通信的线程是否结束  
    flag = True  
    while flag:  
        flag = False  
        for thread in threads[0:-1]:  
            if thread.is_alive():  
                flag = True  
                  
# 找优胜者  
    print("2")  
    if len(connAndTimes)>0:  
        minTimes = min(connAndTimes.values())  
        minConn = []  
        for key, value in connAndTimes.items():  
            if value == minTimes:  
                minConn.append(key)  
        # 输出优胜者信息,输出所有客户端信息  
        print(str(len(connAndTimes))+'个客户端都已完成猜数')  
        print("优胜者是客户端:"+str(minConn)+". 猜数次数是:"+str(minTimes))  
        print("所有客户端及其猜数次数如下")  
        print(str(connAndTimes))  
    else:  
        print("0 个客户端参与本轮游戏")  
  
      
if __name__ == "__main__":  
    main()

三、实验运行结果

各客户端运行结果:

服务器运行结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1022230.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号