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


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

  • 相关阅读:
    【CF833E】Caramel Clouds
    【LG2183】[国家集训队]礼物
    (ex)Lucas总结
    【CF527C】Glass Carving
    【CF833D】Red-Black Cobweb
    【LG4631】[APIO2018]Circle selection 选圆圈
    volatile梳理
    ThreadLocal梳理
    java线程基础梳理
    TCP/IP
  • 原文地址:https://www.cnblogs.com/dddyyy/p/10583612.html
Copyright © 2020-2023  润新知