电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

淺談java socket的正確關閉姿勢

瀏覽:5日期: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
相關文章:
主站蜘蛛池模板: 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 太阳能发电系统-太阳能逆变器,控制器-河北沐天太阳能科技首页 | 牛皮纸|牛卡纸|进口牛皮纸|食品级牛皮纸|牛皮纸厂家-伽立实业 | MES系统工业智能终端_生产管理看板/安灯/ESOP/静电监控_讯鹏科技 | 恒温油槽-恒温水槽-低温恒温槽厂家-宁波科麦仪器有限公司 | 木材烘干机,木炭烘干机,纸管/佛香烘干设备-河南蓝天机械制造有限公司 | 家德利门业,家居安全门,别墅大门 - 安徽家德利门业有限公司 | 纯化水设备-纯水设备-超纯水设备-[大鹏水处理]纯水设备一站式服务商-东莞市大鹏水处理科技有限公司 | 蔬菜配送公司|蔬菜配送中心|食材配送|饭堂配送|食堂配送-首宏公司 | 钢木实验台-全钢实验台-化验室通风柜-实验室装修厂家-杭州博扬实验设备 | 哈希余氯测定仪,分光光度计,ph在线监测仪,浊度测定仪,试剂-上海京灿精密机械有限公司 | 智能家居全屋智能系统多少钱一套-小米全套价格、装修方案 | 上海道勤塑化有限公司 | 江苏农村商业银行招聘网_2024江苏农商行考试指南_江苏农商行校园招聘 | 成都竞价托管_抖音代运营_网站建设_成都SEM外包-成都智网创联网络科技有限公司 | 垃圾压缩设备_垃圾处理设备_智能移动式垃圾压缩设备--山东明莱环保设备有限公司 | 锂电叉车,电动叉车_厂家-山东博峻智能科技有限公司 | 沥青车辙成型机-车托式混凝土取芯机-混凝土塑料试模|鑫高仪器 | POS机办理_个人pos机免费领取-银联pos机申请首页 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 空气能采暖,热泵烘干机,空气源热水机组|设备|厂家,东莞高温热泵_正旭新能源 | 脱硝喷枪-氨水喷枪-尿素喷枪-河北思凯淋环保科技有限公司 | 铝镁锰板厂家_进口钛锌板_铝镁锰波浪板_铝镁锰墙面板_铝镁锰屋面-杭州军晟金属建筑材料 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 回收二手冲床_金丰旧冲床回收_协易冲床回收 - 大鑫机械设备 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | 河北码上网络科技|邯郸小程序开发|邯郸微信开发|邯郸网站建设 | 焊管生产线_焊管机组_轧辊模具_焊管设备_焊管设备厂家_石家庄翔昱机械 | 砖机托板价格|免烧砖托板|空心砖托板厂家_山东宏升砖机托板厂 | 头条搜索极速版下载安装免费新版,头条搜索极速版邀请码怎么填写? - 欧远全 | 走心机厂家,数控走心机-台州博城智能科技有限公司 | 原色会计-合肥注册公司_合肥代理记账公司_营业执照代办 | 金联宇电缆|广东金联宇电缆厂家_广东金联宇电缆实业有限公司 | 常州翔天实验仪器厂-恒温振荡器-台式恒温振荡器-微量血液离心机 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 广州监控安装公司_远程监控_安防弱电工程_无线wifi覆盖_泉威安防科技 | 招商帮-一站式网络营销服务|搜索营销推广|信息流推广|短视视频营销推广|互联网整合营销|网络推广代运营|招商帮企业招商好帮手 | 恒温振荡混匀器-微孔板振荡器厂家-多管涡旋混匀器厂家-合肥艾本森(www.17world.net) | 济南轻型钢结构/济南铁艺护栏/济南铁艺大门-济南燕翔铁艺制品有限公司 | SF6环境监测系统-接地环流在线监测装置-瑟恩实业 |