新聞中心
tcp端口阻塞解決方法?
1、前提要有個(gè)外網(wǎng)IP,如果沒有就給運(yùn)營商打電話,告訴他你要個(gè)外網(wǎng)IP,要不然不能下載。

創(chuàng)新互聯(lián)公司長期為成百上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為尉氏企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、成都網(wǎng)站制作,尉氏網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
3、使用下面解決辦法的時(shí)候,要先關(guān)閉系統(tǒng)防火墻(不想關(guān)閉,可以在防火墻添加允許程序)。
5、解決辦法1:去路由器設(shè)置界面,打開upnp。
7、解決辦法2:去路由器設(shè)置界面,設(shè)置端口轉(zhuǎn)發(fā),TCP和UDP,端口22223,指向本機(jī)IP。
大家知道,tcp的讀和寫是阻塞的,即讀的時(shí)候不知道什么時(shí)候讀完,寫的時(shí)候不知道什么時(shí)候?qū)懲?,因此線程就一直暫停在哪里,一般tcp程序用在上位機(jī)下位機(jī)之間對吧!下位機(jī)一些設(shè)備一般會(huì)發(fā)心跳報(bào)文給我們機(jī)器,假設(shè)為10s發(fā)一次吧,當(dāng)機(jī)器超過10s沒接收到數(shù)據(jù),那么我們就要考慮把socket斷開,因?yàn)椴粩嚅_的話設(shè)備重新連接可能又會(huì)建立新的socket,這樣如果設(shè)備反復(fù)斷開連接的話,將產(chǎn)生大量的socket,占用大量系統(tǒng)資源,這里我們用socket.setSoTimeout(500)方法解決read方法的阻塞問題,同時(shí)設(shè)定一個(gè)標(biāo)志位,在異常處理程序當(dāng)中退出socket連接:
InputStream is = null;
OutputStream os = null;
int flag = 0;
try {
socket.setSoTimeout(500); // 0.5秒就退出read()方法的阻塞
is = socket.getInputStream();
os = socket.getOutputStream();
} catch (Exception e2) {
e2.printStackTrace();
網(wǎng)絡(luò)編程中阻塞和非阻塞socket的區(qū)別?
阻塞:一般的I/O操作可以在新建的流中運(yùn)用.在服務(wù)器回應(yīng)前它等待客戶端發(fā)送一個(gè)空白的行.當(dāng)會(huì)話結(jié)束時(shí),服務(wù)器關(guān)閉流和客戶端socket.如果在隊(duì)列中沒有請示將會(huì)出現(xiàn)什么情況呢?那個(gè)方法將會(huì)等待一個(gè)的到來.這個(gè)行為叫阻塞.accept()方法將會(huì)阻塞服務(wù)器線程直到一個(gè)呼叫到來.當(dāng)5個(gè)連接處理完閉之后,服務(wù)器退出.任何的在隊(duì)列中的呼叫將會(huì)被取消.
非阻塞:非阻塞套接字是指執(zhí)行此套接字的網(wǎng)絡(luò)調(diào)用時(shí),不管是否執(zhí)行成功,都立即返回。比如調(diào)用recv()函數(shù)讀取網(wǎng)絡(luò)緩沖區(qū)中數(shù)據(jù),不管是否讀到數(shù)據(jù)都立即返回,而不會(huì)一直掛在此函數(shù)調(diào)用上。在實(shí)際Windows網(wǎng)絡(luò)通信軟件開發(fā)中,異步非阻塞套接字是用的最多的。平常所說的C/S(客戶端/服務(wù)器)結(jié)構(gòu)的軟件就是異步非阻塞模式的
Socket編程,為什么客戶端無法接收來自服務(wù)器的數(shù)據(jù)?
第一:Socket編程時(shí),永遠(yuǎn)不要在關(guān)閉寫(writer)之前關(guān)閉讀(reader) 第二:不管是客戶端還是服務(wù)端在通過Socket讀取數(shù)據(jù)的時(shí)候,在你的數(shù)據(jù)傳輸完成后,發(fā)送一個(gè)結(jié)束標(biāo)記(比如:end),這樣在你的 while循環(huán)里面判斷一下數(shù)據(jù)是否已經(jīng)傳輸完畢,完畢后跳出循環(huán),否則由于你的程序就會(huì)一直阻塞在 readLine()這里,因?yàn)槟愕?socket還沒有斷開,會(huì)一直等待你寫數(shù)據(jù)。
到此,以上就是小編對于socket 阻塞 非阻塞的問題就介紹到這了,希望這3點(diǎn)解答對大家有用。
名稱欄目:tcp端口阻塞解決方法?socket阻塞windows
鏈接URL:http://www.dlmjj.cn/article/cogcecc.html


咨詢
建站咨詢
