首先來看看兩個比較常見的 Socket 建構式
1. public Socket(String host, int port)
throws UnknownHostException, IOException
參數 host 代表一個主機的名稱,而參數 int 是代表遠端連線的通訊埠
例如:Socket socket = new Socket("tw.yahoo.com", 80);
以上會建立一個TCP socket 並連接到所指定的遠端主機及通訊埠
2.public Socket(InetAddress host, int port)
throws IOException
這邊比較不同的是 host 是一個 InetAddress 物件
例如:
InetAddress host = InetAddress.getByName("tw.yahoo.com");
Socket socket = new Socket(host, 80);
在第一點中如果所指定的遠端主機無法解析就會拋出 UnknownHostException
接下來可以透過以下程式來找出你自己主機中
1到1024所有的埠號中 有哪些有 TCP 連接
import java.io.*; import java.net.*; public class socketTest{ public static void main(String[] args){ for(int i=1;i<=1024;i++) { try{ Socket socket = new Socket("localhost", i); System.out.println("There is a TCP in localhost on port " + i); }catch(Exception e){} } } }
接下來介紹一些比較 Socket 重要的 method
1. public InetAddress getInetAddress() //回傳你所連線到的遠端主機的 InetAddress 物件
2. public int getPort() //回傳你所連接到遠端主機的哪個通訊埠
3. public int getLocalPort() //回傳你在本地連線所使用的是哪個通訊埠
4. public InputStream getInputStream() throws IOException
//回傳一個讀取資料的輸入串流
5. public OutputStream getOutputStream() throws IOException
//回傳一個寫入資料到遠端的輸出串流
接下來說明一下第四和第五點
第四點簡單說就是取得遠端回傳給你的訊息,透過 getInputStream()
可以取得一個輸入串流,通常可以將他串接到其他的串流或是 reader
第五點也就是寫入資料到遠端,透過的就是 OutputStream 了
看看以下程式:
import java.io.*; import java.net.*; public class socketPort{ public static void main(String[] args){ try{ Socket yahooSocket = new Socket("tw.yahoo.com", 80); System.out.println("connect to " + yahooSocket.getInetAddress() + " on remote port " + yahooSocket.getPort()); //印出遠端的通訊埠 System.out.println("connect to " + yahooSocket.getInetAddress() + " on local port " + yahooSocket.getLocalPort()); //印出連接遠端的本地端通訊埠 Writer out = new OutputStreamWriter(yahooSocket.getOutputStream(), "8859_1"); //串接在 OutputStreamWriter 並以 "8859_1" 編碼 out.write("GET / HTTP 1.0\r\n\r\n"); //輸出資料到遠端, 這邊我對遠端送出一個 GET 的請求 out.flush(); //記得要做 或是關閉也可 InputStream in = yahooSocket.getInputStream(); //取得輸入串流 int c; while((c = in.read()) != -1){ System.out.print((char)c); //要轉成 char, 因為是 c 印出來是 ASCII code } }catch(Exception e){System.out.println(e)} } }
以上是一個 getInputStream() 和 getOutputStream() 的例子
不過上述我得到的是一個 Bad Request ....
why ?
不過不一定要這樣做,可以去找一些簡單的 server 來做示範, 例如 echo
沒有留言:
張貼留言