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聊天室编程(一)之 ...
随机推荐
- 类的专有方法(__len__)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #http://www.imooc.com/code/6252 #类的专有方法(__len__) #如果一个类 ...
- java 在控制台上输入密码时,密码不显示在控制台上
用下面的方法可以实现在控制台上输入密码时,密码不显示在控制台上:Console cons=System.console(); System.out.print(" 密码:"); c ...
- 重叠IO overlapped I/O 运用详解
2009年02月21日 星期六 下午 07:54 I/O设备处理必然让主程序停下来干等I/O的完成,对这个问题有 方法一:使用另一个线程进行I/O.这个方案可行,但是麻烦. ...
- jquery checkbox选框操作
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- idea中pom.xml关于oracle配置
由于Oracle授权问题,Maven3不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到本地仓库. Orace驱动的下载:htt ...
- java配置使用手册
进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置: 1.下载jdk(http://java.sun.com/javase/downloads/index.jsp),我下载的版本是 ...
- 【LeetCode】130. Surrounded Regions (2 solutions)
Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A ...
- Google Chrome调试js代码,开发者工具之调试工具常用功能
参考:Google Chrome调试js代码-http://www.open-open.com/lib/view/open1384785324165.html 重点:左下角一个{}括号图标按钮用于把杂 ...
- 简述Android触摸屏手势识别
很多时候,利用触摸屏的Fling.Scroll等Gesture(手势)操作来操作会使得应用程序的用户体验大大提升,比如用Scroll手势在 浏览器中滚屏,用Fling在阅读器中翻页等.在Android ...
- C# 中一些类关系的判定方法 C#中关于增强类功能的几种方式 Asp.Net Core 轻松学-多线程之取消令牌
1. IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口. public interface IAnimal { } public interface ID ...