真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python網(wǎng)絡(luò)編程基于多線程實現(xiàn)多用戶全雙工聊天功能-創(chuàng)新互聯(lián)

多線程原理:TCP服務(wù)器會創(chuàng)建一個線程池,每當(dāng)有客戶端請求連接的時候,它便會從線程池中分配一個線程同客戶端建立連接,當(dāng)客戶端中斷連接后,線程便銷毀。

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比安新網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式安新網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋安新地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。

SocketServer 是標準庫中一個高級別的模塊。用于簡化網(wǎng)絡(luò)客戶與服務(wù)器的實現(xiàn)。

socketserver模塊中分兩大類:server類(解決連接問題)和request類(解決通信問題)

我們將服務(wù)器做為中轉(zhuǎn)站來處理信息,一方面與客戶端互動,另一方面進行消息轉(zhuǎn)發(fā)。

大體思路確定下來后,需要確定一些通信規(guī)則:

1. 客戶端與服務(wù)器建立連接后,需要輸入用戶名登入,若用戶名已存在,將reuse反饋給用戶,用戶輸出錯誤信息,退出

2. 用戶輸入正確的用戶名后,即可進行通信了。如果未選擇通信對象,則服務(wù)器會反饋信息,提示用戶選擇通信對象

3. 選擇通信對象的方法為,輸入to:username,如果所選擇的對象不存在,反饋錯誤信息,重新輸入

4.當(dāng)正確選擇通信對象后,雙方建立連接,通過服務(wù)器中轉(zhuǎn)信息進行通信

5.在通信中,若發(fā)送‘quit',則結(jié)束發(fā)送消息的線程,并指示服務(wù)器該用戶準備登出,服務(wù)器刪除該用戶后,反饋消息給用戶,用戶結(jié)束接收消息的線程并退出

6.如果A正在與C通信,此時B向A發(fā)送信息,則A的通信窗口變?yōu)榕cB的通信窗口,即接收到B消息后,A發(fā)出的消息不再是給C,而是默認給B

實現(xiàn)代碼:

#!/usr/bin/python

'test TCP server'

from socket import *

from time import ctime

import threading #多線程模塊

import re #正則表達式模塊

HOST = ''

PORT = 21567

BUFSIZ = 1024

ADDR = (HOST, PORT)

def Deal(sock, user):

while True:

data = sock.recv(BUFSIZ) #接收用戶的數(shù)據(jù)

if data == 'quit': #用戶退出

del clients[user]

sock.send(data)

sock.close()

print '%s logout' %user

break

elif re.match('to:.+', data) is not None: #選擇通信對象

data = data[3:]

if clients.has_key(data):

chatwith[sock] = clients[data]

chatwith[clients[data]] = sock

else:

sock.send('the user %s is not exist' %data)

else:

if chatwith.has_key(sock): #進行通信

chatwith[sock].send("[%s] %s: %s" %(ctime(), user, data))

else:

sock.send('Please input the user who you want to chat with')

tcpSerSock = socket(AF_INET, SOCK_STREAM)

tcpSerSock.bind(ADDR)

tcpSerSock.listen(5)

clients = {} #提供 用戶名->socket 映射

chatwith = {} #提供通信雙方映射

while True:

print 'waiting for connection...'

tcpCliSock, addr = tcpSerSock.accept()

print '...connected from:',addr

username = tcpCliSock.recv(BUFSIZ) #接收用戶名

print 'The username is:',username

if clients.has_key(username): #查找用戶名

tcpCliSock.send("Reuse") #用戶名已存在

tcpCliSock.close()

else:無錫婦科醫(yī)院排行 http://www.0510bhyy.com/

tcpCliSock.send("Welcome!") #登入成功

clients[username] = tcpCliSock

chat = threading.Thread(target = Deal, args = (tcpCliSock,username)) #創(chuàng)建新線程進行處理

chat.start() #啟動線程

tcpSerSock.close()

#!/usr/bin/python

'test tcp client'

from socket import *

import threading

HOST = 'localhost'

PORT = 21567

BUFSIZ = 1024

ADDR = (HOST, PORT)

threads = []

def Send(sock, test): #發(fā)送消息

while True:

data = raw_input('>')

tcpCliSock.send(data)

if data == 'quit':

break

def Recv(sock, test): #接收消息

while True:

data = tcpCliSock.recv(BUFSIZ)

if data == 'quit':

sock.close() #退出時關(guān)閉socket

break

print data

tcpCliSock = socket(AF_INET, SOCK_STREAM)

tcpCliSock.connect(ADDR)

print 'Please input your username:',

username = raw_input()

tcpCliSock.send(username)

data = tcpCliSock.recv(BUFSIZ)

if data == 'Reuse':

print 'The username has been used!'

else:

print 'Welcome!'

chat = threading.Thread(target = Send, args = (tcpCliSock,None)) #創(chuàng)建發(fā)送信息線程

threads.append(chat)

chat = threading.Thread(target = Recv, args = (tcpCliSock,None)) #創(chuàng)建接收信息線程

threads.append(chat)

for i in range(len(threads)): #啟動線程

threads[i].start()

threads[0].join() #在我們的設(shè)計中,send線程必然先于recv線程結(jié)束,所以此處只需要調(diào)用send的join,等待recv線程的結(jié)束。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


分享文章:Python網(wǎng)絡(luò)編程基于多線程實現(xiàn)多用戶全雙工聊天功能-創(chuàng)新互聯(lián)
URL分享:http://weahome.cn/article/pepjd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部