午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

淺談java socket的正確關(guān)閉姿勢(shì)

瀏覽:36日期:2022-08-10 14:48:53

java socket對(duì)應(yīng)的是網(wǎng)絡(luò)協(xié)議中的tcp,tcp的三次握手、四次揮手、11中狀態(tài)什么的這里就不說(shuō)了,不知道大家平常使用socket的時(shí)候如果不注意的情況下,會(huì)不會(huì)遇到各種異常報(bào)錯(cuò)。

例如:

java.net.SocketException:socket is closed

錯(cuò)誤提示的出現(xiàn)場(chǎng)景:

自己主動(dòng)關(guān)閉了socket,但是之后還從里面讀寫(xiě)數(shù)據(jù)

Software caused connection abort: socket write error

錯(cuò)誤提示的出現(xiàn)場(chǎng)景:

對(duì)方已經(jīng)關(guān)閉socket,依舊向?qū)Ψ綄?xiě)數(shù)據(jù)

connection reset (by peer)

錯(cuò)誤提示出現(xiàn)的場(chǎng)景:

一端socket被關(guān)閉,另一端仍然發(fā)送數(shù)據(jù),發(fā)送的第一個(gè)數(shù)據(jù)包 connection reset by peer

一端socket退出,退出時(shí)為關(guān)閉連接,另一端讀數(shù)據(jù) connection reset

所以在使用socket時(shí),需要約定好雙方讀寫(xiě)完成的條件,然后關(guān)閉輸入輸出流:

socket.shutdownInput();socket.shutdownOutput();

即當(dāng)一方寫(xiě)入完成后,調(diào)用shutdownOutput關(guān)閉輸出流,這時(shí)候?qū)Ψ降膔ead方法就會(huì)返回-1,這時(shí)候?qū)Ψ骄椭滥銓?xiě)完了,對(duì)方可以關(guān)閉輸入流,然后等待對(duì)方寫(xiě)入完成調(diào)用shutdownOutput后己方再調(diào)用shutdownInput,雙方就正常關(guān)閉了輸入輸出流,這時(shí)候socket就不會(huì)出現(xiàn)異常了。

下面是一個(gè)socket交互的例子:

server端

public class OioServer { public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8080);while (true) { Socket socket = serverSocket.accept(); System.out.println('socket = ' + socket); new Thread(() -> {try { InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); out.write('hello! I get your message that is follow'.getBytes(Charset.forName('UTF-8'))); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) != -1) {System.out.print(new String(buf, 0, len, Charset.forName('UTF-8')));out.write(buf, 0, len); } out.write('n end n'.getBytes(Charset.forName('UTF-8'))); out.flush(); socket.shutdownInput(); socket.shutdownOutput();} catch (IOException e) { e.printStackTrace();}finally { try {socket.close(); } catch (IOException e) {e.printStackTrace(); }} }).start();} }}

client端

public class OioClient { public static void main(String[] args) throws IOException {Socket socket = new Socket('127.0.0.1', 8080);InputStream in = socket.getInputStream();new Thread(() -> { BufferedInputStream bufferIn = new BufferedInputStream(in); byte[] buf = new byte[1024]; try {int len;while ((len = bufferIn.read(buf)) != -1) { System.out.print(new String(buf, 0, len, Charset.forName('UTF-8')));} }catch (Exception e) {e.printStackTrace(); } try {socket.shutdownInput();socket.close(); } catch (IOException e) {e.printStackTrace(); }}).start();OutputStream out = socket.getOutputStream();int cout = 10;while (cout-- > 0) { out.write(('this time is ' + System.currentTimeMillis() + 'n').getBytes('UTF-8'));}socket.shutdownOutput(); }}java socket - 半關(guān)閉

通常,使用關(guān)閉輸出流來(lái)表示輸出已經(jīng)結(jié)束。但在進(jìn)行網(wǎng)絡(luò)通信時(shí)則不能這樣做。因?yàn)槲覀冴P(guān)閉輸出流時(shí),該輸出流對(duì)應(yīng)的Socket也將隨之關(guān)閉,這樣程序?qū)o(wú)法再?gòu)脑搒ocket中讀取數(shù)據(jù)。

為了應(yīng)付這種情況,socket提供了兩個(gè)半關(guān)閉的方法用來(lái)只關(guān)閉socket的輸入流或者輸出流,用以表示輸出數(shù)據(jù)已經(jīng)發(fā)送完成。

方法詳情:

shutdownInput():關(guān)閉該socket的輸入流,程序還可以通過(guò)該socket的輸出流輸出數(shù)據(jù);

shutdownOutput():關(guān)閉該socket的輸出流,程序還可以通過(guò)該socket的輸入流讀取數(shù)據(jù)。

當(dāng)調(diào)用shutdownInput()或shutdownOutput()方法關(guān)閉輸入流或輸出流后,該socket處于半關(guān)閉狀態(tài)。

此時(shí)可以使用isInputShutdown()或isOutputShutdown()來(lái)判斷該socket是否處于半讀狀態(tài)或半寫(xiě)狀態(tài)。

需要注意的是,即使同一個(gè)socket先后調(diào)用shutdownInput()和shutdownInput()方法,該socket實(shí)例仍然沒(méi)有被關(guān)閉,只是該socket既不能輸出數(shù)據(jù)也不能讀取數(shù)據(jù)而已。

當(dāng)調(diào)用shutdownInput()或shutdownOutput()方法關(guān)閉了輸入流或輸出流之后,該socket無(wú)法再次打開(kāi)輸出流或輸入流,因此這種做法不適合需要保持持久通信狀態(tài)的交互式應(yīng)用。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 在线观看国产成人 | 四虎最新地址 | 成人影片在线 | 色吊丝欧美 | 操综合网 | av男人天堂网 | 欧美日韩中文在线 | 在线精品亚洲欧美日韩国产 | 天天舔天天射 | 国产绿帽 | 狼人色综合 | 嫩草影院污 | 国产一线大片 | 亚洲国产一区二区三区在线观看 | 黄色大片91 | 欧美日韩视频免费观看 | 神马午夜精品95 | 欧美另类在线视频 | 婷婷俺来也 | 欧美成人黑人xx视频免费观看 | 国产又爽又黄又嫩又猛又粗 | av免费网站在线观看 | 青青国产精品视频 | 免费欧美一级 | 岛国av网 | 成人婷婷 | av大片免费看 | 一区二区三区免费在线观看视频 | 香蕉久久a毛片 | 狠狠干在线视频 | 国产精品视频一区二区三区不卡 | 黄色小视频免费在线观看 | 极品久久久 | 日本国产一区 | 加勒比在线一区 | 在线观看国产黄色 | 天天干天天插天天射 | 最新av免费 | 成年人黄色一级片 | 日本中出视频 | 精品视频99|