亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

淺談java socket的正確關閉姿勢

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

java socket對應的是網絡協議中的tcp,tcp的三次握手、四次揮手、11中狀態什么的這里就不說了,不知道大家平常使用socket的時候如果不注意的情況下,會不會遇到各種異常報錯。

例如:

java.net.SocketException:socket is closed

錯誤提示的出現場景:

自己主動關閉了socket,但是之后還從里面讀寫數據

Software caused connection abort: socket write error

錯誤提示的出現場景:

對方已經關閉socket,依舊向對方寫數據

connection reset (by peer)

錯誤提示出現的場景:

一端socket被關閉,另一端仍然發送數據,發送的第一個數據包 connection reset by peer

一端socket退出,退出時為關閉連接,另一端讀數據 connection reset

所以在使用socket時,需要約定好雙方讀寫完成的條件,然后關閉輸入輸出流:

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

即當一方寫入完成后,調用shutdownOutput關閉輸出流,這時候對方的read方法就會返回-1,這時候對方就知道你寫完了,對方可以關閉輸入流,然后等待對方寫入完成調用shutdownOutput后己方再調用shutdownInput,雙方就正常關閉了輸入輸出流,這時候socket就不會出現異常了。

下面是一個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 - 半關閉

通常,使用關閉輸出流來表示輸出已經結束。但在進行網絡通信時則不能這樣做。因為我們關閉輸出流時,該輸出流對應的Socket也將隨之關閉,這樣程序將無法再從該socket中讀取數據。

為了應付這種情況,socket提供了兩個半關閉的方法用來只關閉socket的輸入流或者輸出流,用以表示輸出數據已經發送完成。

方法詳情:

shutdownInput():關閉該socket的輸入流,程序還可以通過該socket的輸出流輸出數據;

shutdownOutput():關閉該socket的輸出流,程序還可以通過該socket的輸入流讀取數據。

當調用shutdownInput()或shutdownOutput()方法關閉輸入流或輸出流后,該socket處于半關閉狀態。

此時可以使用isInputShutdown()或isOutputShutdown()來判斷該socket是否處于半讀狀態或半寫狀態。

需要注意的是,即使同一個socket先后調用shutdownInput()和shutdownInput()方法,該socket實例仍然沒有被關閉,只是該socket既不能輸出數據也不能讀取數據而已。

當調用shutdownInput()或shutdownOutput()方法關閉了輸入流或輸出流之后,該socket無法再次打開輸出流或輸入流,因此這種做法不適合需要保持持久通信狀態的交互式應用。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 毛片免费全部完整播放 | 亚洲人成网站在线播放观看 | 午夜污片| 国产一区美女视频 | 日韩三级在线观看 | 寡妇一级a毛片免费播放 | 一本伊大人香蕉在线观看 | 国产99在线a视频 | 亚洲视频免费在线播放 | 国产日韩在线视频 | 国产乱淫视频 | 91亚洲人成手机在线观看 | 欧美一区二区三区不卡 | 亚洲精品视频一区 | 91最新在线播放 | 美女黄污网站 | 91一区二区三区四区五区 | 中文字幕一区在线观看 | 91最新在线播放 | 日韩一级黄色片 | 国产超薄肉色丝袜的免费网站 | 国产在线精品一区二区三区 | 蜜桃视频一区 | 日韩亚洲综合精品国产 | 国产三级日本三级在线播放 | 亚洲色综合 | 亚洲精品一二三四区 | 成人永久福利在线观看不卡 | 国产精品三级国语在线看 | 久久天天躁狠狠躁夜夜中文字幕 | 久操网址 | 能看av的网址| 一级做a爱过程免费视频高清 | 国产亚洲欧美另类专区 | 四虎现在的网址入口2022 | 欧美日韩一区二区三区高清不卡 | 成人免费体验区福利云点播 | 国产www色 | 日韩激情无码免费毛片 | 欧美成人26uuu欧美毛片 | 亚洲精品第三页 |