通過Java創(chuàng)建Socket連接到服務器方式
1)連接到服務器
一、使用telnet
telnet 是windows上基于網(wǎng)絡編程的調(diào)試工具,windows 可以在控制面版->程序->打開/關閉Windows特性,然后選擇Telnet 客戶端來開啟windows 上telnet
可以通過兩個基本的實驗來認識telnet
輸入:
telnet time-a.nist.gov 13
得到:
這里通過telnet 命令來連接遠程服務器,這里連接的是國家標準和技術研究所所運維的,使用這個命令后會建立和服務13端口的會話,而對應的url 也會轉(zhuǎn)換成ip地址129.6.15.28,隨后talent 軟件就會發(fā)送一個連接請求給地址,請求一個到端口13的連接,一旦建立連接,遍會發(fā)送回一行數(shù)據(jù)然后關閉這個連接,而一般的客戶端和服務器之間往往會進行更多的會話。
輸入:
telnet horstmann.com 80
返回:
因為這里是訪問外網(wǎng)的原因可能遲遲沒有給我消息,但是其實我是可以發(fā)送一個HTTP 的報文,向這個服務器提交請求
GET / HTTP/1.1 Host:horstmann.com blank line
這樣的GET請求服務器會返回我一個HTML 的頁面代碼
二、Java連接服務器
public class Test1 { public static void main(String[] args) { /*創(chuàng)建一個指定地址和端口的套接字,如果創(chuàng)建失敗會拋出一個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 不存在之外的異常會拋出一個IOException 異常 * UnknownHostException是這個異常的子異常 * */ e.printStackTrace(); } } }
套接字一旦創(chuàng)建成功就會建立與服務器對應的連接,java.net.Socket 類中的getInputStream 方法就會返回一個InputStream 對象,該對象可以像任何一個流對象一樣去使用,相應的也可以把其中的信息輸出在控制臺。
Socket 類非常的易用,因為Java庫隱藏了建立網(wǎng)絡連接和通過連接發(fā)送數(shù)據(jù)的復雜過程,實際上,java.net 包提供的編程接口與操作文件時使用的接口基本相同。
java 支持傳輸層的TCP協(xié)議,也支持UDP協(xié)議。
解決超時
1、第一種超時是連接建立成功之后,在有數(shù)據(jù)可供訪問之前,讀操作會一直阻塞下去
Socket s = new Socket(...); s.setTimeout(10000);
通過socket.setTimeOut方法可以設置套接字的超時時間,如果超過這個時間就會拋出SocketTimeoutException 異常,如果此時讀操作和寫操作在沒有完成前就超時,可以通過捕獲這個超時異常做出反應。
2、通過Socket 的構(gòu)造器可以建立與服務器的連接,但是如果一直無法建立連接,就會一直阻塞下去,直到建立了連接。
可以通過:
Socket s =new Socket(); s.connect(new InetSocketAddress(host,port),timeout)
設置超時時間來處理一直無法連接上的問題。
三、因特網(wǎng)地址
就是通過域名來獲取IP地址,一般的IP的地址是4字節(jié)的,而IPV6是16字節(jié)的,這時就可以通過**InetAddress類來實現(xiàn)**
只要主機支持IPV6格式的因特網(wǎng)地址,java.net 包也會支持它
獲取指定域名的IP地址:
public class Test1 { public static void main(String[] args) throws UnknownHostException { String host = "www.baidu.com"; /*InetAddress address = InetAddress.getByAddress(host);*/ /* 一般的域名只會對應一個一個IP地址 而一些訪問量比較大的域名會對應多個IP地址,從而實現(xiàn)負載均衡 可以通過上面的方法獲取一個IP地址 也可以通過下面的方法獲取一個域名對應的多個IP地址 */ /*InetAddress 的toString方法會會返回一個字符串類型,進而打印會輸出對應的ip地址*/ InetAddress[] addresses = InetAddress.getAllByName(host); for (InetAddress address : addresses){ System.out.println(address); } } }
如果想獲取本地的IP地址可以通過:
public static void main(String[] args) throws UnknownHostException { InetAddress address = InetAddress.getLocalHost(); System.out.println(address); }
前面輸出的是主機名而后面輸出的是主機的IP地址
四、用到的API
- java.netl.Sokcet 類
Socket(String host,int port)
創(chuàng)建一個套接字,指定主機和端口
Socket
創(chuàng)建一個為連接的套接字
InputStream getInputStream() OutputStream getOutputStream()
獲取從套接字中讀取數(shù)據(jù)的流
void connect(SocketAddress address)
將套接字連接到指定的地址
void connect(SocketAddress address,int timeout)
連接到指定地址,如果給定時間內(nèi)沒有響應,則返回
void setTimeout(int timeout)
設置套接字上的讀請求的阻塞時間,超出給定時間拋出InterruptedIOException
boolean isConnected()
如果該套接字被連接,則返回true
boolean isClosed()
如果該套接字被關閉返回False
- java.net.InetAddress類
statci InetAddress getByName(String host) statci InetAddress[] getAllByName(String host)
給定主機名一個InetAddress 對象,或者一個數(shù)組
static InetAddress getLocalHost()
為本機創(chuàng)建一個InetAddress 對象
byte[] getAddress()
返回一個包含數(shù)字行地址的字節(jié)數(shù)組
IP 地址的字節(jié)數(shù)組表示
String getHostAddress()
返回值一個十進制組成的字符串,各數(shù)字用. 隔開
129.6.15.28
String getHostName()
返回主機名
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
MyBatis傳入List集合查詢數(shù)據(jù)問題
這篇文章主要介紹了MyBatis傳入List集合查詢數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02Java實現(xiàn)Excel文件轉(zhuǎn)PDF(無水印無限制)
這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)Excel文件轉(zhuǎn)PDF的效果,并可以無水印、無限制。文中的示例代碼講解詳細,需要的可以參考一下2022-06-06使用Java實現(xiàn)大小寫轉(zhuǎn)換實例代碼
最近在開發(fā)項目中遇到一個比較好用的方法,那就是對字符串中的字母大小進行轉(zhuǎn)換,所以下面這篇文章主要給大家介紹了關于如何使用Java實現(xiàn)大小寫轉(zhuǎn)換的相關資料,需要的朋友可以參考下2022-06-06Java之NoClassDefFoundError的原因及分析
在Java開發(fā)中,經(jīng)常會遇到ClassNotFoundException和NoClassDefFoundError異常,ClassNotFoundException發(fā)生在編譯時JVM無法找到類,而NoClassDefFoundError則發(fā)生在運行時JVM無法加載類,這兩個異常雖然原因相似,但有本質(zhì)區(qū)別2024-09-09springboot中shiro使用自定義注解屏蔽接口鑒權(quán)實現(xiàn)
本文主要介紹了springboot中shiro使用自定義注解屏蔽接口鑒權(quán)實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07如何解決Mybatis--java.lang.IllegalArgumentException: Result Maps
這兩天因為項目需要整合spring、struts2、mybatis三大框架,但啟動的時候總出現(xiàn)這個錯誤,困擾我好久,折騰了好久終于找到問題根源,下面小編給大家分享下問題所在及解決辦法,一起看看吧2016-12-12Java利用Socket和IO流實現(xiàn)文件的上傳與下載
本文主要介紹了Java利用Socket和IO流實現(xiàn)文件的上傳與下載,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04