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. Loadrunner脚本编程(2)-VuGen脚本文件的开发过程

    http://www.360doc.com/content/10/0806/13/1698198_44076570.shtml 1.定义测试项目的目标,环境,脚本,测试数据,硬件等.脚本应该符合编码规 ...

  2. 转:基于 linux 平台的 libpcap 源代码分析

    libpcap 是 unix/linux 平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础.Libpcap 可以在绝大多数类 unix 平台下工作,本文分析了 libpcap 在 linu ...

  3. iOS最为简单时间轴(GZTimeLine)

    概述 迄今为止最为简单的时间轴 :可以自定义(类似于美团的送餐信息) 详细 代码下载:http://www.demodashi.com/demo/10797.html 迄今为止 最为简单的时间轴 :可 ...

  4. nginx反向代理proxy_set_header自定义header头无效

    公司使用nginx作为负载均衡,有时候需要自定义header头发送给后端的真实服务器. 想过去应该是非常的简单的事情. 例子如下: 设置代理服务器ip头   1 proxy_set_header X- ...

  5. BIND9源码分析之UDP数据处理

    本文简要介绍一下BIND9中的UDP数据处理,包括如何创建socket.设置什么socket参数.多线程环境中如何让多个线程读取53端口的数据等等. BIND9的架构采用event-driven和ta ...

  6. 几道比较难的SQL题

    上条记录和下一条记录 在展示博客文章时,在文章底部需要展示上一篇文章和下一篇文章,文章的排序当然是按照时间排序的. 选定下一条时可以用limit 1来实现,选取上一条时可以倒序limit 1实现 (S ...

  7. 使用Python的turtle库实现七段数码管绘制

    七段数码管绘制:七段数码管是由7段数码管拼接而成,每段有亮或不亮两种情况,改进的七段数码管还包括一个小数点位置.七段数码管能形成2=128种状态,其中部分状态能够显示易于人们理解的数字或字母含义.因此 ...

  8. CentOS 安装 Hadoop

    原文地址:http://www.cnblogs.com/caca/p/centos_hadoop_install.html 下载和安装   download hadoop from http://ha ...

  9. 《JAVA与模式》之适配器模式(转载)

    适配器模式比较简单,偷个懒,直接转载一篇. 个人理解: * 类适配器是通过继承来完成适配 * 对象适配器是通过传递对象来完成适配 * 不管哪种,其实都是通过引用特殊接口的对象来完成特殊接口的适配调用 ...

  10. Jmeter----逻辑控制器(Logic Controller)

    前言: 1. Jmeter官网对逻辑控制器的解释是:“Logic Controllers determine the order in which Samplers are processed.”.意 ...