Java Socket網絡編程學習筆記(一)
阿新 • • 發佈:2019-03-23
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網絡編程學習筆記(一)