Python socket聊天室程序
http://blog.csdn.net/calling_wisdom/article/details/42524745
今天用python的socket模块实现了一个聊天室的程序
虽然功能比较简单,但是该有的基本功能还是有的
还望大家指点
服务器端程序:
- import socket
- import threading
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.bind(('localhost', 5550))
- sock.listen(5)
- print('Server', socket.gethostbyname('localhost'), 'listening ...')
- mydict = dict()
- mylist = list()
- #把whatToSay传给除了exceptNum的所有人
- def tellOthers(exceptNum, whatToSay):
- for c in mylist:
- if c.fileno() != exceptNum :
- try:
- c.send(whatToSay.encode())
- except:
- pass
- def subThreadIn(myconnection, connNumber):
- nickname = myconnection.recv(1024).decode()
- mydict[myconnection.fileno()] = nickname
- mylist.append(myconnection)
- print('connection', connNumber, ' has nickname :', nickname)
- tellOthers(connNumber, '【系统提示:'+mydict[connNumber]+' 进入聊天室】')
- while True:
- try:
- recvedMsg = myconnection.recv(1024).decode()
- if recvedMsg:
- print(mydict[connNumber], ':', recvedMsg)
- tellOthers(connNumber, mydict[connNumber]+' :'+recvedMsg)
- except (OSError, ConnectionResetError):
- try:
- mylist.remove(myconnection)
- except:
- pass
- print(mydict[connNumber], 'exit, ', len(mylist), ' person left')
- tellOthers(connNumber, '【系统提示:'+mydict[connNumber]+' 离开聊天室】')
- myconnection.close()
- return
- while True:
- connection, addr = sock.accept()
- print('Accept a new connection', connection.getsockname(), connection.fileno())
- try:
- #connection.settimeout(5)
- buf = connection.recv(1024).decode()
- if buf == '1':
- connection.send(b'welcome to server!')
- #为当前连接开辟一个新的线程
- mythread = threading.Thread(target=subThreadIn, args=(connection, connection.fileno()))
- mythread.setDaemon(True)
- mythread.start()
- else:
- connection.send(b'please go out!')
- connection.close()
- except :
- pass
客户端程序:
- import socket
- import time
- import threading
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.connect(('localhost', 5550))
- sock.send(b'1')
- print(sock.recv(1024).decode())
- nickName = raw_input('input your nickname: ')
- sock.send(nickName.encode())
- def sendThreadFunc():
- while True:
- try:
- myword = raw_input()
- sock.send(myword.encode())
- #print(sock.recv(1024).decode())
- except ConnectionAbortedError:
- print('Server closed this connection!')
- except ConnectionResetError:
- print('Server is closed!')
- def recvThreadFunc():
- while True:
- try:
- otherword = sock.recv(1024)
- if otherword:
- print(otherword.decode())
- else:
- pass
- except ConnectionAbortedError:
- print('Server closed this connection!')
- except ConnectionResetError:
- print('Server is closed!')
- th1 = threading.Thread(target=sendThreadFunc)
- th2 = threading.Thread(target=recvThreadFunc)
- threads = [th1, th2]
- for t in threads :
- t.setDaemon(True)
- t.start()
- t.join()
代码执行效果图:
聊天过程1:
系统监视:
聊天过程 2 :
系统监视:
Python socket聊天室程序的更多相关文章
- python socket 聊天室
socket 发送的时候,使用的是全双工的形式,不是半双工的形式.全双工就是类似于电话,可以一直通信.并且,在发送后,如果又接受数据,那么在这个接受到数据之前,整个过程是不会停止的.会进行堵塞,堵塞就 ...
- 基于select的python聊天室程序
python网络编程具体参考<python select网络编程详细介绍>. 在python中,select函数是一个对底层操作系统的直接访问的接口.它用来监控sockets.files和 ...
- 高级IO复用应用:聊天室程序
简单的聊天室程序:客户端从标准输入输入数据后发送给服务端,服务端将用户发送来的数据转发给其它用户.这里采用IO复用poll技术.客户端采用了splice零拷贝.服务端采用了空间换时间(分配超大的用户数 ...
- Java Socket聊天室编程(一)之利用socket实现聊天之消息推送
这篇文章主要介绍了Java Socket聊天室编程(一)之利用socket实现聊天之消息推送的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 网上已经有很多利用socket实现聊天的例子了 ...
- 使用Beetle简单构建聊天室程序
之前已经讲解了Beetle简单地构建网络通讯程序,那程序紧紧是讲述了如何发送和接收数据:这一章将更深入的使用Beetle的功能,主要包括消息制定,协议分析包括消息接管处理等常用的功能.为了更好的描述所 ...
- 用c写一个小的聊天室程序
1.聊天室程序——客户端 客户端我也用了select进行I/O复用,同时监控是否有来自socket的消息和标准输入,近似可以完成对键盘的中断使用. 其中select的监控里,STDOUT和STDIN是 ...
- 利用JavaUDPSocket+多线程模拟实现一个简单的聊天室程序
对Socket的一点个人理解:Socket原意是指插座.家家户户都有五花八门的家用电器,但它们共用统一制式的插座.这样做的好处就是将所有家用电器的通电方式统一化,不需要大费周章地在墙壁上凿洞并专门接电 ...
- ASP.NET 使用application和session对象写的简单聊天室程序
ASP.Net中有两个重要的对象,一个是application对象,一个是session对象. Application:记录应用程序参数的对象,该对象用于共享应用程序级信息. Session:记录浏览 ...
- Java Socket聊天室编程(二)之利用socket实现单聊聊天室
这篇文章主要介绍了Java Socket聊天室编程(二)之利用socket实现单聊聊天室的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在上篇文章Java Socket聊天室编程(一)之 ...
随机推荐
- 【Docker】安装并测试安装成功
1.环境描述 Centos 7 2.安装步骤 通过命令yum install docker安装 等待下载安装-,出现下图,按y继续 继续等待-出现下图按y继续 再继续等待- 知道出现上图表示安装完毕 ...
- webservice系统学习笔记9-使用契约优先的方式的一个服务端demo(隐式传Header信息)
服务器端: 1.编写wsdl文件 <?xml version="1.0" encoding="UTF-8" standalone="no&quo ...
- pat1040:有几个PAT
https://www.patest.cn/contests/pat-b-practise/1040 #include "stdio.h" int main() { int p = ...
- java多线程(四)之同步机制
1.同步的前提 多个线程 多个线程使用的是同一个锁 2.同步的好处 同步的出现解决了多线程的安全问题 3.同步的弊端 当线程较多时, 因为每个线程都会去判断同步上的锁, 这样是很耗费资源的, 会降低程 ...
- Wunderlist 云端任务管理(Todo list)工具
Wunderlist 是一个云端任务管理(Todo list)工具,支持 iPhone, iPad, Android, Windows, Mac OSX 以及 Web 端轻松同步,实现了真正意义上的跨 ...
- Windows CMD常用命令大全 运行命令
http://blog.163.com/lixunhuan@126/blog/static/122060620075124142658/ CMD命令大全 net use \\ip\ipc$ " ...
- 【ASP.NET Web API教程】2.4 创建Web API的帮助页面[转]
注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. 2.4 Creating a Help Page for a Web API2.4 创建W ...
- 【Linux】正确的关机方法
1)shutdown命令 我们较常使用的是shutdown这个命令,这个命令可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上的所有登录用户提示一条警告信息.该命令还允许用户指定一个时间参数 ...
- sublime text怎样安装ctags来定位函数
sublime确实是一款非常不错的开发软件.用起来非常爽,里面集成了非常多插件.仅仅要安装就可以, 下来来介绍下sublime中ctags插件的安装,安装这个插件之后就能够高速定位某函数了,很方便. ...
- Python log() 函数
描述 log() 方法返回x的自然对数,x > 0. 语法 以下是 log() 方法的语法: import math math.log( x ) 注意:log()是不能直接访问的,需要导入 ma ...