首先來看看兩個比較常見的 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
沒有留言:
張貼留言