tcp port numbers reused出现原因_python socket(tcp 线程)实现简单聊天室
一、原理说明
框架代码说明:
#python通过线程和socket 最简单的方式实现TCP聊天功能import socketimport threadingip='127.0.0.1'port=7777s=socket.socket()#生成socket对象s.bind((ip, port))s.listen()def accp(): while True: newsock, clients = s.accept() ''' 执行到accept 方法处于阻塞状态 该方法生成 一个新的socket(保存在newsock) ,通过新socket 与客户端建立连接。 通过死循环,当执行到该处代码,程序阻塞,当TCP客户端发起tcp连接请求 ,程序执行到下面,并打印newsock 同时生成一个线程对象,调用recv 方法,(到此accp 第一次循环执行完毕,紧接着执行下一次循环并再此生成一个 新socke 等待其他客户端发过来的TCP连接) ,socket 的recv方法也是阻塞状态,该方法等待接收客户端发过来的数据 ,bytes类型 当 收到客户端发送的数据,recv函数的程序继续往下执行,打印data ,同时打印newsock的,打印这里只是为了验证 这里的socket和 accp函数里面第一次生成的socket是同一个对象,此时该函数执行完毕,同时进入下一次循环,执行到sock recv函数 的时候仍出于阻塞状态,直到TCP客户端发送信的数据过来。通过该方式 简单实现聊天的最初级版本功能 ''' print(newsock) threading.Thread(target=recv,args=(newsock,),name="recv").start()def recv(newsock): while True: data = newsock.recv(1024)#阻塞状态, print(data) print(newsock)accp()
版本二:
#TCP 的server端简单示例import socketimport threadingimport datetimeimport loggingformat="%(asctime)s-----%(process)s----%(thread)s-----%(threadName)s--日志消息--%(message)s "logging.basicConfig(format=format,level=logging.NOTSET)class ChatServer: def __init__(self,ip='127.0.0.1',port=9999): self.sock=socket.socket() self.addr=ip,port self.event = threading.Event() self.newsocks={}#保存 newsocket 和tcp客户端连接信息。后面通过循环close socket self.lock=threading.Lock() def start(self): self.sock.bind(self.addr) self.sock.listen() threading.Thread(target=self.accept).start() def accept(self): while not self.event.is_set():#当event 是false执行 newsocket,clientinfo=self.sock.accept() with self.lock: self.newsocks[clientinfo]=newsocket threading.Thread(target=self.recv,args=(newsocket,clientinfo),name="recv").start() def recv(self,newsocket,clientinfo): while not self.event.is_set(): try: data=newsocket.recv(1024) except: data=b'' print(data) if data.strip()==b'quit' or data.strip()==b'':#tcp客户端 软件如果直接点击断开 会生成一个空byets 这里防止出现异常 with self.lock: self.newsocks.pop(clientinfo) newsocket.close() break msg="{:%Y-%m-%d %H:%M:%S}[{}--{}-{}]".format(datetime.datetime.now(), *clientinfo,data.decode()) with self.lock: for s in self.newsocks.values(): s.send(msg.encode())## 将str类型转成bytes 网络中传输的都是bytes类型 ##data.decode()将受到的bytes类型转换成字符串 def stop(self): self.event.set() keys=[] with self.lock: keys=list(self.newsocks.values()) self.newsocks.clear() for soc in keys: soc.close() self.sock.close()cs = ChatServer()cs.start()while True: cmd=input(">>").strip() if cmd=="q": cs.stop() break logging.info(threading.enumerate())该程序还有bug 就是newsocket.recv(1024) 处可能会因为网络原因产生异常 可以通过 try except 处理。可以继续优化备注 这里TCP 客户端是通过 tcp/udp调试工具模拟
tcp port numbers reused出现原因_python socket(tcp 线程)实现简单聊天室相关推荐
- tcp port numbers reused出现原因_谈谈 TCP 的 TIME_WAIT
由来 最近有同事在用 ab 进行服务压测,到 QPS 瓶颈后怀疑是起压机的问题,来跟我借测试机,于是我就趁机分析了一波起压机可能成为压测瓶颈的可能,除了网络 I/O.机器性能外,还考虑到了网络协议的问 ...
- 利用socket.io+nodejs打造简单聊天室
代码地址如下: http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...
- PyQt5+socket+多线程,实现简单聊天室
之前从没想过自己设计一套网络聊天室出来,但网络原理实验的时候老师说:"谁做出来了,就给谁加分",于是我(内卷王)又开始(偷偷地背着全班同学)自己做起了这一个实验项目.实验项目的主要 ...
- python socket多线程 获取朋友列表_python socket多线程通讯实例分析(聊天室)
本文实例讲述了python socket多线程通讯方法.分享给大家供大家参考,具体如下: #!/usr/bin/evn python """ 这是一个Socket+多进程 ...
- python实现简易聊天需要登录博客园zip下载_Python基于Socket实现简易多人聊天室的示例代码...
前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 套接字可以通过多种不同的 ...
- python socket 网络聊天室_Python基于Socket实现简单聊天室
本文实例为大家分享了Python基于Socket实现简单聊天室,供大家参考,具体内容如下 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Ti ...
- node php聊天室,利用socket.io实现多人聊天室(基于Nodejs)
利用socket.io实现多人聊天室(基于Nodejs) socket.io简介 在Html5中存在着这样的一个新特性,引入了websocket,关于websocket的内部实现原理可以看这篇文章,这 ...
- android socket 简易聊天室 java服务器,Android Socket通信实现简单聊天室
socket通信是基于底层TCP/IP协议实现的.这种服务端不需要任何的配置文件和tomcat就可以完成服务端的发布,使用纯java代码实现通信.socket是对TCP/IP的封装调用,本身并不是一种 ...
- python远程聊天_python实现简单聊天室功能 可以私聊
本文实例为大家分享了python实现简单聊天室功能的具体代码,供大家参考,具体内容如下 公共模块 首先写一个公共类,用字典的形式对数据的收发,并且进行封装,导入struct解决了TCP的粘包问题,并在 ...
最新文章
- 转盘在转动的同时ajax异步加载,用jQuery旋转插件jqueryrotate制作转盘抽奖.pdf
- 关于阿里基础设施,你要知道的都在这里
- struts result type redirect 重定向和转发的区别
- 在树莓派2上折腾kali2.0小记(1)
- 【深度学习】Win10安装TensorFlow_gpu(避坑必看)
- 16 SD配置-企业结构-分配-给信贷控制区分配公司代码
- STM32工作笔记0094---音乐播放器实验
- 【015】基于51单片机的LCD1602流动字符串proteus仿真设计
- linux的桌面分辨率设置,linux xorg屏幕分辨率设置
- foxmail添加网易企业邮箱账号遇到账号或密码错误的问题
- ensp ethernet端口配置ip问题
- Protobuf 介绍与实战21:如何生成一维数组、二维数组(repeated数组类型介绍)
- python显示血量条,利用Python绘制血药浓度-时间曲线——口服吸收一室模型
- 阿里云又送Apsara定制T恤了 – 附答案
- wps透视表列总计移到顶部_数据透视表总计中的错误
- 德鲁克日志读后感之二十二
- CPU卡校验MAC1、计算MAC2、校验TAC的方式及流程
- 机械工业c语言教程pdf,新编C语言程序计教程(机械工业出版社 钱雪忠 吕莹楠).doc...
- 日本“经营之神”稻盛和夫去世,终年90岁,人生信条:“每天都必须特别认真地生活。”...
- python大学教程 吕云翔 pdf_大学实用计算机英语教程
热门文章
- java 内存泄漏_Java开发者必须知道的内存泄漏问题
- git 怎么读_python3中开源代码怎么读?
- 1 access中iif函数中的_JavaScript中的高阶函数
- iphone怎么长截屏_新iPhone又要为中国定制?除了价格,还有这些惊喜
- dve 二维数组信号 显示波形_函数任意波形发生器价格
- android double比较大小吗,Android双向选择控件DoubleSeekBar使用详解
- debian 8 服务器 稳定,如何在 Debian 8/9/10 上安装最新稳定版 Wine
- mpython_mPython下载 mPython(图形化编程软件) v0.5.0 官方安装版 下载-脚本之家
- hdf5与hdfs的区别
- 3分钟入门python_3分钟学完Python,直接从入门到精通「史上最强干货库」