2010年9月11日 星期六

Java 網路程式 - Socket

java.net.Socket 類別是 Java 拿來進行用戶端 TCP 操作的一個基礎類別

首先來看看兩個比較常見的 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

沒有留言:

張貼留言