通過(guò)Java創(chuàng)建Socket連接到服務(wù)器方式
1)連接到服務(wù)器
一、使用telnet
telnet 是windows上基于網(wǎng)絡(luò)編程的調(diào)試工具,windows 可以在控制面版->程序->打開(kāi)/關(guān)閉Windows特性,然后選擇Telnet 客戶端來(lái)開(kāi)啟windows 上telnet
可以通過(guò)兩個(gè)基本的實(shí)驗(yàn)來(lái)認(rèn)識(shí)telnet
輸入:
telnet time-a.nist.gov 13
得到:

這里通過(guò)telnet 命令來(lái)連接遠(yuǎn)程服務(wù)器,這里連接的是國(guó)家標(biāo)準(zhǔn)和技術(shù)研究所所運(yùn)維的,使用這個(gè)命令后會(huì)建立和服務(wù)13端口的會(huì)話,而對(duì)應(yīng)的url 也會(huì)轉(zhuǎn)換成ip地址129.6.15.28,隨后talent 軟件就會(huì)發(fā)送一個(gè)連接請(qǐng)求給地址,請(qǐng)求一個(gè)到端口13的連接,一旦建立連接,遍會(huì)發(fā)送回一行數(shù)據(jù)然后關(guān)閉這個(gè)連接,而一般的客戶端和服務(wù)器之間往往會(huì)進(jìn)行更多的會(huì)話。
輸入:
telnet horstmann.com 80
返回:
因?yàn)檫@里是訪問(wèn)外網(wǎng)的原因可能遲遲沒(méi)有給我消息,但是其實(shí)我是可以發(fā)送一個(gè)HTTP 的報(bào)文,向這個(gè)服務(wù)器提交請(qǐng)求
GET / HTTP/1.1 Host:horstmann.com blank line
這樣的GET請(qǐng)求服務(wù)器會(huì)返回我一個(gè)HTML 的頁(yè)面代碼


二、Java連接服務(wù)器
public class Test1 {
public static void main(String[] args) {
/*創(chuàng)建一個(gè)指定地址和端口的套接字,如果創(chuàng)建失敗會(huì)拋出一個(gè)UnknownHostException*/
try (Socket s = new Socket("time-a.nist.gov",13);
Scanner in = new Scanner(s.getInputStream(),"utf-8")
){
while (in.hasNextLine()){
String line = in.nextLine();
System.out.println(line);
}
}catch (IOException e) {
/*如果存在host 不存在之外的異常會(huì)拋出一個(gè)IOException 異常
* UnknownHostException是這個(gè)異常的子異常
* */
e.printStackTrace();
}
}
}套接字一旦創(chuàng)建成功就會(huì)建立與服務(wù)器對(duì)應(yīng)的連接,java.net.Socket 類中的getInputStream 方法就會(huì)返回一個(gè)InputStream 對(duì)象,該對(duì)象可以像任何一個(gè)流對(duì)象一樣去使用,相應(yīng)的也可以把其中的信息輸出在控制臺(tái)。

Socket 類非常的易用,因?yàn)镴ava庫(kù)隱藏了建立網(wǎng)絡(luò)連接和通過(guò)連接發(fā)送數(shù)據(jù)的復(fù)雜過(guò)程,實(shí)際上,java.net 包提供的編程接口與操作文件時(shí)使用的接口基本相同。
java 支持傳輸層的TCP協(xié)議,也支持UDP協(xié)議。
解決超時(shí)
1、第一種超時(shí)是連接建立成功之后,在有數(shù)據(jù)可供訪問(wèn)之前,讀操作會(huì)一直阻塞下去
Socket s = new Socket(...); s.setTimeout(10000);
通過(guò)socket.setTimeOut方法可以設(shè)置套接字的超時(shí)時(shí)間,如果超過(guò)這個(gè)時(shí)間就會(huì)拋出SocketTimeoutException 異常,如果此時(shí)讀操作和寫(xiě)操作在沒(méi)有完成前就超時(shí),可以通過(guò)捕獲這個(gè)超時(shí)異常做出反應(yīng)。
2、通過(guò)Socket 的構(gòu)造器可以建立與服務(wù)器的連接,但是如果一直無(wú)法建立連接,就會(huì)一直阻塞下去,直到建立了連接。
可以通過(guò):
Socket s =new Socket(); s.connect(new InetSocketAddress(host,port),timeout)
設(shè)置超時(shí)時(shí)間來(lái)處理一直無(wú)法連接上的問(wèn)題。
三、因特網(wǎng)地址
就是通過(guò)域名來(lái)獲取IP地址,一般的IP的地址是4字節(jié)的,而IPV6是16字節(jié)的,這時(shí)就可以通過(guò)**InetAddress類來(lái)實(shí)現(xiàn)**
只要主機(jī)支持IPV6格式的因特網(wǎng)地址,java.net 包也會(huì)支持它
獲取指定域名的IP地址:
public class Test1 {
public static void main(String[] args) throws UnknownHostException {
String host = "www.baidu.com";
/*InetAddress address = InetAddress.getByAddress(host);*/
/*
一般的域名只會(huì)對(duì)應(yīng)一個(gè)一個(gè)IP地址
而一些訪問(wèn)量比較大的域名會(huì)對(duì)應(yīng)多個(gè)IP地址,從而實(shí)現(xiàn)負(fù)載均衡
可以通過(guò)上面的方法獲取一個(gè)IP地址
也可以通過(guò)下面的方法獲取一個(gè)域名對(duì)應(yīng)的多個(gè)IP地址
*/
/*InetAddress 的toString方法會(huì)會(huì)返回一個(gè)字符串類型,進(jìn)而打印會(huì)輸出對(duì)應(yīng)的ip地址*/
InetAddress[] addresses = InetAddress.getAllByName(host);
for (InetAddress address : addresses){
System.out.println(address);
}
}
}


如果想獲取本地的IP地址可以通過(guò):
public static void main(String[] args) throws UnknownHostException {
InetAddress address = InetAddress.getLocalHost();
System.out.println(address);
}
前面輸出的是主機(jī)名而后面輸出的是主機(jī)的IP地址

四、用到的API
- java.netl.Sokcet 類
Socket(String host,int port)
創(chuàng)建一個(gè)套接字,指定主機(jī)和端口
Socket
創(chuàng)建一個(gè)為連接的套接字
InputStream getInputStream() OutputStream getOutputStream()
獲取從套接字中讀取數(shù)據(jù)的流
void connect(SocketAddress address)
將套接字連接到指定的地址
void connect(SocketAddress address,int timeout)
連接到指定地址,如果給定時(shí)間內(nèi)沒(méi)有響應(yīng),則返回
void setTimeout(int timeout)
設(shè)置套接字上的讀請(qǐng)求的阻塞時(shí)間,超出給定時(shí)間拋出InterruptedIOException
boolean isConnected()
如果該套接字被連接,則返回true
boolean isClosed()
如果該套接字被關(guān)閉返回False
- java.net.InetAddress類
statci InetAddress getByName(String host) statci InetAddress[] getAllByName(String host)
給定主機(jī)名一個(gè)InetAddress 對(duì)象,或者一個(gè)數(shù)組
static InetAddress getLocalHost()
為本機(jī)創(chuàng)建一個(gè)InetAddress 對(duì)象
byte[] getAddress()
返回一個(gè)包含數(shù)字行地址的字節(jié)數(shù)組
IP 地址的字節(jié)數(shù)組表示
String getHostAddress()
返回值一個(gè)十進(jìn)制組成的字符串,各數(shù)字用. 隔開(kāi)
129.6.15.28
String getHostName()
返回主機(jī)名
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java?GUI實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java?GUI實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
springboot整合阿里云百煉DeepSeek實(shí)現(xiàn)sse流式打印的操作方法
這篇文章主要介紹了springboot整合阿里云百煉DeepSeek實(shí)現(xiàn)sse流式打印,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2025-04-04
Spring運(yùn)行時(shí)手動(dòng)注入bean的方法實(shí)例
spring給我們提供了IOC服務(wù),讓我們可以用注解的方式,方便的使用bean的相互引用,下面這篇文章主要給大家介紹了關(guān)于Spring運(yùn)行時(shí)手動(dòng)注入bean的相關(guān)資料,需要的朋友可以參考下2022-05-05
SpringBoot結(jié)合mockito測(cè)試實(shí)戰(zhàn)
與集成測(cè)試將系統(tǒng)作為一個(gè)整體測(cè)試不同,單元測(cè)試更應(yīng)該專注于某個(gè)類。所以當(dāng)被測(cè)試類與外部類有依賴的時(shí)候,尤其是與數(shù)據(jù)庫(kù)相關(guān)的這種費(fèi)時(shí)且有狀態(tài)的類,很難做單元測(cè)試。但好在可以通過(guò)“Mockito”這種仿真框架來(lái)模擬這些比較費(fèi)時(shí)的類,從而專注于測(cè)試某個(gè)類內(nèi)部的邏輯2022-11-11
詳解java如何處理各種批量數(shù)據(jù)入庫(kù)
這篇文章主要為大家詳細(xì)介紹了java如何使用BlockingQueue處理各種批量數(shù)據(jù)入庫(kù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11

