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

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


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

利用UDP实现仿QQ的程序:

__author__ = 'Jonny'
#利用多进程和UDP通信实现一个类似QQ的通信程序
from socket import *
from threading import Thread
import time

def 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,Lock
import threading

def 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()


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值