socket通信簡單實現

1.所謂Socket通常也稱作“套接字”,用於描述IP地址和端口,是一個通信鏈的句柄

2.應用程序通常通過“套接字”向網絡發送請求或者應答網絡請求

3.Socket有兩種主要的操作方式:面向連接(TCP)的和無連接的(UDP)。

4.Java.net中提供了兩個類Socket和ServerSocket,分別用來表示雙向連接的客戶端和服務端。

一個客戶端要發起一次通信,首先必須知道運行服務器端的主機IP地址。然後由網絡基礎設施利用目標地址,將客戶端發送的信息傳遞到正確的主機上。

ServerSocket:這個類是實現了一個服務器端的Socket,利用這個類可以監聽來自網絡的請求(當要監控多個客戶端時,可使用類ExecutorService,其對象獲取方法:Executors.newCachedThreadPool(); 調用該對象的execute(Runnablecommand)即可,在未來某個時間執行給定的命令。該命令可能在新的線程、已入池的線程或者正調用的線程中執行,這由Executor實現決定)。創建一個ServerSocket必須指定一個端口,以便客戶端能夠向該端口號發送連接請求。其accept()方法爲下一個傳入的連接請求創建Socket實例。

 Socket:利用Socket構造函數,可創建一個TCP套接字後,先連接到指定的遠程地址和端口號。

通信過程中順序:服務器端首先得到輸入流,然後將輸入流信息輸出到其各個客戶端

Socket提供了getInputStream()和getOutputStream()方法來得到輸入輸出流。然後再對輸入流輸出流進行讀寫操作,例 如,對於服務器端,得到Socket對象後,調用getInputStream方法即  可得到來自客戶端的流,調用getOutStream方法可得到向客 戶端發送數據的流。對於客戶端,調用getInputStream方法即可得到來自服務器的流,調用getOutStream方法可得到向服務器端發送  數 據的流。下面是一個簡單的例子:

public class SocketClient {

    public static void main(String [] args){

        Socket socket=null;
        BufferedReader reader=null;
        PrintWriter writer=null;
        try {
            //客戶端socket指定服務器的地址和端口號
            socket=new Socket("127.0.0.1", SingleSocketService.port);
            //獲取服務端的輸入流
             reader =new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //用於發送返回信息,
             writer =new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
            for (int i = 0; i < 10; i++) {
                writer.println("body" + i);
                writer.flush();
                String str=reader.readLine();
                System.out.println(str);
            }

            writer.println("end");
            writer.flush();

        } catch (Exception e) {
            e.printStackTrace();
        }finally {

            try {
                reader.close();
                writer.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}
public class SingleSocketService {

    public static int port =8080;

    public static void main(String [] agres){

        ServerSocket serverSocket = null;
        BufferedReader bufferedReader = null;
        PrintWriter writer = null;
        Socket socket = null;
        //設定服務端的端口號
        try {
            serverSocket=new ServerSocket(port);
            ////等待請求,此方法會一直阻塞,直到獲得請求才往下走
            socket=serverSocket.accept();
            //用於接收客戶端發來的請求,得到輸入流
            bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //用於發送返回信息,可以不需要裝飾這麼多io流使用緩衝流時發送數據要注意調用.flush()方法
            writer=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);

            while (true){
                String str=bufferedReader.readLine();//接收到的信息
                if(str.equals("end")){
                    break;
                }

                Thread.sleep(1000);
                writer.println("Message Received");
                writer.flush();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                bufferedReader.close();
                writer.close();
                socket.close();
                serverSocket.close();
            }catch (Exception e){

            }
        }

    }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章