<b/s与c/s
在网络软件开发中,经常会提到b/s模式与c/s模式。两种模式代表了两种不同的软件架构。下面我们将从不同的角度进行阐述。
一、基本概念
b/s模式
b/s模式即浏览器/服务器模式,是通过浏览器对Web服务器提交请求,Web服务器接收请求并处理并返回结果,浏览器解析结果并呈现给用户。
//b/s模式示例代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
<p>这是一份经典的Hello World程序,通过浏览器请求Hello World服务器,服务器返回Hello World进行解析呈现给用户。</p>
</body>
</html>
c/s模式
c/s模式即客户端/服务器模式,是指在计算机领域中可以将系统分成服务端和客户端两部分,服务端提供数据服务,客户端对服务端发出请求,并接收服务器端的数据,然后对其进行操作和处理。
//c/s模式示例代码
//服务端
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 8888))
server.listen()
while True:
conn, address = server.accept()
print(f'Connection from {address} has been established!')
conn.send(bytes('Welcome to the server!', 'utf-8'))
conn.close()
//客户端
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('localhost', 8888))
message = client.recv(1024)
print(message.decode('utf-8'))
client.close()
二、优缺点比较
b/s模式
b/s模式的优势在于无需下载任何软件就可以直接使用,界面友好、易于操作,广泛应用于各种网站。但缺点也很明显,多人同时访问时经常会出现堵塞,同时也存在安全性、可扩展性等问题。
c/s模式
c/s模式的强大之处在于可以脱离浏览器的限制,更为灵活自由,同时可以充分利用计算机资源,客户端也可以对数据进行本地处理,在数据传输、安全性方面也比较完善。但缺点是需要客户端软件的支持,且运行环境多样,存在着兼容性问题。
三、案例分析
b/s模式案例
以网上购物为例,b/s模式可以通过大型购物平台引导消费者进入网站,消费者可以在平台上浏览和购买商品。根据消费者的数据请求,购物平台服务器相应的返回数据并进行处理,消费者接收到平台的响应信息后,进行操作界面进行操作。
//网上购物b/s模式代码示例
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>购物平台</title>
</head>
<body>
<h1>欢迎来到购物平台!</h1>
<p>请在下方选择想要购买的商品:</p>
<form action="shopping.php" method="post">
<input type="checkbox" name="product" value="apple">苹果:5元/个
<br>
<input type="checkbox" name="product" value="banana">香蕉:3元/个
<br>
<input type="checkbox" name="product" value="orange">橙子:4元/个
<br>
<input type="submit" value="提交">
</form>
<p>已选商品:<span id="result"></span></p>
<script>
function showResult(){
let result = "";
let checkboxes = document.getElementsByName("product");
for(let i=0; i<checkboxes.length; i++){
if(checkboxes[i].checked===true){
result += checkboxes[i].value + " ";
}
}
document.getElementById("result").innerHTML = result;
}
showResult();
</script>
</body>
</html>
c/s模式案例
以在线游戏为例,c/s模式可以通过客户端软件与服务端建立连接,客户端可以获取服务端实时更新的游戏状态数据,并进行相应的操作和处理。在客户端上还可以进行一系列操作和处理,例如聊天、好友、游戏记录等等。
//在线游戏c/s模式代码示例
//服务端
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 8888))
server.listen()
games = {
'1001': {
'player1': {'pos_x': 0, 'pos_y': 0},
'player2': {'pos_x': 100, 'pos_y': 100}
}
}
def clientThread(conn, address, game_id):
game = games[game_id]
player = ''
for k, v in game.items():
if not v:
game[k] = {'address': address, 'conn': conn}
player = k
break
conn.send(bytes(f'{player} {game[player^1]["address"][0]} {game[player^1]["address"][1]}', 'utf-8'))
while True:
data = conn.recv(1024)
if not data:
break
player_data = data.decode().split(" ")
game[player]['pos_x'] = int(player_data[1])
game[player]['pos_y'] = int(player_data[2])
conn.sendall(bytes(f'{game[player^1]["pos_x"]} {game[player^1]["pos_y"]}', 'utf-8'))
game[player] = {}
while True:
conn, address = server.accept()
game_id = conn.recv(1024).decode()
thread = threading.Thread(target=clientThread, args=(conn, address, game_id))
thread.start()
//客户端
import socket
class player:
def __init__(self, pos_x=0, pos_y=0):
self.pos_x = pos_x
self.pos_y = pos_y
def update_pos(self, pos_x, pos_y):
self.pos_x = pos_x
self.pos_y = pos_y
def get_pos(self):
return (self.pos_x, self.pos_y)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('localhost', 8888))
player1 = player()
player2 = player()
def send_position(player):
input("回车开始移动")
print("移动方向键盘上下左右,q退出")
while True:
if keyboard.is_pressed('q'):
break
if keyboard.is_pressed('up'):
player.pos_y -= 10
if keyboard.is_pressed('down'):
player.pos_y += 10
if keyboard.is_pressed('left'):
player.pos_x -= 10
if keyboard.is_pressed('right'):
player.pos_x += 10
data = f'{player.get_pos()[0]} {player.get_pos()[1]}'
client.send(bytes(data, 'utf-8'))
data = client.recv(1024).decode().split(" ")
player2.update_pos(int(data[0]), int(data[1]))
if __name__ == "__main__":
#选择游戏房间
game_id = input("请输入游戏房间号:")
#启动线程
t1 = threading.Thread(target=send_position, args=(player1,))
t2 = threading.Thread(target=send_position, args=(player2,))
t1.start()
t2.start()
t1.join()
t2.join()
client.close()
原创文章,作者:PPQSF,如若转载,请注明出处:https://www.506064.com/n/369712.html