1. 程式人生 > >socket is closed異常的原因及其解決方法

socket is closed異常的原因及其解決方法

在一個有關socket的程式中,客戶端出現了 socket is closed異常,我百思不得其解,並沒有關閉socket啊。

下面首先來分析一下這個異常出現的原因:該異常在客戶端和伺服器均可能發生。異常的原因是己方主動關閉了連線後(呼叫了Socket的close方法)再對網路連線進行讀寫操作。

而造成socket關閉常見的有以下兩種:
1、呼叫了.close()方法關閉socket
2、關閉了輸入輸出流

下面來看一下我的錯誤程式碼

 BufferedWriter bufferedWriter=null;
                try {
                    bufferedWriter = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream
())); } catch (IOException e) { Log.d("Client","BufferedWriter出錯"); e.printStackTrace(); } // 獲得EditTex的內容 String text = mEditText.getText().toString(); Log.e("Client","即將傳送的資訊為:"+text);
Log.e("Client","haha"); try { // 傳送資料 if (bufferedWriter != null) { bufferedWriter.write(text+"\r\n"); } bufferedWriter.flush(); bufferedWriter.close
(); } catch (IOException e) { Log.e("Client","傳送資料出錯"); e.printStackTrace(); } Log.e("Client", "成功傳送資料"); // 清空內容 mEditText.setText(""); Log.e("Client", "下面開始讀取資料"); try { BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),"UTF-8")); Log.e("Client","完畢"); String s=in.readLine(); Log.e("Client",s); } catch (IOException e) { Log.e("Client",e.getMessage()); }

可以看到在用write()方法傳送完成後,又呼叫了bufferedWriter.close();正是因為這一行程式碼,導致socket closed。而下面BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),"UTF-8"));因此出現異常

那麼我們的解決方式是將bufferedWriter.close();下移到末尾處即可如下:

 BufferedWriter bufferedWriter=null;
                try {
                    bufferedWriter = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

                } catch (IOException e) {
                    Log.d("Client","BufferedWriter出錯");
                    e.printStackTrace();
                }
                // 獲得EditTex的內容
                String text = mEditText.getText().toString();
                Log.e("Client","即將傳送的資訊為:"+text);
                Log.e("Client","haha");
                try {
                    // 傳送資料
                    if (bufferedWriter != null) {
                        bufferedWriter.write(text+"\r\n");
                    }
                    bufferedWriter.flush();

                } catch (IOException e) {
                    Log.e("Client","傳送資料出錯");
                    e.printStackTrace();
                }
                Log.e("Client", "成功傳送資料");
                // 清空內容
                mEditText.setText("");
                Log.e("Client", "下面開始讀取資料");
                try {
                    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),"UTF-8"));
                    Log.e("Client","完畢");
                    String s=in.readLine();
                    Log.e("Client",s);
                } catch (IOException e) {
                    Log.e("Client",e.getMessage());
                }

相關推薦

socket is closed異常原因及其解決方法

在一個有關socket的程式中,客戶端出現了 socket is closed異常,我百思不得其解,並沒有關閉socket啊。 下面首先來分析一下這個異常出現的原因:該異常在客戶端和伺服器均可能發生。異常的原因是己方主動關閉了連線後(呼叫了Socket的clo

MySQL的Illegal mix of collationsy異常原因解決方法

ear 代碼 clear 今天 tag 類型 資料 bsp net 原創 2008年12月25日 11:54:00 標簽: mysql / collation / character / variables / database / server 今天

機器學習中的梯度消失、爆炸原因及其解決方法(筆記1)

前言         本文主要深入介紹深度學習中的梯度消失和梯度爆炸的問題以及解決方案。本文分為三部分,第一部分主要直觀的介紹深度學習中為什麼使用梯度更新,第二部分主要介紹深度學習中梯度消失及爆炸的原因,第三部分對提出梯度消失

ConcurrentModificationException異常原因解決方法

  在前面一篇文章中提到,對Vector、ArrayList在迭代的時候如果同時對其進行修改就會丟擲java.util.ConcurrentModificationException異常。下面我們就來討論以下這個異常出現的原因以及解決辦法。   以下是本文目錄大綱:   一.Conc

梯度消失、爆炸原因及其解決方法

一、梯度不穩定問題: 什麼是梯度不穩定問題:深度神經網路中的梯度不穩定性,前面層中的梯度或會消失,或會爆炸。 原因:前面層上的梯度是來自於後面層上梯度的乘乘積。當存在過多的層次時,就出現了內在本質上的不穩定場景,如梯度消失和梯度爆炸。 二、梯度消失(vanishing gradient problem)

java.util.ConcurrentModificationException異常原因解決方法

在java語言中,ArrayList是一個很常用的類,在程式設計中經常要對ArrayList進行刪除操作,在使用remove方法對ArrayList進行刪除操作時,報java.util.ConcurrentModificationException異常,下面探討一下該異常的原因以及解決辦法。 1 impo

Java ConcurrentModificationException異常原因解決方法

  在前面一篇文章中提到,對Vector、ArrayList在迭代的時候如果同時對其進行修改就會丟擲java.util.ConcurrentModificationException異常。下面我們就來討論以下這個異常出現的原因以及解決辦法。 一.Concur

入門|詳解機器學習中的梯度消失、爆炸原因及其解決方法

前言:   本文主要深入介紹深度學習中的梯度消失和梯度爆炸的問題以及解決方案。本文分為三部分,第一部分主要直觀的介紹深度學習中為什麼使用梯度更新,第二部分主要介紹深度學習中梯度消失及爆炸的原因,第三部分對提出梯度消失及爆炸的解決方案。有基礎的同鞋可以跳著閱讀。 其中,梯度

fetch out of sequence sqlcode = -1002 異常原因解決方法

Cause:    In a host language program, a FETCH call was issued out of sequence. A successful parse-and-execute call must be issued before a fetch. This c

淺談導致專案延期的幾點原因及其解決方法

1. 對客戶需求把握不全面 原因分析: 需求規格說明書、概要設計、詳細設計中對客戶需求的分析和把握不全。 解決方法: 在進行概要設計時,派人常駐客戶處詳細瞭解業務及需求,幫助客戶明確需求,方便將需求確定下來,儘量避免後期需求的變更和追加。要及時與客戶溝通、交流,對客戶提出的

Servlet執行原理及404、500、405異常原因解決方法總結

一、Servlet執行原理 比如,在瀏覽器位址列輸入          http://ip:port/web01/hello 整個通訊流程如下圖所示: 分步解釋:          1、瀏覽器依

“段錯誤 (核心已轉儲) ”一種可能原因及其解決方法

終端在執行的時候總是出現 “段錯誤 (核心已轉儲) ” 棧空間用來儲存陣列等資料,那麼段錯誤就應該是我儲存的陣列超過了它所在段的大小,於是在的程式執行的過程中一到跟大陣列相關的步驟就會出現段錯誤的提示(SIGSEGV: Segmentation fault)。      linux下應用  u

部落格園首頁新隨筆聯絡管理訂閱 隨筆- 216 文章- 1 評論- 2 Java ConcurrentModificationException異常原因解決方法

  在前面一篇文章中提到,對Vector、ArrayList在迭代的時候如果同時對其進行修改就會丟擲java.util.ConcurrentModificationException異常。下面我們就來討論以下這個異常出現的原因以及解決辦法。 一.ConcurrentModificationExcept

點選導航欄,ie8 下記憶體遞增的原因及其解決方法(主要是圍繞是否是iframe導致的)

最近幾個專案中均遇到這樣的一個問題:點選導航欄ie8 下記憶體遞增 該如何解決? 首先要明白2個概念:記憶體溢位和記憶體洩露; 記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;比

org.hibernate.SessionException: Session is closed! 異常解決方法

    今天寫了一個SpringMVC的小應用,功能很簡單,在使用者登入的時候如果發現自己沒有使用者名稱和密碼就點選註冊,跳轉到註冊頁面註冊一個,如果註冊成功,自動跳轉到登入頁面,否則跳到錯誤頁面。     問題出現在註冊成功後登入的時候。如果直接登入不存在這個問題。問題的

ssm整合時出現 org.springframework.beans.factory.BeanCreationException :Error creating bean with name ‘XXX’ 異常原因解決方法

ase wan oca conn sna aspect ava 配置 ng- ssm整合時出現 org.springframework.beans.factory.BeanCreationException :Error creating bean with name ‘X

easyUI datagrid 多行多列數據渲染異常緩慢原因以及解決方法

後端 http 前後端 公司 發送請求 class 之前 vue 做的 原因 最近,在優化之前公司幫聯想(外包)做的一個老的後臺管理系統,由於項目是基於easy UI框架,頁面是後臺用jsp實現的,再加上在公司推行前後端分離的實踐,大部分項目都基於vue采用前後端分離去實現

spring事務(Transaction )報 marked as rollback-only異常原因解決方法

很多朋友在使用spring+hibernate或mybatis等框架時經常遇到報Transaction rolled back because it has been marked as rollback-only的異常,這個異常是怎麼造成的 呢,下面將給大家進行詳細的分析。 &nbs

ConcurrentModificationException: 集合異常——產生原因解決方法

:注意事項:迭代器在使用的時候,有人為了方便,如下使用就會有問題 System.out.println(((Student)it.next()).getName()+”---”+((Student)it.next()).getAge()); 注意事項:迭代器在使用的時候,有人為了方便,如下使

【夾娃系列】java面試基礎知識儲備(¥2)——JVM記憶體劃分和記憶體溢位異常原因解決方法

JVM記憶體劃分和記憶體溢位 JVM記憶體劃分 記憶體溢位的異常和解決辦法 JVM記憶體劃分 堆:存放物件例項,被所有的執行緒共享的一塊區域。垃圾收集器管理的主要區域。 方法區:儲存虛擬機器載入的類資訊,常量,靜態變