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(); } }
}