网络安全与程序设计实验二:Socket编程(客户端与服务端)

1. 实验目的

运用Socket API设计和实现网络编程。该实验旨在培养学生的以下能力:

  • (1)理解Socket编程原理;
  • (2)熟练运用Socket API;
  • (3)结合实际场景提出网络编程想定;
  • (4)设计和实现服务器端和客户端程序

3. 算法要求

(1) 结合实际场景,提出网络编程想定(即设想),自行确定功能需求;
(2) 设计和实现服务端程序、客户端程序;
(3) 测试功能。

4. 编程示例

(1) 功能确定如下:
a. 服务器端:产生随机模除计算题目,向用户提问,根据用户提交的答案,评分,并记录总分。
b. 客户端:回答服务器端提出的问题。
(2) 主要代码
a. 服务器端
b. 客户端

答案

  • 服务端
import socket
import time
import random
def SocketServer(srv_ip, back_log):
    # 创建一个Socket连接,使用 tcp/ip 流式
    srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # print(socket.SOL_SOCKET,socket.SO_REUSEADDR)
    srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    # 绑定端口号
    srv.bind(srv_ip)
    # 创建侦听、连接池,最大监听数为5
    srv.listen(back_log)
    return srv


def plz_generator():
    # 生成题目
    a = random.randint(20, 1000)
    b = random.randint(20, 1000)
    c = 20
    ans = pow(a, b, c)
    plz_description = str(a) + " ^ " + str(b) + " mod 20 = ?,回答?的数值"
    return ans, plz_description


def plz_judger(ANS, ANS_CLT, SCORE_CURRENT):
    if ANS == ANS_CLT:
        SCORE_CURRENT += 10
        RESULT = ("太强了吧!!!\n" + "【当前分数】:" + str(SCORE_CURRENT) + "\n").encode('utf-8')
    else:
        SCORE_CURRENT -= 5
        RESULT = ("弱爆了...\n" + "【当前分数】:" + str(SCORE_CURRENT) + "\n").encode('utf-8')
    return RESULT, SCORE_CURRENT


srv_ip = ('127.0.0.1', 2333)
back_log = 5
buffer_size = 1024
srv = SocketServer(srv_ip, back_log)

# 创建一个多线程,为每个线程的客户端建立相同的业务流程。
# 阻塞等待,创建连接
# 在这个位置进行等待,监听端口号
con, address = srv.accept()
score = 0
username = "A"
while 1:
    ans, plz_description = plz_generator()
    # 发送题目
    con.send(plz_description.encode('utf-8'))
    # 接受套接字的大小,接收答案
    msg = con.recv(buffer_size)
    if msg.decode('utf-8') == '1':
        # 断开连接
        con.close()
    try:
        ans_clt = int(msg.decode('utf-8'))
    except Exception:
        con.send("你在干什么?????".encode('utf-8'))
        continue
    # 打印对方回复
    print('【' + username + '】: ', msg.decode('utf-8'))
    # 回复评分结果
    response, score = plz_judger(ans, ans_clt, score)
    con.send(response)
  • 客户端
import socket

# 创建一个Socket连接,使用 tcp/ip 流式
clt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv_ip = ('127.0.0.1', 2333)
buffer_size = 1024

# 绑定端口号
clt.connect(srv_ip)

while 1:
    # 接收谜题
    msg_recieve = clt.recv(buffer_size)
    print("【谜题】:"+msg_recieve.decode('utf-8'))
    # 输入答案
    msg_send = input()
    clt.send(msg_send.encode("utf-8"))
    print("(已发送我的答案):"+msg_send)
    # 临时的逻辑,正常为一个线程,得到回复(对错)
    msg_recieve = clt.recv(buffer_size)
    print("【评价】:"+msg_recieve.decode('utf-8'))

猜你喜欢

转载自blog.csdn.net/weixin_41504611/article/details/129436897
今日推荐