Python进阶之UDP和TCP通信协议实例

来源:互联网 发布:ipython 查看源码 编辑:程序博客网 时间:2024/05/22 05:59

今天有的累了。。。暂不做分析了。。。。。还有程序要写。。。明天再做详细分析UDP和TCP,


下面两个示例程序都是结合多线程去做的。

利用UDP实现仿QQ的程序:

__author__ = 'Jonny'#利用多进程和UDP通信实现一个类似QQ的通信程序from socket import *from threading import Threadimport timedef sendMsg():    global  socket_qq    global  ip    global  port    #用户输入消息:    adress = (ip,port)    while True:        msg = input('<<')+'\n'        socket_qq.sendto(msg.encode('gb2312'),adress)def recvMsg():    global  socket_qq    #绑定端口    socket_qq.bind(('',6677))    #接收消息    while True:        recv_Msg = socket_qq.recvfrom(1024)        #输出显示消息        msgTime = str(time.localtime()[0])+'年'+str(time.localtime()[1])+'月'+str(time.localtime()[2])+'日'+str(time.localtime()[3])+'时'+\                  str(time.localtime()[4])+'分'+str(time.localtime()[5])+'秒:'        print('>>          '+msgTime+'\n来自[%s:%s]-->%s'%(str(recv_Msg[1][0]),str(recv_Msg[1][1]),recv_Msg[0].decode('gb2312')))def main():    #创建线程thread_recv,负责消息的接受,    thread_send = Thread(target=sendMsg)    #进程线程thread_send,负责消息的发送    thread_recv = Thread(target=recvMsg)    #开启线程    thread_send.start()    thread_recv.start()    #阻塞主线程    thread_send.join()    thread_recv.join()if __name__=='__main__':    #创建socket对象    socket_qq = socket(AF_INET,SOCK_DGRAM)    ip = input('请输入目标IP:')    port = int(input('请输入端口:'))    print('欢迎使用MM(vision1.0)!')    main()


TCP多线程服务器,可以同时为多个用户提供文本数据(有待提高)

from socket import *from threading import Thread,Lockimport threadingdef switch(clientSocket,clientInfo):    global lock    while True:        backMsg = '拒绝空请求!'        msg = clientSocket.recv(1024)        lock.acquire()        if msg.decode('gb2312') == '':            clientSocket.close()            break        print('\n>>来自:[%s:%s]-->%s'%(str(clientInfo[0]),str(clientInfo[1]),msg.decode('gb2312')))            #将用户的        if msg!= '':            backMsg = input('<<输入回复'+str(clientInfo[0])+'数据信息:')        clientSocket.send(backMsg.encode('gb2312'))        lock.release()#接收用户请求def main():    #创建一个空集合    a = {'1'}    last_a = len(a)    #创建线程列表    threads_tcp = []    serverSocket = socket(AF_INET,SOCK_STREAM)     #绑定端口号    serverSocket.bind(('',8088))    #让服务器套接字处于工作状态,(限制最多同时连接3个客户端):    serverSocket.listen()    #服务器下创建新的属于服务器的客户端,用于与外界客户端进行交流    try:        while True:            clientSocket,clientInfo = serverSocket.accept()            clint =(clientSocket,clientInfo)            a.add(clint)            if len(a)> last_a:                print('\n----------------###----------------')                print('[%s:%s]上线!'%(str(clientInfo[0]),str(clientInfo[1])))                print('----------------###----------------')                thread = Thread(target=switch,args=(clientSocket,clientInfo,))                threads_tcp.append(thread)                thread.start()            last_a = len(a)             #关闭服务器客户端和服务器            if threading.active_count()==1:                print('结束')                serverSocket.close()                break    except Exception as e:         print("服务器挂了!%s"%e)if __name__ == '__main__':    lock = Lock()    main()


原创粉丝点击