用多執行緒實現多使用者同時收發的簡單socket服務端

2021-08-20 15:44:57 字數 2789 閱讀 2081

簡單的socket**和多執行緒練習

用socket服務端和多執行緒實現可以連線多個客戶端並同時收發的功能。

這裡要用到socket 和 threading

所以,記得:

import socket, threading

一、建立socket服務端

首先,按正常操作,建立乙個socket,選擇ipv4和資料流:

socketserver = socket.socket(socket.af_inet, socket.sock_stream)

通過socket模組獲取本地ip,並繫結ip和埠號,設定

監聽數量

:socketserver.bind((socket.gethostbyname(socket.gethostname()), 8080))

socketserver.listen(5)  #

這裡監聽數量和建立的接收執行緒數應保持一致

然後設定兩個全域性變數,以便執行緒中的得到的客戶端資訊和ip傳出,方便選擇傳送資訊

global

cilents, addrips

cilents =

addrips =

二、多執行緒

考慮到多個客戶端連線,就需要把等待連線、接收資訊、傳送資訊其中兩個個丟到多執行緒中,我選擇把傳送資訊放在主線程,並在等待連線的程序中再建立接收資訊的程序:

def waitfaccept():

while true:

cilent1, addrip = socketserver.accept()

for i in range(len(addrips)):

print('%d:%s' % (i+1, addrips[i][0]))

while threading.active_count() > 6:

pass

t = threading.thread(target=receive, args=(cilent1, addrip))

t.start()

def receive(socketserver, addrip):

while true:

try:

content = socketserver.recv(1024)

if len(content) != 0:

print('收到客戶端%d號%s的訊息:%s' % (cilents.index(socketserver) + 1, addrip[0], content.decode('utf-8')))

except connectionreseterror:

socketserver.close()

print('與%s的連線已斷開!' % addrip[0])

addrips.remove(addrip[0])

cilents.remove(socketserver)

for i in range(len(addrips)):

print('%d:%s' % (i+1, addrips[i][0]))

break

threading的用法就不用多說了吧,傳函式和引數,然後start就搞定了

三、主線程後續

然後接著寫主線程部分的內容:

threading.thread(target=waitfaccept).start()

while true:

if threading.active_count() > 2:

break

# 接收資料

while true:

while true:

for i in range(len(addrips)):

print(' %d : %s' % (i+1, addrips[i][0]))

setnum = input('請輸入客戶端編號:')

try:

setnum = int(setnum) - 1

except valueerror:

print('%s error\r\n請輸入乙個數字!' % setnum)

continue

if setnum < len(cilents) and setnum >= 0:

break

else:

print('請輸入範圍內的編號!!', end='\r')

content = input('給%s傳送的內容:' % (addrips[setnum][0]))

# cilent1.sendall(str.encode(content))

try:

cilents[setnum].sendall(content.encode('utf-8'))

except connectionreseterror:

if cilents[setnum] in cilents:

cilents.remove(cilents[setnum])

addrips.remove(addrips[0][0])

cilents[setnum].close()

寫完需要丟到多執行緒中的等待連線和接收資料函式後,啟動等待連線函式的執行緒,用while阻塞主線程,利用threading.active_count()的方法獲取執行緒數來判斷是否有客戶端連線進來。等待客戶端連線之後繼續執行主線程,根據global中儲存的客戶端,就可以愉快的選擇傳送資訊了。ps:後面的細節部分寫的不是特別好,如果接收到資料命令行會顯得很亂,不過並不影響傳送。

win7實現多使用者同時登陸

前段時間使用者要求能不能實現在win7系統上實現多使用者登陸,經過整理測試成功 2。安裝公升級包後,在控制面板 程式和功能 開啟或關閉windows功能 遠端伺服器管理工具 角色管理工具 遠端桌面服務工具,選中前面的選擇框。3。在開始 命令框輸入cmd,在彈出的dos介面輸入netstat na 如...

用mod rewrite實現多使用者二級網域名稱Blog

在httpd.conf中,對某個主機進行以下操作 rewriteengine on rewritecond 網域名稱 com rewriterule 1 c rewriterule 網域名稱 com 1 2 其他配置檔案 接著在dns中開設乙個泛解析到對應的ip位址。就可以實現下面的方案。網域名稱 ...

win7實現多使用者同時遠端登入到PC端

現在預設的win7系統是不允許多使用者同時登入到電腦上的,也就是說同一時間只能有乙個使用者在操作電腦,但是對於開發人員來說,有時候需要多人同時用到一台電腦,可不可以設定尼?答案是肯定的,只需要破解termsrv.dll這個動態庫就可以實現了。2 先手動備份一下c windows system32 t...