1. 程式人生 > >Java Socket網絡編程學習筆記(一)

Java Socket網絡編程學習筆記(一)

out 消息 服務端 soc stream ron () tro throws

0.前言

  其實大概半年前就已經看過網絡編程Socket的知識了(傳統IO),但是因為長時間的不使用導致忘的一幹二凈,最近正好準備校招,又重新看了網絡編程這一章,
  是傳統IO(BIO)相關的內容,故在此記錄!!記完筆記就去看nio的網絡編程啦!!!

1.基礎概念

首先看一下socket單詞的翻譯:
  socket n. 插座;窩,穴;牙槽

  IP: 電腦的身份證
  
  端口號: 識別你電腦上的不同程序

場景: 小宇用電腦QQ發消息問小燕吃飯了沒,小燕說吃了哦。
    為啥子小宇發消息,是小燕收到,而不是小紅小白收到,
        這個就是IP這位大哥的作用啦,小宇給消息加上了IP,在廣闊的網絡中,消息小弟根據IP大哥的引路找到了小燕的電腦。

    再問:為啥是小燕的QQ收到了消息,而不是小燕的谷歌瀏覽器收到消息,這時候端口大哥就可以出場了,
       消息到了小燕電腦,IP大哥就不管事了,由端口號大哥引路找到了QQ這個程序
  

  socket百度是這樣定義的

    網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。

    那麽簡單理解下: 也就是每個程序上都有一個插座,只要我們用一根有雙向插頭的線(得給這個線加上IP和端口號哦),哐,一連,這兩個程序就可以互相交流啦。

    當然連接的時候需要經過三次揮手,釋放的時候需要進過四次揮手。 最近在重溫計算機網絡,這部分以後再加上去哈!

2.簡單的示例

技術分享圖片

  首先服務端需要暴露出一個端口 也可以說監聽一個端口,客戶端根據IP和端口進行連接,服務器接收到了這個連接請求,同意,再創建一個Socket和那個客戶端的Socket進行連接。

  

  客戶端:連接得需要ip地址和端口吧,順便發送點什麽。

package com.socket;

import java.io.OutputStream;
import java.net.Socket;

public class TCPClient {
    public static void main(String[] args) throws Exception {
        
//系統隨機選擇一個端口 連接指定的ip地址和端口 Socket socket = new Socket("127.0.0.1", 8888); OutputStream os = socket.getOutputStream(); os.write("吃了嘛".getBytes()); os.close(); socket.close(); } }

  服務器端:服務器首先也得搞個插頭,但是他不是誰想連就可以連,這樣太不合理,別人連了得先得到服務器端得同意

  

package com.socket;

import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
    public static void main(String[] args) throws Exception {
        //Server起一個插座(套接字)監聽一個連接
        ServerSocket serverSocket = new ServerSocket(8888);
        //服務器端總不能停吧,寫一個死循環
        while (true) {
            //serverSocket獲得同意,再建立一個socket
            Socket socket = serverSocket.accept();
            System.out.println("client is connect!!!!!");
        }
    }
}

3.破產版Tomcat

  客戶端:瀏覽器

  服務端:MyTomcat , 因為要在瀏覽器中顯示所以必須要弄成HTTP協議的。所以這裏封裝了兩個類,分別是Request和Reponse。

  因為是破產版的 所以下面這張圖的很多功能都沒實現!!! 而且在NIO的網絡模型中應該不是利用InputStream獲得請求報文了

  

技術分享圖片

  

package com.socket.tomcat;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Request {

    //請求方法
    private String method;

    private String url;

    public Request(InputStream inputStream) throws Exception {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
        String[] input = bufferedReader.readLine().split(" ");
        this.method = input[0];
        url = input[1];
    }

    public String getMethod() {
        return method;
    }

    public void setMethod(String method) {
        this.method = method;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}
package com.socket.tomcat;

import java.io.OutputStream;

public class Reponse {
    private OutputStream outputStream;

    public static String repsonsedHead = "HTTP/1.1 200 \r\n" + "Content-Type:text/html\r\n" + "\r\n";

    public Reponse(OutputStream outputStream) {
        this.outputStream = outputStream;
    }

    public void write(String msg) throws Exception {
        outputStream.write((repsonsedHead + msg).getBytes());
    }
}
package com.socket.tomcat;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MyTomcat {

    public static void main(String[] args) throws Exception {

        ServerSocket serverSocket = new ServerSocket(8080);

        while (true) {
            Socket socket = serverSocket.accept();

            InputStream is = socket.getInputStream();
            //獲得請求
            Request request = new Request(is);

            System.out.println("請求方法:" + request.getMethod());
            System.out.println("請求路徑:" + request.getUrl());

            OutputStream os = socket.getOutputStream();
            Reponse reponse = new Reponse(os);
            reponse.write("Java!");

            is.close();
            os.flush();
            os.close();
            socket.close();

        }

    }
}

技術分享圖片

技術分享圖片

Java Socket網絡編程學習筆記(一)