怎么自己做个免费网站,wordpress 博主,05网英语书,宁德小程序开发网络编程 Socket(套接字) socket 位于 网络协议中的 数据传输层、 该层 主要 可以通过 UDP 或者 TCP协议 实现 数据的传输 TCP 协议 VS UDP协议
tcp : 是一个 可靠的 #xff0c;面向 连接的协议。 数据在网络传输中 是安全的#xff0c;不易丢失的。 TCP连接 在建立的时候面向 连接的协议。 数据在网络传输中 是安全的不易丢失的。 TCP连接 在建立的时候需要 经过 3次握手才能成功、 在断开连接的时候需要经过 4次挥手 才能断开。udp : 是一个 不可靠的连接 、在 数据传输中 可以会出现数据丢失的问题 。传输速度比 TCP 快。
TCP 的三次握手 四次挥手 TCP 服务端代码编写 编写服务端代码的步骤 a) 创建一个 套接字对象 b) 绑定 主机IP地址 和 端口 端口号的取值范围是 0 ~ 65535 不建议自己使用 四位数一下的端口 c) 监听 客户端的 连接 和 端口 d) 如果有客户端和服务器建立 链接、 则监听 客户端发送的消息。 f) 服务端 向 客户端 发送 消息 、 g) 断开与客户端的连接。 import socketif __name__ __main__:# 1. 创建一个套接字对象# family : 采用那种模式连接服务器 推荐使用 AF_INET (采用端口号)# type : 采用 什么协议 SOCK_STREAM (TCP协议), SOCK_DGRAM (UDP协议)socket_server socket.socket(familysocket.AF_INET, typesocket.SOCK_STREAM)# 2. 绑定主机和端口号, 主机是一个字符串端口号必须是一个数字# 主机: a) 可以使用电脑IP地址 b) 可以使用 localhost 或者 127.0.0.1, c) 0.0.0.0 (开放本机IP地址)socket_server.bind((192.168.17.22, 8888))# 3. 设置 服务器监听 客户端的 连接数socket_server.listen(5)# 4. 监听客户端while True:# 被动等待客户端的连接 accept 会阻塞程序的执行。# 返回 和 客户端的 conn连接通道, addr 是 客户端的IP地址和连接的端口号conn, addr socket_server.accept()# 5. 接收客户端发送的数据 (字符串流)、需要传递一个参数指定接收的字节数msg conn.recv(1024).decode()# 打印消息print(f{addr}客户端发送的消息是{msg})# 6. 向客户端发送消息conn.send(hello 客户端.encode())# 7. 断开连接conn.close()
TCP 客户端代码编写
import socket# 1. 创建一个 套接字 对象
sc socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2. 连接 TCP 服务器
sc.connect((192.168.17.22, 8888))# 3. 发送消息给 服务器
sc.send(Hello World.encode())# 4. 接收 服务器 给的消息
data sc.recv(1024).decode()print(服务器发送的消息是, data)# 5. 断开连接
sc.close()客户端与客户端聊天
服务端代码
import socket
import threading
import re
import jsondef forward_message(conn: socket.socket, client_mapping: dict):转发消息while True:# 获取消息message conn.recv(1024 * 8).decode(utf-8)# 如果这个消息是一个纯数字说明是客户端第一次向服务器表明身份if re.fullmatch(r\d, message):# 将身份信息 和 通道 写入到 字典中client_mapping[message] connprint(f客户端{message}上线了...)else:# 如果服务器传入的不是数字、那么一定是一个字典格式的字符串dct json.loads(message) # {to:1111, text:xxx, from: 2222}# 从 client_mapping 中 查找 键为 dct[to] 的 通道sc: socket.socket client_mapping.get(dct[to])# 如果 找不到 sc 说明 好友没上线if sc is None:# 给 发消息的人 返回 一个 好友不在线的 提醒conn.send(404.encode(utf-8))else:# 使用 sc 通道、将 message 转发给 好友,这行代码有可能会报错sc.send(message.encode(utf-8))if __name__ __main__:# 创建一个聊天服务器socket_server socket.socket()# 绑定 主机和端口socket_server.bind((0.0.0.0, 9999))# 监听客户端连接数量socket_server.listen(5)# 定义一个字典 用来 存储所有的客户端信息client_mapping {}# 编写一个 while 死循环、被动等待所有客户端的连接while True:# 获取 客户端的连接conn, addr socket_server.accept()# 每来一个客户端开启一个线程负责转发该客户端的消息threading.Thread(targetforward_message, args(conn, client_mapping)).start()
客户端 聊天类 编写
import socket
import threading
import jsonclass QQChat:def __init__(self, account):初始化 QQ账号self.__qq account# 初始化 socket客户端socket_client socket.socket()# 连接 QQ服务器socket_client.connect((192.168.17.22, 9999))# 将 socket_client 作为 对象的属性self.__socket_client socket_client# 向服务器发送消息、表明当前是哪一个客户端登录了self.__socket_client.send(account.encode(utf-8))def chat(self, friend):给指定的好友进行聊天# 定义一个线程 负责 接收 消息threading.Thread(targetself.__read_message, args(friend,)).start()# 定义一个线程 负责 发送 消息threading.Thread(targetself.__send_message, args(friend,)).start()def __read_message(self, friend):负责 读取消息while True:message self.__socket_client.recv(1024 * 8).decode(utf-8)# 直接对消息做反序列化data json.loads(message)if data 404:print(f好友{friend}不在线)else:# 一定是一个字典、且字典中包含 谁发的消息# if data[from] friend:# 获取好友发送的消息print(f{friend}:{data[text]})# else:# # 如果不是当前聊天的好友# print(您有一条其他好友发送的消息、已被忽略)def __send_message(self, friend):负责发送消息while True:# 尝试从键盘获取数据message input()# 发送消息给 好友data {text: message, to: friend, from: self.__qq}# 将数据进行 JSON序列化message json.dumps(data)self.__socket_client.send(message.encode(utf-8))if __name__ __main__:account input(请输入您的仿QQ账号)# 登录 仿QQ服务器qq_client client.QQChat(account)friend input(请输入聊天用户的仿QQ账号)# 选择好友聊天qq_client.chat(friend)