标签:hat 用户名 res 服务端 监听 serve recvfrom 端口 服务器
import socket from socket import SOL_SOCKET, SO_REUSEADDR import json # 1.路由器,交换机的作用? # 答 .路由器: 隔离广播域 ,连接内网和外网的中间设备, 生成路由表 # 交换机: 工作在链路层, 收发数据帧 # 2.用户登录作业用tcp协议下的socket写: # 1.# 服务端 # - 等待客户端来发送数据:用户名、密码 # - 本地文件中查看用户名密码是否合法。 # - 合法:登录成功 # - 否则:用户名或密码错误 # server = socket.socket() # s_ip_port = ("192.168.15.102", 20800) # server.bind(s_ip_port) # server.listen() # conn, addr = server.accept() # conn.send("请输入注册账号: ".encode("utf-8")) # username = conn.recv(1024).decode("utf-8") # print(username) # conn.send("请输入注册密码".encode("utf-8")) # pwd = conn.recv(1024).decode("utf-8") # with open("user_pwd", mode="a", encoding="utf-8") as f: # dic = {username: pwd} # print(dic) # json.dump(dic, f) # f.write("\n") # i = 2 # while i >= 0: # conn.send("请输入登录用户名".encode("utf-8")) # u_name = conn.recv(1024).decode("utf-8") # conn.send("请输入登录密码".encode("utf-8")) # pwd_l = conn.recv(1024).decode("utf-8") # with open("user_pwd", mode="r", encoding="utf-8") as ff: # for line in ff: # line = line.strip() # dic = json.loads(line) # if dic.get(u_name) == pwd_l: # conn.send("登录成功".encode("utf-8")) # i = -1 # break # else: # info = "用户名或密码错误,剩余 %s 次机会" % i # conn.send(info.encode("utf-8")) # i -= 1 # # . # # 客户端 # # - 用户输入:用户名、密码 # # - 发送到服务端进行校验。 # user = socket.socket() # s_ip_port = ("192.168.15.102", 20800) # user.connect(s_ip_port) # msg_server = user.recv(1024).decode("utf-8") # print(msg_server) # name = input("注册用户名:") # user.send(name.encode("utf-8")) # msg_server = user.recv(1024).decode("utf-8") # print(msg_server) # pwd = input("请输入注册密码:") # user.send(pwd.encode("utf-8")) # while 1: # msg_server = user.recv(1024).decode("utf-8") # print(msg_server) # name_l = input("登录用户名:") # user.send(name_l.encode("utf-8")) # msg_server = user.recv(1024).decode("utf-8") # print(msg_server) # pwd_l = input("登录密码:") # user.send(pwd_l.encode("utf-8")) # msg_server = user.recv(1024).decode("utf-8") # print(msg_server) # if msg_server == "登录成功": # break # 3.udp协议下的socket聊天工具(类10086) # 1.服务端 # - 接收客户端发送的信息并作出回复。 # - 检查是否有某些指定关键字并回复消息,如果发送过来的消息中还有sb字符串,那么将sb替换成alexsb,然后和你要输入的内容组合起来发送给客户端。 # udp_server = socket.socket(type=socket.SOCK_DGRAM) # server_ip_port = ("192.168.15.102", 29999) # # udp_server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) # udp_server.bind(server_ip_port) # while 1: # c_msg, c_addr = udp_server.recvfrom(1024) # c_info = c_msg.decode("utf-8") # print(c_info) # say = input("回复该用户: ") # c_info1 = say # if "sb" in c_info: # c_info1 = c_info.replace("sb", "alexsb") + say # udp_server.sendto(c_info1.encode("utf-8"), c_addr) # # udp_server.close() # # # # 2.多个客户端 # # - 客户端向服务端发送信息 # client = socket.socket(type=socket.SOCK_DGRAM) # server_ip_port = ("192.168.15.102", 29999) # while 1: # info = input("请输入需要发送给对方的消息: ") # client.sendto(info.encode("utf-8"), server_ip_port) # msg = client.recv(1024) # print(msg.decode("utf-8")) # # client.close() # 4.简述OSI七层协议。 # 答:物理层: 承载电气信号的介质, 如网线,网卡等物体,传输比特流 # 数据链路层: 转发数据帧的设备, 将电气信号封装成帧,或者将帧转换为电气信号,识别MAC # 网络层: 数据帧转换为ip数据包,或者ip数据包转换为帧, 控制不同子网直接的路由转发 # 传输层: 区分应用程序,传输方式 将不同的应用程序的数据加加上端口封装 # 会话层: 利用传输层的服务, 建立两个客户端的会话 # 表示层: 将计算机识别的语言转换为应用层的语言 # 应用层: 作用于应用程序之间的数据交换, 人类可以识别 # 5.名词:mac地址、ip地址、DHCP服务、路由器、交换机、子网掩码、网关、DNS、广播,BS和CS架构 # mac地址: 网卡的唯一标识,身份认证 # ip地址: 网络互连协议地址, ipv4: x.x.x.x or ipv6 # dhcp服务: 自动分发ip地址服务 # 路由器: 内/外网介入的中间设备, 隔离广播域, # 子网掩码: 用于计算子网 网络号, 区分不同网络 # 6.简述三次握手、四次挥手的流程 # 答:三次握手 1, 客户端连接服务,并发送syn(同步序列号), # 2.服务器接收c_syn, 并将ack1 = c_syn +1返回给客户端, 再发送自己的s_syn给客户端 # 3, 客户端接收服务器的ack2 = s_syn+1 和 服务发来的s_syn并给客户, 再次将s-syn + 1返回给服务,此时建立连接 # 四次挥手: (1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。 # (2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。 # (3) 服务器关闭客户端的连接,发送一个FIN给客户端。 # (4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。 # 7.什么是socket?简述基于tcp协议的套接字通信流程。 # 答: 再应用层和传输层之间的抽象层,套接字, 模块封装好的一个模块, 用户拿它可以在计算机和计算机之间通信, # tcp协议的套接字通信流程 # 服务器: 创建通信对象socket.socket(), 绑定ip和端口obj.bind(ip+port), 启用端口监听服务obj.listen, 创建等等客户端连接服务器:obj.accept() # 接收或者发货消息 -连接的另一端 # 客户端: 创建通信对象socket.socket(), 连接服务端,client.connect(server_ip_port) ,发送或者接收消息- 另一端 # 8.简述TCP和UDP协议的区别 # 1 tcp是面向连接的,udp是无连接的, # 2 tcp的传输可靠,开销大,效率低, udp的传输不可靠,尽力传输, 效率高 # 3,tcp是面向流的传输, 一个消息可能分几个包, 一次接受可以是多个包, 无消息保护边界, udp是面向包的,每个包视作一个消息,每次接受只接受一个, 有保护边界, # udp_s = socket.socket(type=2) # s_ipport = ("192.168.15.102", 20800) # udp_s.bind(s_ipport) # c, a = udp_s.recvfrom(1024) # print(a) # print(c.decode("utf-8")) # udp_s.sendto(b"yes,i am!", a) # A = socket.socket(type=socket.SOCK_DGRAM) # server_ip_port = ("192.168.15.102", 20800) # A_ip_port = ("192.168.15.102", 20802) # A.bind(A_ip_port) # while 1: # msg, addr = A.recvfrom(1024) # print(msg.decode("utf-8")) # say = input("wo:") # A.sendto(say.encode("utf-8"), server_ip_port) # udp_c = socket.socket(type=2) # s_ipport = ("192.168.15.102", 20800) # udp_c.sendto(b"who is it?", s_ipport) # s, a = udp_c.recvfrom(1024) # print(s.decode("utf-8")) # B = socket.socket(type=socket.SOCK_DGRAM) # server_ip_port = ("192.168.15.102", 20800) # B_ip_port = ("192.168.15.102", 20801) # to = input("who is it that you want to send msg?") # while 1: # b_say = input("B:") # msg = to + "+" + b_say # B.sendto(msg.encode("utf-8"), server_ip_port) # # msg_a, address = B.recvfrom(1024) # print(msg_a.decode("utf-8")) # import socket # server = socket.socket(type=2) # server_ip_port = ip_port = ("192.168.15.102", 20800) # dic = {"a": ("192.168.15.102", 20802), "b": ("192.168.15.102", 20801)} # server.bind(server_ip_port) # while 1: # msg, addr = server.recvfrom(1024) # msg_to = msg.decode("utf-8").split("+", maxsplit=1) # to_ip_port = dic[msg_to[0]] # server.sendto(msg_to[1].encode("utf-8"), to_ip_port) # 格式: print(‘\033[0;32;40m欢迎使用\033[599;54;0m学生选课系统‘)
标签:hat 用户名 res 服务端 监听 serve recvfrom 端口 服务器
原文地址:https://www.cnblogs.com/tcpblog/p/9800758.html