Java Socket网络编程学习笔记(一)

Java Socket网络编程学习笔记(一)

0.前言

  其实大概半年前就已经看过网络编程Socket的知识了(传统IO),但是因为长时间的不使用导致忘的一干二净,最近正好准备校招,又重新看了网络编程这一章,
  是传统IO(BIO)相关的内容,故在此记录!!记完笔记就去看nio的网络编程啦!!!

1.基础概念

首先看一下socket单词的翻译:
  socket n. 插座;窝,穴;牙槽

  IP: 电脑的身份证
  
  端口号: 识别你电脑上的不同程序

场景: 小宇用电脑QQ发消息问小燕吃饭了没,小燕说吃了哦。
    为啥子小宇发消息,是小燕收到,而不是小红小白收到,
        这个就是IP这位大哥的作用啦,小宇给消息加上了IP,在广阔的网络中,消息小弟根据IP大哥的引路找到了小燕的电脑。

    再问:为啥是小燕的QQ收到了消息,而不是小燕的谷歌浏览器收到消息,这时候端口大哥就可以出场了,
       消息到了小燕电脑,IP大哥就不管事了,由端口号大哥引路找到了QQ这个程序
  

  socket百度是这样定义的

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

    那么简单理解下: 也就是每个程序上都有一个插座,只要我们用一根有双向插头的线(得给这个线加上IP和端口号哦),哐,一连,这两个程序就可以互相交流啦。

    当然连接的时候需要经过三次挥手,释放的时候需要进过四次挥手。 最近在重温计算机网络,这部分以后再加上去哈!

2.简单的示例

Java Socket网络编程学习笔记(一)

   首先服务端需要暴露出一个端口 也可以说监听一个端口,客户端根据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获得请求报文了

  

Java Socket网络编程学习笔记(一)

  

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 
" + "Content-Type:text/html
" + "
";

    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网络编程学习笔记(一)

Java Socket网络编程学习笔记(一)