1)从名为’pswd.txt’的文件中读取密码。
2)把密码发送到服务器程序。
3)显示服务器程序的返回结果
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()
三、实验运行结果
各客户端运行结果:
服务器运行结果:



