銅川網(wǎng)站建設(shè)報(bào)價(jià)網(wǎng)絡(luò)推廣的主要工作內(nèi)容
簡單了解Sockets
Sockets:兩個(gè)計(jì)算機(jī)應(yīng)用程序之間邏輯鏈接的一個(gè)端點(diǎn),是應(yīng)用程序用來通過網(wǎng)絡(luò)發(fā)送和接收數(shù)據(jù)的邏輯接口
- 是
IP地址和端口號
的組合 - 每個(gè)Socket都被分配了一個(gè)用于標(biāo)識服務(wù)的特定端口號
- 基于連接的服務(wù)使用基于tcp的流Sockets
Java為客戶端編程提供了java.net.Socket類
- 相反,
服務(wù)器端TCP/IP編程使用java.net.ServerSocket類
。 - 另一種類型的Socket是基于udp的數(shù)據(jù)報(bào)Sockets,用于無連接的服務(wù)。
Java為UDP操作提供了java.net.DatagramSocket
什么是“Connection Timed Out”
為了從客戶端建立到服務(wù)器的連接,調(diào)用Socket構(gòu)造函數(shù),它實(shí)例化一個(gè)Socket對象
構(gòu)造函數(shù)將遠(yuǎn)程主機(jī)地址和端口號作為輸入?yún)?shù)。之后,它嘗試根據(jù)給定的參數(shù)建立到遠(yuǎn)程主機(jī)的連接,該操作將阻塞所有其他進(jìn)程,直到成功建立連接
然而,如果連接在一段時(shí)間后沒有成功,程序會拋出一個(gè)ConnectionException
,并帶有" connection timed out "消息
:java.net.ConnectException: Connection timed out: connect
在服務(wù)器端,ServerSocket類持續(xù)偵聽傳入的連接請求。當(dāng)ServerSocket接收到連接請求時(shí),它調(diào)用accept()方法來實(shí)例化一個(gè)新的Socket對象。類似地,此方法也會阻塞,直到與遠(yuǎn)程客戶機(jī)成功建立連接。
- 如果TCP握手沒有完成,則連接仍然不成功。結(jié)果,程序拋出IOException,指示在建立新連接時(shí)發(fā)生錯(cuò)誤
發(fā)生“ Read timed out”的原因
沒有服務(wù)正在偵聽遠(yuǎn)程主機(jī)上的給定端口
遠(yuǎn)程主機(jī)不接受任何連接
遠(yuǎn)程主機(jī)不可用
網(wǎng)速慢
沒有到遠(yuǎn)端主機(jī)的轉(zhuǎn)發(fā)路徑
有時(shí),防火墻出于安全原因會阻塞某些端口。因此,當(dāng)客戶端試圖建立到服務(wù)器的連接時(shí),可能會出現(xiàn)“連接超時(shí)”錯(cuò)誤。因此,在將端口綁定到服務(wù)之前,我們應(yīng)該檢查防火墻設(shè)置,看看它是否阻塞了端口。
解決方法
對于TCP客戶端和服務(wù)器端,我們可以使用setSoTimeout(int timeout)方法指定socketInputStream.read()方法阻塞的時(shí)間量:
Socket socket = new Socket(host, port);
socket.setSoTimeout(30000);
但是,如果在方法返回之前超時(shí),程序?qū)伋鯯ocketTimeoutException。