http://blog.csdn.net/calling_wisdom/article/details/42524745

今天用python的socket模块实现了一个聊天室的程序

虽然功能比较简单,但是该有的基本功能还是有的

还望大家指点

服务器端程序:

  1.  
  2. import socket  
  3. import threading  
  4.   
  5. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
  6.   
  7. sock.bind(('localhost', 5550))  
  8.   
  9. sock.listen(5)  
  10. print('Server', socket.gethostbyname('localhost'), 'listening ...')  
  11.   
  12. mydict = dict()  
  13. mylist = list()  
  14.   
  15. #把whatToSay传给除了exceptNum的所有人  
  16. def tellOthers(exceptNum, whatToSay):  
  17.     for c in mylist:  
  18.         if c.fileno() != exceptNum :  
  19.             try:  
  20.                 c.send(whatToSay.encode())  
  21.             except:  
  22.                 pass  
  23.   
  24. def subThreadIn(myconnection, connNumber):  
  25.     nickname = myconnection.recv(1024).decode()  
  26.     mydict[myconnection.fileno()] = nickname  
  27.     mylist.append(myconnection)  
  28.     print('connection', connNumber, ' has nickname :', nickname)  
  29.     tellOthers(connNumber, '【系统提示:'+mydict[connNumber]+' 进入聊天室】')  
  30.     while True:  
  31.         try:  
  32.             recvedMsg = myconnection.recv(1024).decode()  
  33.             if recvedMsg:  
  34.                 print(mydict[connNumber], ':', recvedMsg)  
  35.                 tellOthers(connNumber, mydict[connNumber]+' :'+recvedMsg)  
  36.   
  37.         except (OSError, ConnectionResetError):  
  38.             try:  
  39.                 mylist.remove(myconnection)  
  40.             except:  
  41.                 pass  
  42.             print(mydict[connNumber], 'exit, ', len(mylist), ' person left')  
  43.             tellOthers(connNumber, '【系统提示:'+mydict[connNumber]+' 离开聊天室】')  
  44.             myconnection.close()  
  45.             return  
  46.   
  47. while True:  
  48.     connection, addr = sock.accept()  
  49.     print('Accept a new connection', connection.getsockname(), connection.fileno())  
  50.     try:  
  51.         #connection.settimeout(5)  
  52.         buf = connection.recv(1024).decode()  
  53.         if buf == '1':  
  54.             connection.send(b'welcome to server!')  
  55.   
  56.             #为当前连接开辟一个新的线程  
  57.             mythread = threading.Thread(target=subThreadIn, args=(connection, connection.fileno()))  
  58.             mythread.setDaemon(True)  
  59.             mythread.start()  
  60.               
  61.         else:  
  62.             connection.send(b'please go out!')  
  63.             connection.close()  
  64.     except :    
  65.         pass  

客户端程序:

  1.  
  2. import socket  
  3. import time  
  4. import threading  
  5.   
  6. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
  7.   
  8. sock.connect(('localhost', 5550))  
  9. sock.send(b'1')  
  10. print(sock.recv(1024).decode())  
  11. nickName = raw_input('input your nickname: ')  
  12. sock.send(nickName.encode())  
  13.   
  14. def sendThreadFunc():  
  15.     while True:  
  16.         try:  
  17.             myword = raw_input()  
  18.             sock.send(myword.encode())  
  19.             #print(sock.recv(1024).decode())  
  20.         except ConnectionAbortedError:  
  21.             print('Server closed this connection!')  
  22.         except ConnectionResetError:  
  23.             print('Server is closed!')  
  24.       
  25. def recvThreadFunc():  
  26.     while True:  
  27.         try:  
  28.             otherword = sock.recv(1024)  
  29.             if otherword:  
  30.                 print(otherword.decode())  
  31.             else:  
  32.                 pass  
  33.         except ConnectionAbortedError:  
  34.             print('Server closed this connection!')  
  35.   
  36.         except ConnectionResetError:  
  37.             print('Server is closed!')  
  38.   
  39.   
  40. th1 = threading.Thread(target=sendThreadFunc)  
  41. th2 = threading.Thread(target=recvThreadFunc)  
  42. threads = [th1, th2]  
  43.   
  44. for t in threads :  
  45.     t.setDaemon(True)  
  46.     t.start()  
  47. t.join()  

代码执行效果图:

聊天过程1:

系统监视:

聊天过程 2 :

系统监视:

 

Python socket聊天室程序的更多相关文章

  1. python socket 聊天室

    socket 发送的时候,使用的是全双工的形式,不是半双工的形式.全双工就是类似于电话,可以一直通信.并且,在发送后,如果又接受数据,那么在这个接受到数据之前,整个过程是不会停止的.会进行堵塞,堵塞就 ...

  2. 基于select的python聊天室程序

    python网络编程具体参考<python select网络编程详细介绍>. 在python中,select函数是一个对底层操作系统的直接访问的接口.它用来监控sockets.files和 ...

  3. 高级IO复用应用:聊天室程序

    简单的聊天室程序:客户端从标准输入输入数据后发送给服务端,服务端将用户发送来的数据转发给其它用户.这里采用IO复用poll技术.客户端采用了splice零拷贝.服务端采用了空间换时间(分配超大的用户数 ...

  4. Java Socket聊天室编程(一)之利用socket实现聊天之消息推送

    这篇文章主要介绍了Java Socket聊天室编程(一)之利用socket实现聊天之消息推送的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 网上已经有很多利用socket实现聊天的例子了 ...

  5. 使用Beetle简单构建聊天室程序

    之前已经讲解了Beetle简单地构建网络通讯程序,那程序紧紧是讲述了如何发送和接收数据:这一章将更深入的使用Beetle的功能,主要包括消息制定,协议分析包括消息接管处理等常用的功能.为了更好的描述所 ...

  6. 用c写一个小的聊天室程序

    1.聊天室程序——客户端 客户端我也用了select进行I/O复用,同时监控是否有来自socket的消息和标准输入,近似可以完成对键盘的中断使用. 其中select的监控里,STDOUT和STDIN是 ...

  7. 利用JavaUDPSocket+多线程模拟实现一个简单的聊天室程序

    对Socket的一点个人理解:Socket原意是指插座.家家户户都有五花八门的家用电器,但它们共用统一制式的插座.这样做的好处就是将所有家用电器的通电方式统一化,不需要大费周章地在墙壁上凿洞并专门接电 ...

  8. ASP.NET 使用application和session对象写的简单聊天室程序

    ASP.Net中有两个重要的对象,一个是application对象,一个是session对象. Application:记录应用程序参数的对象,该对象用于共享应用程序级信息. Session:记录浏览 ...

  9. Java Socket聊天室编程(二)之利用socket实现单聊聊天室

    这篇文章主要介绍了Java Socket聊天室编程(二)之利用socket实现单聊聊天室的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在上篇文章Java Socket聊天室编程(一)之 ...

随机推荐

  1. 【Docker】安装并测试安装成功

    1.环境描述 Centos 7 2.安装步骤 通过命令yum install docker安装 等待下载安装-,出现下图,按y继续 继续等待-出现下图按y继续 再继续等待- 知道出现上图表示安装完毕 ...

  2. webservice系统学习笔记9-使用契约优先的方式的一个服务端demo(隐式传Header信息)

    服务器端: 1.编写wsdl文件 <?xml version="1.0" encoding="UTF-8" standalone="no&quo ...

  3. pat1040:有几个PAT

    https://www.patest.cn/contests/pat-b-practise/1040 #include "stdio.h" int main() { int p = ...

  4. java多线程(四)之同步机制

    1.同步的前提 多个线程 多个线程使用的是同一个锁 2.同步的好处 同步的出现解决了多线程的安全问题 3.同步的弊端 当线程较多时, 因为每个线程都会去判断同步上的锁, 这样是很耗费资源的, 会降低程 ...

  5. Wunderlist 云端任务管理(Todo list)工具

    Wunderlist 是一个云端任务管理(Todo list)工具,支持 iPhone, iPad, Android, Windows, Mac OSX 以及 Web 端轻松同步,实现了真正意义上的跨 ...

  6. Windows CMD常用命令大全 运行命令

    http://blog.163.com/lixunhuan@126/blog/static/122060620075124142658/ CMD命令大全 net use \\ip\ipc$ " ...

  7. 【ASP.NET Web API教程】2.4 创建Web API的帮助页面[转]

    注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. 2.4 Creating a Help Page for a Web API2.4 创建W ...

  8. 【Linux】正确的关机方法

    1)shutdown命令 我们较常使用的是shutdown这个命令,这个命令可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上的所有登录用户提示一条警告信息.该命令还允许用户指定一个时间参数 ...

  9. sublime text怎样安装ctags来定位函数

    sublime确实是一款非常不错的开发软件.用起来非常爽,里面集成了非常多插件.仅仅要安装就可以, 下来来介绍下sublime中ctags插件的安装,安装这个插件之后就能够高速定位某函数了,很方便. ...

  10. Python log() 函数

    描述 log() 方法返回x的自然对数,x > 0. 语法 以下是 log() 方法的语法: import math math.log( x ) 注意:log()是不能直接访问的,需要导入 ma ...