一、原理说明

框架代码说明:

#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 线程)实现简单聊天室相关推荐

  1. tcp port numbers reused出现原因_谈谈 TCP 的 TIME_WAIT

    由来 最近有同事在用 ab 进行服务压测,到 QPS 瓶颈后怀疑是起压机的问题,来跟我借测试机,于是我就趁机分析了一波起压机可能成为压测瓶颈的可能,除了网络 I/O.机器性能外,还考虑到了网络协议的问 ...

  2. 利用socket.io+nodejs打造简单聊天室

    代码地址如下: http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...

  3. PyQt5+socket+多线程,实现简单聊天室

    之前从没想过自己设计一套网络聊天室出来,但网络原理实验的时候老师说:"谁做出来了,就给谁加分",于是我(内卷王)又开始(偷偷地背着全班同学)自己做起了这一个实验项目.实验项目的主要 ...

  4. python socket多线程 获取朋友列表_python socket多线程通讯实例分析(聊天室)

    本文实例讲述了python socket多线程通讯方法.分享给大家供大家参考,具体如下: #!/usr/bin/evn python """ 这是一个Socket+多进程 ...

  5. python实现简易聊天需要登录博客园zip下载_Python基于Socket实现简易多人聊天室的示例代码...

    前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 套接字可以通过多种不同的 ...

  6. python socket 网络聊天室_Python基于Socket实现简单聊天室

    本文实例为大家分享了Python基于Socket实现简单聊天室,供大家参考,具体内容如下 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Ti ...

  7. node php聊天室,利用socket.io实现多人聊天室(基于Nodejs)

    利用socket.io实现多人聊天室(基于Nodejs) socket.io简介 在Html5中存在着这样的一个新特性,引入了websocket,关于websocket的内部实现原理可以看这篇文章,这 ...

  8. android socket 简易聊天室 java服务器,Android Socket通信实现简单聊天室

    socket通信是基于底层TCP/IP协议实现的.这种服务端不需要任何的配置文件和tomcat就可以完成服务端的发布,使用纯java代码实现通信.socket是对TCP/IP的封装调用,本身并不是一种 ...

  9. python远程聊天_python实现简单聊天室功能 可以私聊

    本文实例为大家分享了python实现简单聊天室功能的具体代码,供大家参考,具体内容如下 公共模块 首先写一个公共类,用字典的形式对数据的收发,并且进行封装,导入struct解决了TCP的粘包问题,并在 ...

最新文章

  1. 转盘在转动的同时ajax异步加载,用jQuery旋转插件jqueryrotate制作转盘抽奖.pdf
  2. 关于阿里基础设施,你要知道的都在这里
  3. struts result type redirect 重定向和转发的区别
  4. 在树莓派2上折腾kali2.0小记(1)
  5. 【深度学习】Win10安装TensorFlow_gpu(避坑必看)
  6. 16 SD配置-企业结构-分配-给信贷控制区分配公司代码
  7. STM32工作笔记0094---音乐播放器实验
  8. 【015】基于51单片机的LCD1602流动字符串proteus仿真设计
  9. linux的桌面分辨率设置,linux xorg屏幕分辨率设置
  10. foxmail添加网易企业邮箱账号遇到账号或密码错误的问题
  11. ensp ethernet端口配置ip问题
  12. Protobuf 介绍与实战21:如何生成一维数组、二维数组(repeated数组类型介绍)
  13. python显示血量条,利用Python绘制血药浓度-时间曲线——口服吸收一室模型
  14. 阿里云又送Apsara定制T恤了 – 附答案
  15. wps透视表列总计移到顶部_数据透视表总计中的错误
  16. 德鲁克日志读后感之二十二
  17. CPU卡校验MAC1、计算MAC2、校验TAC的方式及流程
  18. 机械工业c语言教程pdf,新编C语言程序计教程(机械工业出版社 钱雪忠 吕莹楠).doc...
  19. 日本“经营之神”稻盛和夫去世,终年90岁,人生信条:“每天都必须特别认真地生活。”...
  20. python大学教程 吕云翔 pdf_大学实用计算机英语教程

热门文章

  1. java 内存泄漏_Java开发者必须知道的内存泄漏问题
  2. git 怎么读_python3中开源代码怎么读?
  3. 1 access中iif函数中的_JavaScript中的高阶函数
  4. iphone怎么长截屏_新iPhone又要为中国定制?除了价格,还有这些惊喜
  5. dve 二维数组信号 显示波形_函数任意波形发生器价格
  6. android double比较大小吗,Android双向选择控件DoubleSeekBar使用详解
  7. debian 8 服务器 稳定,如何在 Debian 8/9/10 上安装最新稳定版 Wine
  8. mpython_mPython下载 mPython(图形化编程软件) v0.5.0 官方安装版 下载-脚本之家
  9. hdf5与hdfs的区别
  10. 3分钟入门python_3分钟学完Python,直接从入门到精通「史上最强干货库」