30歲的程序員和50歲的程序員編程思路和編程想法會(huì)有什么不同呢?我,30來(lái)歲,我們公司另外一個(gè)程序員老陳,50來(lái)歲,公司有一臺(tái)設(shè)備,有兩個(gè)上位機(jī),分別主控上位機(jī)和視覺(jué)上位機(jī),這兩個(gè)上位機(jī)之前需要進(jìn)行通訊,主控上位機(jī)需要向視覺(jué)上位機(jī)發(fā)送命令,視覺(jué)上位機(jī)進(jìn)行拍照和視覺(jué)運(yùn)算,我們定的是使用TcpIp進(jìn)行通訊,也就是一個(gè)TcpIp的通訊,我和他在想法上產(chǎn)生了小小的分歧。
我和老陳最開(kāi)始商量,又視覺(jué)上位機(jī)作為T(mén)cpIp的服務(wù)端,主控上位機(jī)作為T(mén)cpIp的客戶(hù)端,因?yàn)橐曈X(jué)檢測(cè)的項(xiàng)目比較多,由主控上位機(jī)發(fā)送不同的視覺(jué)檢測(cè)命令,然后視覺(jué)上位機(jī)根據(jù)主控上位機(jī)發(fā)送的命令來(lái)執(zhí)行不同的視覺(jué)檢測(cè)接口,然后反饋檢測(cè)結(jié)果給主控上位機(jī)。
因?yàn)槔详愔回?fù)責(zé)發(fā)送命令,具體要檢測(cè)哪些東西老陳最開(kāi)始是不知道的,所以通訊規(guī)則只能由我來(lái)定,所以我就對(duì)整體TcpIp的通訊邏輯進(jìn)行了封裝。
首先,我定義了一個(gè)消息類(lèi)型的枚舉(MeassageTypeEnum),目的就是定義不同的檢測(cè)項(xiàng),然后又定義了一個(gè)消息頭(MessageHeader)的結(jié)構(gòu)體,消息頭的主要內(nèi)容分別是檢測(cè)類(lèi)型、ClientKey、Guid。
這個(gè)ClientKey是由服務(wù)端分配給每一個(gè)客戶(hù)端的,這樣可以防止非授權(quán)的客戶(hù)端連接視覺(jué)上位機(jī)。
在主控上位機(jī),也就是客戶(hù)端(TcpClient)第一次連接視覺(jué)上位機(jī),也就是服務(wù)端(TcpService)的時(shí)候,服務(wù)端會(huì)根據(jù)ClientKey生成一個(gè)Guid,返回給客戶(hù)端。
在客戶(hù)端正式發(fā)送檢測(cè)命令的時(shí)候,需要在消息頭(MessageHeader)中寫(xiě)入消息類(lèi)型、ClientKey,并將第一次連接服務(wù)端時(shí)服務(wù)端返回的Guid一并帶入消息頭。
服務(wù)端在收到客戶(hù)端發(fā)送的消息時(shí),首先會(huì)檢測(cè)ClientKey和Guid是否是對(duì)應(yīng)的,若不不對(duì)應(yīng),則不處理該消息。
我這么做本身目的也不復(fù)雜,主要還是以前寫(xiě)WebApi寫(xiě)多了,簡(jiǎn)單對(duì)每一個(gè)客戶(hù)端進(jìn)行了類(lèi)似Auth2.0的密鑰驗(yàn)證,如果做復(fù)雜一些的話(huà),可能還可以做Sign驗(yàn)證。使用Guid來(lái)驗(yàn)證客戶(hù)端本身的安全性并不高,但是可以在一定程度上防止非授權(quán)連接!
當(dāng)我將封裝好的TcpIp通訊邏輯代碼發(fā)給老陳后,老陳看了下,覺(jué)得我搞了個(gè)ClientKey和Guid有點(diǎn)多余。
在他看來(lái),目前跟視覺(jué)上位機(jī)通訊的,只有主控上位機(jī),想要保證連接安全,我只需要在服務(wù)端做個(gè)設(shè)定,就是只允許一個(gè)客戶(hù)端連接即可,沒(méi)必要搞那么多東西。
但是,我跟老陳說(shuō),我給他的封裝好的客戶(hù)端接口都已經(jīng)封裝好了,老陳這邊什么都不需要做,只需要實(shí)例化一個(gè)客戶(hù)端,然后連接就成了,后續(xù)的各種命令其實(shí)也只需要調(diào)用函數(shù)即可。
但是,老陳有點(diǎn)聽(tīng)不進(jìn)去,還是覺(jué)得我這么做有點(diǎn)多余,我為了說(shuō)服老陳,跟他說(shuō),如果只限制一個(gè)客戶(hù)端的調(diào)用,如果以后視覺(jué)檢測(cè)結(jié)果需要通過(guò)TcpIp發(fā)送給其他機(jī)器,這時(shí)候代碼還得改。
說(shuō)了一通,老陳還是覺(jué)得,到時(shí)候只要將客戶(hù)端的連接數(shù)量改為2即可,也沒(méi)那么麻煩。
于是我跟老陳說(shuō),現(xiàn)在我所有接口都已經(jīng)封裝好了,再按照老陳的方法去做,我還得刪一堆代碼。
老陳似乎覺(jué)得我怕麻煩,于是就說(shuō):“你代碼不是給我了嘛,我來(lái)給你改!”
最后,拗不過(guò)老陳,我只能說(shuō):“那你改吧,按照你說(shuō)的做就行了,改好了把代碼上傳即可,我再改我這邊的代碼!”
結(jié)語(yǔ)
其實(shí),我也不是說(shuō)不過(guò)老陳,只是,如果我堅(jiān)持我的想法,老陳最后肯定會(huì)上頭,加上這件事情本身就并不復(fù)雜,我覺(jué)得按誰(shuí)的想法來(lái)都沒(méi)有問(wèn)題,因此最后我在這個(gè)問(wèn)題上選擇了妥協(xié)。
但是,雖然我妥協(xié)了,可我其實(shí)對(duì)于老陳的做法還是持保留意見(jiàn)的,老陳的做法過(guò)于簡(jiǎn)單粗暴了,且拓展性也不強(qiáng),安全性基本上也等于沒(méi)有,萬(wàn)一連接被占用,那主控上位機(jī)就只能報(bào)錯(cuò)了!
最后我要說(shuō)的是,這件事情里面,沒(méi)有誰(shuí)是誰(shuí)非,純簡(jiǎn)單得想法碰撞!
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶(hù)上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.