- 功能说明:一个小型客服服务系统包括客户端和服务端,客户端通过访问服务端来获取相关的服务,服务端对客户端的数据请求作出合理的回复
- 代码实现
- 服务器端代码实现:
import socket
def main():
# 买个手机:创建套接字,以下用手机来帮助理解服务器的工作流程
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 插入手机卡:绑定本地信息
tcp_server_socket.bind(("", 7890))
# 将手机设置为正常的响铃模式:让默认的套接字由主动变为被动,listen(也可以理解为原来的手机只能打电话不能接电话而现在就可以接电话,监听套接字只负责接电话不负责为其服务)
tcp_server_socket.listen(128)
print("---tcp聊天器系统服务器---")
while True: # 循环为多个客户端服务
print("输入y开启服务器,输入n关闭服务器")
is_ = input("请输入要执行的操作:")
if is_ == "n":
break
if is_ == "y":
print("服务器已开启")
print("客户端请求中……")
# 等待别人打电话到来:等待客户端连接,accept
new_client_server_socket,client_addr = tcp_server_socket.accept() # accept()的返回值是一个元祖,且元祖固定有连个元素,分别为服务套接字和客户端的IP地址及端口号,这里用解包来传值,该部分会堵塞,当有客户端发送连接请求是会释放堵塞(就类似于input从键盘输入数据,必须在键盘输入数据才能运行下一行程序)
print("客户端请求成功,客户端的IP地址为%s,端口号为%d" % (client_addr[0], client_addr[1]))
print("回复exit可以退出当前客户端服务")
while True: # 循环为一个客户端服务
# 接受客户端的请求
print("等待客户端输入请求……")
recv_data = new_client_server_socket.recv(1024).decode("utf-8") # 这里的recv_data是一个普通的数据而不是一个元祖
print("客户端输入为%s" % recv_data)
if recv_data == "exit":
break
# 会送一部分数据给客户端
server_send = input("服务器回复为:")
new_client_server_socket.send(server_send.encode("utf-8"))
if server_send == "exit":
break
# 关闭套接字
new_client_server_socket.close()
print("客户服务完毕,开始下一个客户端的服务")
print("服务器已关闭")
tcp_server_socket.close()
if __name__ == "__main__":
main()
- 客户端代码实现:
import socket
def main():
# 2.链接服务器
print("---tcp聊天器系统客户端---")
print("输入字母y进入聊天系统,输入字母n推出聊天系统")
is_ = input("请输入要执行的操作:")
if is_ == "y":
print("客户端以开启")
while True: # 循环链接服务器
# 1.创建tcp的套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_ip = input("请输入要链接的服务器ip:")
server_port = int(input("请输入要链接的端口:"))
tcp_socket.connect((server_ip,server_port)) # 此处会有堵塞,只有链接成功才会执行后续代码
print("连接服务器成功")
print("输入数字1开启服务请求,输入数字0退出服务") # 此处用来实现链接的服务器不是想要的服务器时,可以即时退出重新链接其它服务器
server_temp = int(input("请输入服务数字:"))
if server_temp == 1: # 输入服务数字为1时开启会话服务
print("服务会话开启,输入exit退出会话")
while True: # 循环发送数据和接受数据
# 3.发送数据/接受数据
send_data = input("请输入要发送的数据:")
tcp_socket.send(send_data.encode("utf-8")) # 注意:发送的数据不能为空
if send_data == "exit": # 发送exit意在向服务器说明要退出会话
break
print("等待服务器回复……")
recv_data = tcp_socket.recv(1024).decode("utf-8") # 接受服务器发送的数据
print("服务器回复为:%s" % recv_data)
if recv_data == "exit": # 当服务器回复exit是意味着服务器要退出会话
break
if server_temp == 0: # 当输入数字为0时关闭会话服务
print("会话服务断开,输入y继续连接下一个服务器,输入n关闭客户端")
tcp_socket.send("exit".encode("utf-8")) # 向服务器发送一个exit来表明自己要退出会话
is__ = input("会话服务以断开,输入y继续连接下一个服务器,输入n关闭客户端,请输入要执行的操作:")
if is__ == "n":
break
elif is__ == "y":
tcp_socket.close() # 这里必须要关闭套接字才能重新连接服务器,否则如果连接同一个服务器会显示已经连接无法重新连接
continue
if is_ == "n" or is__ == "n":
# 4.关闭套接字
print("客户端已关闭")
tcp_socket.close()
if __name__ == "__main__":
main()