Socket

參考資料:https://www.cnblogs.com/goodboy-heyang/p/6372058.html

 Socket通信實現步驟:1、創建ServerSocket和Socket(client)。2、打開連接到Socket的輸入/輸出流。3、按照協議對Socket進行讀/寫操作。4、關閉輸入輸出流、關閉Socket。

一定有兩個不同的Socket(要麼ip不同,要麼port不同)才能通信!!!

1 創建服務端

    1、創建ServerSocket對象,綁定監聽端口。     new ServerSocket(8888)
    2、通過accept()方法監聽客戶端請求。   Socket socket =   serverSocket.accept()    
    3、鏈接建立後,通過輸入流讀取客戶端發送的請求信息。     socket.getInputStream();
    4、通過輸出流向客戶端發送響應信息。   socket.getOutputStream()
    5、關閉相關資源。

public class Server {
    public static void main(String[] args) throws IOException {


        ServerSocket serverSocket = new ServerSocket(8888);

        while (true)
        {
               // 阻塞  直到有socket連接serverSocket
            Socket socket = serverSocket.accept();
            InputStream inputStream = socket.getInputStream();// 得到一個輸入流,接收客戶端傳遞的信息
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);// 提高效率,將自己字節流轉爲字符流
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);// 加入緩衝區
            CharBuffer charBuffer = CharBuffer.allocate(1024);
            while (bufferedReader.read(charBuffer) != -1) {
                charBuffer.flip();
                char[] inc = new char[charBuffer.limit()];
                System.out.println("已接收到客戶端連接");

                charBuffer.get(inc);

                System.out.println(Thread.currentThread().getName() + "服務端接收到客戶端信息:" + new String(inc)
                        + ",當前客戶端ip爲:" + socket.getInetAddress().getHostAddress());
                charBuffer.clear();
            }
        }
    }

}

2 創建客戶端

    1、創建Socket對象,指明需要連接的服務器的地址和端口號。    new Socket(“localhost”,8888)     相當於connect  localhost:8888    但自身的socket對應端口肯定不是8888,由socket.getLocalPort()獲取,隨機產生(如62572)
    2、連接建立後,通過輸出流向服務器端發送請求信息。   socket.getOutputStream()
    3、通過輸入流獲取服務器響應的信息。      socket.getInputStream()
    4、關閉相關資源。

public class Client {
    public static void main(String[] args) {
        // 1、創建客戶端Socket,指定服務器地址和端口
        try {
            Socket socket = new Socket("localhost", 8888);
            // 2、獲取輸出流,向服務器端發送信息
            OutputStream os = socket.getOutputStream();// 獲取字節輸出流
            // 將輸出流包裝爲打印流
            PrintWriter pw = new PrintWriter(os);
            pw.write("用戶名:admin 密碼:123");
            pw.flush();
            while(true){
                InputStream is =  socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                CharBuffer cb = CharBuffer.allocate(1024);

                int rs = br.read(cb);

                if(rs>0){
                    cb.flip();
                    char[] c = new char[cb.limit()];
                    cb.get(c);
                    System.out.println("接收來自服務端的消息:"+new String(c));
                }

            }


           

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

 

 

 

 

 

 

 

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