Python实现多用户全双工聊天(一对一),python多用户,多用户全双工聊天简陋

多用户全双工聊天简陋版

简单实现了两个客户端之间的通信,客户端发送消息,先由服务器接收,然后服务器转发到另一客户端。

该版本功能非常简陋,仅仅实现了最简单的聊天,有很多地方需要注意。

工作步骤:服务器端运行一个客户端运行,连接成功后输入用户名,服务器会保存该用户名在一个字典中,字典的对应关系是 username --> socket输入用户名之后,该客户端需要确定一个聊天用户,客户端输入To:user即可;如果客户端发送其他文本的话,会收到来自服务器的提示:“Nobody is chatting with you. Maybe the one talked with you is talking with someone else”当两个客户端成功连接之后就可以互相发送消息

服务器端代码如下:#!/usr/bin/python#coding:utf-8#server.pyfrom socket import *from time import ctimeimport threadingimport reHOST = ‘‘PORT = 9999BUFSIZ = 1024ADDR = (HOST,PORT)tcpSerSock = socket(AF_INET,SOCK_STREAM)tcpSerSock.bind(ADDR)tcpSerSock.listen(5)clients = {} # username -> socketchatwith = {} # user1.socket -> user2.socket# clients字典中记录了连接的客户端的用户名和套接字的对应关系# chatwith字典中记录了通信双方的套接字的对应# messageTransform()处理客户端确定用户名之后发送的文本# 文本只有四种类型:# None# Quit# To:someone# 其他文本def messageTransform(sock,user): while True: data = sock.recv(BUFSIZ) if not data: if chatwith.has_key(sock): chatwith[sock].send(data) del chatwith[chatwith[sock]] del chatwith[sock] del clients[user] sock.close() break if data==‘Quit‘: sock.send(data) if chatwith.has_key(sock): data = ‘%s.‘ % data chatwith[sock].send(data) del chatwith[chatwith[sock]] del chatwith[sock] del clients[user] sock.close() break elif re.match(‘^To:.+‘, data) is not None: data = data[3:] if clients.has_key(data): if data==user: sock.send(‘Please don\‘t try to talk with yourself.‘) else: chatwith[sock] = clients[data] chatwith[clients[data]] = sock else: sock.send(‘the user %s is not exist‘ % data) else: if chatwith.has_key(sock): chatwith[sock].send(‘[%s] %s: (%s)‘ % (ctime(),user,data)) else: sock.send(‘Nobody is chating with you. Maybe the one talked with you is talking with someone else‘) # 每个客户端连接之后,都会启动一个新线程# 连接成功后需要输入用户名# 输入的用户名可能会:# 已存在# (客户端直接输入ctrl+c退出)# 合法用户名def connectThread(sock,test): # client‘s socket user = None while True: # receive the username username = sock.recv(BUFSIZ) if not username: # the client logout without input a name print(‘The client logout without input a name‘) break if clients.has_key(username): # username existed sock.send(‘Reuse‘) else: # correct username sock.send(‘OK‘) clients[username] = sock # username -> socket user = username break if not user: sock.close() return print(‘The username is: %s‘ % user) # get the correct username messageTransform(sock,user) if __name__==‘__main__‘: while True: print(‘...WAITING FOR CONNECTION‘) tcpCliSock, addr = tcpSerSock.accept() print(‘CONNECTED FROM: ‘, addr) chat = threading.Thread(target = connectThread, args = (tcpCliSock,None)) chat.start()

客户端代码如下:#!/usr/bin/python#coding:utf-8#client.pyfrom socket import *from time import ctime# from termios import tcflush,TCIFLUSHimport threadingimport sysHOST = ‘127.0.0.1‘PORT = 9999BUFSIZ = 1024ADDR = (HOST,PORT)tcpCliSock = socket(AF_INET,SOCK_STREAM)tcpCliSock.connect(ADDR)‘‘‘因为每个客户端接收消息和发送消息是相互独立的,所以这里将两者分开,开启两个线程处理‘‘‘def Send(sock,test): while True: try: data = raw_input() sock.send(data) if data==‘Quit‘: break except KeyboardInterrupt: sock.send(‘Quit‘) break def Recv(sock,test): while True: data = sock.recv(BUFSIZ) if data==‘Quit.‘: print(‘He/She logout‘) continue if data==‘Quit‘: break print(‘ %s‘ % data) if __name__==‘__main__‘: print(‘Successful connection‘) while True: username = raw_input(‘Your name(press only Enter to quit): ‘) tcpCliSock.send(username) if not username: break # username is not None response = tcpCliSock.recv(BUFSIZ) if response==‘Reuse‘: print(‘The name is reuse, please set a new one‘) continue else: print(‘Welcome!‘) break if not username: tcpCliSock.close() recvMessage = threading.Thread(target = Recv, args = (tcpCliSock,None)) sendMessage = threading.Thread(target = Send, args = (tcpCliSock,None)) sendMessage.start() recvMessage.start() sendMessage.join() recvMessage.join()

总结:

功能简陋,后续会有所改进。这里还有很多地方需要注意。

比如说两个客户端A成功连接后,和客户端B聊天。A发送消息时直接输入ctrl+c退出程序(sendMessage线程会结束),我将这种情况模拟成A发送Quit登出。服务器接收到A登出信息之后,会回发一个Quit给A,A成功登出(recvMessage线程结束)。此外如果A和B建立了聊天关系,就要接触这个关系,服务器发送Quit.给B,B会继续接收信息,但是服务器端的chatwith字典中已经不存在A.socket --> B.socket关系。

但是还有很多没有解决的问题,比如说客户端A并没有输入信息,直接点击关闭按钮退出,就会发生异常(与之聊天的B客户端会崩溃)。

如果当前存在 A-->B的聊天关系,这时有一个C登录,并且确定了C-->A的聊天关系,那么A会和C聊天,这时客户端B就会被挂起。

主要的问题还是在于客户端非正常登出时的应对,目前解决了一部分问题,但是应该还有不少缺陷。

Python实现多用户全双工聊天(一对一)

python tcp通信如何实现多人聊天,Python实现多用户全双工聊天(一对一),python多用户,多用户全双工聊天简陋...相关推荐

  1. python TCP通信,主从服务设计(通过json进行数据通信)

    服务器端: '''_oo0oo_o8888888o88" . "88(| -_- |)0\ = /0___/`---'\___.' \\| |// './ \\||| : |||/ ...

  2. python TCP 通信

    服务器 import socket# 创建套接字 tcpServerSocket = socket.socket()# 设置IP和端口号 tcpServerAddress = ('192.168.1. ...

  3. python tcp server分包_如何创建线程池来监听tcpserver包python

    我试图创建线程池来同时对传入的tcp包执行一些操作.在 我在python3中找不到任何内置线程池.我也读了一些关于multiprocessing.Pool的文章,但是它不支持内存共享.所以我使用Que ...

  4. 跟李宁老师学Python视频课程(15):Python TCP与UDP编程-李宁-专题视频课程

    跟李宁老师学Python视频课程(15):Python TCP与UDP编程-122人已学习 课程介绍         本系列课程一共20套,每一套视频课程会深入讲解Python的一类知识点.Pytho ...

  5. c语言吃豆人游戏怎么理解,python 实现简单的吃豆人游戏

    效果展示: 程序简介 1.使用pygame模组 2.在material目录下有一些素材 3.吃豆人的游戏主体 4.吃豆人怪物的AI(未使用深度学习) 主要代码 main.py import pygam ...

  6. c语言tcp多线程聊天,基于tcp和多线程的多人聊天室-C语言

    之前在学习关于网络tcp和多线程的编程,学了知识以后不用一下总绝对心虚,于是就编写了一个基于tcp和多线程的多人聊天室. 具体的实现过程: 服务器端:绑定socket对象->设置监听数-> ...

  7. Python两台电脑实现TCP通信

    为了实现Nao机器人与电脑端的TCP通信,于是研究了一下Python实现TCP通信,在网上也看到了很多例子,但大多都是在一台机器上验证.在两台机器上使用,出了一些小故障. 注意:若两台电脑通信出了问题 ...

  8. 基于TCP协议的mfc多人聊天室

    基于TCP协议的MFC多人聊天室 简易的mfc聊天室思路实现 前言 一.socket通信 二.效果展示 三.代码实现 1.ClientSocket.cpp 客户端套接字 2.ServerSocket. ...

  9. python实现tcp通信_Python实现简易TCP通信程序

    TCP简介 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TCP旨在适应支持多网络应用的分层协议层次结构. ...

最新文章

  1. ArcGIS Server 内存占用相关
  2. p1522 牛的旅行 Cow Tours
  3. python函数编程-偏函数partial function
  4. 10次相遇我才知道什么是成熟的爱--转
  5. Win7下VS2008升级补丁
  6. (转)C#网络编程(订立协议和发送文件) - Part.4
  7. pixhawk的姿态控制算法解读
  8. 变量名和内存地址及符号表
  9. java里面有控制器吗_mvc中 控制器部分可以使用Javabean完成吗?为什么?
  10. notepad怎么运行php程序,notepad怎么运行php程序
  11. mysql log error_MySQL日志之error_log
  12. 如何在mysql中创建过程_如何在MySQL 中创建存储过程?
  13. sql instr函数_如何实现SQL INSTR()函数?
  14. revit二次开发 材质类别分析
  15. 各大搜索引擎蜘蛛名称大全
  16. MES管理系统,有效解决制造业信息化“断层”
  17. Python爬取周杰伦的200首歌+BI可视化分析
  18. 3GPP协议文档查询网站
  19. 数据分析神器Alteryx
  20. 感性电路电流计算_第五讲 正弦交流电路分析

热门文章

  1. 启动mq 在虚拟机中_记在使用rocketmq client客户端过程中踩到的坑
  2. python bottle框架 重定向_Python的web框架bottle静态文件的路径
  3. JAVA和遮掩_JAVA 你不知道的秘密 覆写,重载,隐藏,遮蔽,遮掩
  4. linux以预置密码进行验证拒绝访问,Linux重置MySQL密码
  5. Codechef REBXOR HYSBZ - 4260(01字典树+区间异或最大)
  6. 快速排序(过程图解 参考啊哈算法)
  7. android平板交互,安卓平板就应该如此,华为MatePad Pro 交互体验
  8. 通过超链接访问后台方法_超有用的公众号超链接,3分钟学会2种超链接方法,特别实用!...
  9. keil4编译c语言,用keil4编译C语言代码,编译通过,但是链接时无法产生.hex文件。...
  10. 自定义按键_雷柏VT300S号称吃鸡鼠标,能够自定义10个编程按键