網(wǎng)絡(luò)編程很常用顿膨,很底層,實際上叽赊,http協(xié)議恋沃,也是建立在網(wǎng)絡(luò)編程上的,只是說這一層必指,由nginx或者是apache實現(xiàn)了囊咏。在工作當(dāng)中,在網(wǎng)關(guān)設(shè)備之間傳輸數(shù)據(jù)的時候塔橡,就用到了網(wǎng)絡(luò)編程梅割,剛開始寫的程序部署服務(wù)器后很不穩(wěn)定,客戶端異掣鸺遥或者是斷開連接户辞,服務(wù)端就會斷開,或者是阻塞癞谒,不能再接受到客戶端的信息底燎,或者是處理多個客戶端連接時候沒有好的方案,出了不少問題弹砚,現(xiàn)在總結(jié)下這些問題双仍。
服務(wù)端
#只要一個客戶端連上,就能一直接受客戶端的消息桌吃,是一個長連接
import socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
config = ("0.0.0.0",6002)
server.bind(config)
server.listen(5)
# 阻塞朱沃,等待(監(jiān)聽)連接,等有客戶端連接之后才會往下執(zhí)行
con,addr = server.accept()
while True:
print("Client has link the server...")
try:
#阻塞茅诱,等待(監(jiān)聽)接受數(shù)據(jù)逗物,收到數(shù)據(jù)之后才會往下執(zhí)行
msg = con.recv(1024)
print(msg)
con.send(b"this is from tcp_server")
except Exception as e:
#如果客戶端斷開,那么瑟俭,報錯翎卓,打破while的循環(huán),否則一直while
print("has stop")
con.close()
break
客戶端
# 給tcp服務(wù)器發(fā)送5次消息
import socket
import time
count = 0
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
config = ("192.168.101.67",6002)
client.connect(config)
while count < 5:
client.send(b"this is from client")
#到recv()阻塞尔当,等待接受數(shù)據(jù)莲祸,接收到之后接續(xù)執(zhí)行
print(client.recv(1024))
count+=1
time.sleep(1)
服務(wù)端多線程,一個tcp服務(wù)不可能僅僅只解決一個客戶端的請求椭迎,如果按照上面的代碼锐帜,那么,若兩個客戶端同時連接了畜号,那么缴阎,只有在A客戶端的連接關(guān)閉之后,另一個客戶端B的阻塞才能終止简软,也才能和B客戶端通信蛮拔。如果才能夠多個客戶端連上tcp server后述暂,都互不影響,各自做各自的工作呢——這就想到了多線程了建炫。
import socket
import os
import threading
#得到socket
class get_server_socket():
def __init__(self,ip,port):
self.port = port
self.ip = ip
def get_socket(self):
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
config = (self.ip,self.port)
server_socket.bind(config)
server_socket.listen(10)
print("Waiting for client connect...")
return server_socket
#多線程監(jiān)聽客戶端連接
class get_msg(threading.Thread):
def __init__(self,socket,num):
super(get_msg,self).__init__()
self.socket = socket
self.num = num
def spy_client(self):
# 每一個鏈接都需要創(chuàng)造一個線程畦韭,不然當(dāng)一個線程連接上時候,其他的會阻塞
con,addr = self.socket.accept()
while True:
recv = con.recv(1024)
con.send(b"This is reply from server port")
print(recv)
print("Current thread number is {}".format(threading.activeCount()))
def run(self):
try:
self.spy_client()
except Exception as e:
#如果客戶端主動斷開或者那個線程錯誤肛跌,那么艺配,繼續(xù)延續(xù),防止線程用完
self.spy_client()
serverSocketInstance = get_server_socket("0.0.0.0",6001)
serverSocket = serverSocketInstance.get_socket()
thread_num = 3
for x in range(0,thread_num):
tmp = get_msg(serverSocket,x+1)
tmp.start()
服務(wù)端io復(fù)用
新同事所得工具(twisted)