簡單的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...