發布:2023-04-30 21:47:00編輯:視頻君來源:視頻教程網
是這樣的,首先客戶端非法中斷,或者調用close(fd)后服務器調用recv或者read,會返回ECONNRESET,這個錯誤告訴你對端(客戶端已經關閉了或者進行重啟),理論說遇到這個問題和處理recv/read返回值為0是一個效果,服務器將該鏈接斷開即可。
為避免這個錯誤可采用以下兩個方法:
shutdown(s, SHUT_WR);
close(s);
先關閉寫端,強制發送FIN,這樣服務器收到后調用recv返回0,可以確定客戶端已經關閉。
網上也有人說的
若設置了SO_LINGER并確定了非零的超時間隔,則closesocket()調用阻塞進程,直到所剩數據發送完畢或超時。這種關閉稱為逗優雅地或逗從容地關閉。
struct linger so_linger;
so_linger.l_onoff = true;
so_linger.l_linger = 30;
int z = setsockopt(s,SOL_SOCKET,SO_LINGER, &so_linger,sizeof so_linger);
是這樣的,首先客戶端非法中斷,或者調用close(fd)后服務器調用recv或者read,會返回ECONNRESET,這個錯誤告訴你對端(客戶端已經關閉了或者進行重啟),理論說遇到這個問題和處理recv/read返回值為0是一個效果,服務器將該鏈接斷開即可。
為避免這個錯誤可采用以下兩個方法:
shutdown(s, SHUT_WR);
close(s);
先關閉寫端,強制發送FIN,這樣服務器收到后調用recv返回0,可以確定客戶端已經關閉。
網上也有人說的
若設置了SO_LINGER并確定了非零的超時間隔,則closesocket()調用阻塞進程,直到所剩數據發送完畢或超時。這種關閉稱為“優雅”或“從容”關閉。
struct linger so_linger;
so_linger.l_onoff = true;
so_linger.l_linger = 30;
int z = setsockopt(s,SOL_SOCKET,SO_LINGER, &so_linger,sizeof so_linger);
socket error:Error:read ECONNRESET.
接口錯誤:錯誤:讀取 ECONNRESET
可能原因:
1、socket隊列中沒有空間了。
2、數據流接口上發送的數據無法讀取或不承認。
3、拋出的異常也有可能是客戶端中斷連接。 當客戶端中斷連接的時候服務器也會拋出這個異常出來。也就是說客戶端正在連接的時候 突然終止 了連接,這樣,服務器端會拋出異常出來。
gnd有沒有啟動在e90/gnd/里面也可以啟動,如果不能啟動,可能是防火墻的問題。還有就是:1打開控制面板---添加硬件---下一步---是,我已經連接了此硬件---添加新的硬件設置---下一步---安裝我手動從列表選擇的硬件(高級)---下一步---端口(COM和LPT),點擊打開,選擇ECP打印機端口即可2.我的電腦---屬性---硬件---設備管理器---端口(COM和LPT)---ECP打印機端口(LPT?)---右鍵屬性---端口設置---LPT端口號---選LPT1---資源---輸入/輸出范圍---更改設置---確定---重啟計算機
示您的計算機無法連上服務器,請檢查您的Proxy設定以及Proxy相關賬號,或暫時取消您防毒軟件的「個人防火墻」。 · 出現網絡聯機錯誤Socket error #11004 應該是網絡聯機狀態問題,請用戶檢查網絡聯機是否正常。 · 出現網絡聯機錯誤Socket error #10060 Connection Timed Out 表示您與服務器發生聯機逾時錯誤,請檢查您的Proxy相關設定,以及Proxy Server是否已將SSL 443 port打開。 · 出現網絡聯機錯誤Socket error #10061 表示服務器忙碌中無法與您建立聯機,請稍后再試。 · 出現網絡聯機錯誤Socket error #10022 請您上網更新Windows操作系統組件。Windows NT version 4.0的用戶請下載安裝 Service Pack 5(含)以上。 · 出現Internal Server Error 主機忙碌中,請您稍后再試
所謂socket通常也稱作"套接字",用于描述IP地址和端口,是一個通信鏈的句柄。應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求。
以J2SDK-1.3為例,Socket和ServerSocket類庫位于java.net包中。ServerSocket用于服務器端,Socket是建立網絡連接時使用的。在連接成功時,應用程序兩端都會產生一個Socket實例,操作這個實例,完成所需的會話。對于一個網絡連接來說,套接字是平等的,并沒有差別,不因為在服務器端或在客戶端而產生不同級別。不管是Socket還是ServerSocket它們的工作都是通過SocketImpl類及其子類完成的。
重要的Socket API:
java.net.Socket繼承于java.lang.Object,有八個構造器,其方法并不多,下面介紹使用最頻繁的三個方法,其它方法大家可以見JDK-1.3文檔。
. Accept方法用于產生"阻塞",直到接受到一個連接,并且返回一個客戶端的Socket對象實例。"阻塞"是一個術語,它使程序運行暫時"停留"在這個地方,直到一個會話產生,然后程序繼續;通常"阻塞"是由循環產生的。
. getInputStream方法獲得網絡連接輸入,同時返回一個InputStream對象實例。
. getOutputStream方法連接的另一端將得到輸入,同時返回一個OutputStream對象實例。
注意:其中getInputStream和getOutputStream方法均會產生一個IOException,它必須被捕獲,因為它們返回的流對象,通常都會被另一個流對象使用。
2ServerSocket類例子編輯
package com.lanber.socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
/**
* 注意:Socket的發送與接收是需要同步進行的,即客戶端發送一條信息,服務器必需先接收這條信息,
* 而后才可以向客戶端發送信息,否則將會有運行時出錯。
* @param args
*/
public static void main(String[] args) {
ServerSocket ss = null;
try {
ss = new ServerSocket(8888);
//服務器接收到客戶端的數據后,創建與此客戶端對話的Socket
Socket socket = ss.accept();
//用于向客戶端發送數據的輸出流
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//用于接收客戶端發來的數據的輸入流
DataInputStream dis = new DataInputStream(socket.getInputStream());
System.out.println("服務器接收到客戶端的連接請求:" + dis.readUTF());
//服務器向客戶端發送連接成功確認信息
dos.writeUTF("接受連接請求,連接成功!");
//不需要繼續使用此連接時,關閉連接
socket.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3客戶端的例子編輯
package com.lanber.socket;
importjava.io.DataInputStream;
import java.io.DataOutputStream;
importjava.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientDemo {
/**
* @param args
*/
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("localhost",8888);
//獲取輸出流,用于客戶端向服務器端發送數據
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//獲取輸入流,用于接收服務器端發送來的數據
DataInputStream dis = new DataInputStream(socket.getInputStream());
//客戶端向服務器端發送數據
dos.writeUTF("我是客戶端,請求連接!");
//打印出從服務器端接收到的數據
System.out.println(dis.readUTF());
//不需要繼續使用此連接時,記得關閉哦
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}