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聊天室程序的更多相关文章

  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. Python C/C++ 拓展使用接口库(build-in) ctypes 使用手册

    Python C/C++ 拓展使用接口库(build-in) ctypes 使用手册 ctypes 是一个Python 标准库中的一个库.为了实现调用 DLL,或者共享库等C数据类型而设计.它可以把这 ...

  2. MYSQL在Win下免安装zip

    mysql对于Win测试简单zip安装即可了解my.in配置文件的妙处(show variables),本地搭建mysql服务测试引擎! 01.下载 https://dev.mysql.com/dow ...

  3. Android 线性布局(LinearLayout)相关官方文档 - 指南部分

    Android 线性布局(LinearLayout)相关官方文档 - 指南部分 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用 ...

  4. Spring配置文件头信息

    代码如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...

  5. HDUOJ--1865 1string

    1sting Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  6. Python实现天数倒计时计算

    tips:在datetime模块里有一个计算时间差的 timedelta.让两个datetime对象相减就得到timedelta ###--Python实现天数倒计时计算 #tips:在datetim ...

  7. Python 绘图库的使用:matplotlib

    Matplotlib 官方API地址:https://matplotlib.org/ 例子: import matplotlib.pyplot as plt num_list=[1.5,0.6,7.8 ...

  8. 解决js中文输入法无法触发onkeyup事件问题(转)

    当监听一个input的keyup的事件的时候,英文输入法的情况下可以实时的通过keyup事件检测到文本框value的变化,但是当输入法变成中文后,input的keyup事件就不会被正常触发. onin ...

  9. web.csproj Compile 下出现两个同名 xxx.cs 项目中出现两个xxx.cs

    删掉一个就好了 ItemGroup Compile 为加载的cs代码文件

  10. C#实现用Newtonsoft.Json 4.5.11解析人人网院校信息并获取院系信息

    http://cfanz.cn/index.php?c=article&a=read&id=42444 http://files.cnblogs.com/lyl6796910/Wind ...