- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
?
?
python网络通信器设计
?
?
总而言之、实现了简易的网络通信器,有群聊、单聊、控制、查看等的操作,完成了任务
不足:应用到了线程,在退出时并没有成功结束调度返回资源,而是将线程设为了守护线程,运行到了堵塞状态使程序不报错、后续学习了知识再来补充,也望大佬能评论赐教!
一、准备知识:
多套接字及多线程:**
进程与线程的区别:
(可理解为一条马路-进程和马路上的多条车道-线程)
线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信
号等),某进程内的线程在其他进程不可见;
调度和切换:线程上下文切换比进程上下文切换要快得多
为何不使用多进程而是使用多线程?
线程廉价,线程启动比较快,退出比较快,对系统资源的冲击也比较小。而且线程彼此分享了大部分核心对象(File Handle)的拥有权
二、通信器功能分析:
tcp socket(通信质量保障)
server:
群聊天(群聊窗口、接收消息后泛洪)
一对一(私聊窗口、接收消息后转发)
行为管理(只做了查看当前线程和关闭所有服务、未实现单个控制、也不难咯)
信息提示(进入或退出会输出提示)
client:
群聊天(发给服务器让服务器去泛洪)
一对一(发给发服务器让服务器代发)
退出控制
三、编写代码+功能验证
server信息提示:
行为管理:
server群发:
server单发:
代码
#欢迎大佬指正和修改
import socket
import threading
import logging
import datetime
FORMAT = %(asctime)s %(threadName)s %(thread)d %(message)s
logging.basicConfig(format=FORMAT, level=logging.INFO)
class socketS():
#初始化,固定ip和port,绑定,监听
def __init__(self):
address = (127.0.0.1, 9999)
self.bufsize = 1024
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.bind(address)
self.sock.listen()
self.client_sock = {} #空字典放所有的client sock对象,{key:ip, value:sock}
self.thread_accept = threading.Thread(target=self.accept, name=accept, daemon=True)
self.thread_accept.start()
#建立连接、记录
def accept(self):
while True:
sock, raddr = self.sock.accept()
print(a new client connected!)
logging.info(sock)
logging.info(raddr)
self.client_sock[raddr] = sock
#线程传参、args=duple
self.thread_recv = threading.Thread(target=self.recv, name=recv, daemon=True, args=(sock,))
self.thread_recv.start()
#接收和群发
def recv(self, sock:socket.socket):
while True:
msg = sock.recv(self.bufsize).decode(gbk)
# 单发
single_msg = msg.split(%%%)
if len(single_msg)1:
self.send(sing
文档评论(0)