今天有的累了。。。暂不做分析了。。。。。还有程序要写。。。明天再做详细分析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()