最終目標:啟動服務後可以有無數個訪問,並且可以隨時輸入,服務端使用程序池。
服務端
from socket import *import
os,time
from concurrent.futures import
processpoolexecutor
deffunc(conn,addr):
while
true:
try:
ret = conn.recv(1024)
ifnot ret:break
time.sleep(5)
print(ret.decode('
utf-8'))
conn.send(ret.upper())
print("
埠號:【%s】是,程序id:【%s】
"% (addr[1],os.getpid()))
except
connectionreseterror:
break
if__name__ == "
__main__":
server =socket(af_inet, sock_stream)
server.setsockopt(sol_socket, so_reuseaddr, 1)
server.bind((
'127.0.0.1
', 8130))
server.listen(5)
p = processpoolexecutor(2)
while
true:
conn,addr =server.accept()
p.submit(func,conn,addr)
客戶端
from socket import *while
true:
client =socket(af_inet, sock_stream) #這裡使用的是偽鏈結,每輸入一次都會斷開,但客戶端看起來一直與服務端保持著鏈結,其實沒有
data = input('
>>>
').strip()
client.connect((
'127.0.0.1
',8130))
client.send(data.encode(
'utf-8'))
ret = client.recv(1024)
print(ret.decode('
utf-8'))
client.close()
建立了4個客戶端,執行結果
hgsdfa埠號:【54815】是,程序id:【15828】
eawd
埠號:【54817】是,程序id:【5580】
few埠號:【54819】是,程序id:【15828】
few埠號:【54820】是,程序id:【5580】
cv;埠號:【54829】是,程序id:【15828】
g埠號:【54831】是,程序id:【5580】
#可以清楚的看到,程序id只有兩個,證明確實是在程序池中迴圈
程序池版socket併發聊天
server pool內的程序數預設是cpu核數,假設為4 檢視方法os.cpu count 開啟6個客戶端,會發現2個客戶端處於等待狀態 在每個程序內檢視pid,會發現pid使用為4個,即多個客戶端公用4個程序 from socket import from multiprocessing imp...
用socket來傳送郵件
以前用vb時,記得有個mail控制項,後來接觸到了cdo.messages這個玩意,發郵件是蠻方便,那還是在vbs的情況下,後來看了下php,perl,發現發郵件乙個函式就可以了,呵呵,那麼這些背後的細節是什麼呢,還是用socket來揭示下吧 郵件傳送離不開一樣東西,smtp,即簡單郵件傳輸協議,對...
基於多執行緒來實現併發的socket套接字
server import socket from threading import thread def server conn while true try data conn.recv 1024 except exception continue if data b q print 關閉子執行...