网络编程(网络通信)

  • 服务器:是一台电脑
  • 客户端:是一台电脑,是手机,是平板,是网页

我们即将要在我们自己的电脑上搭建服务器环境
我们自己的电脑还得是客户端

我们的电脑即是服务器,又是客户端

Socket编程

Socket通信的服务端也是一个对象:ServerSocket类
Socket编程是建立在TCP/IP协议

  • 如何在网络环境下访问其他的主机
    • 通过IP地址 + 端口号形式可以访问其他的主机
  • 查看自己的电脑在当前网络环境下的IP地址:
    • 通过指令控制台CMD,ipconfig查看ipv4地址,是当前局域网下的ip地址
  • 一台电脑可以有很多个端口号,每个端口号对应的程序也可以不同

示例:在电脑上开辟一个端口号,这个端口号就是服务器的端口号,然后构建一个客户端,通过ip地址+端口号来访问到服务器

@Test
    public void server() throws IOException {
        // 创建了一个服务器对象,绑定在8888端口
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务器已启动...");
        // 服务器在等待客户端连接
        Socket socket = serverSocket.accept();
        // 读取客户端发送过来的信息
        InputStream inputStream = socket.getInputStream();
        byte [] buffer = new byte[1024 * 1024];
        int len;
        while((len = inputStream.read(buffer)) != -1){
            System.out.println("服务器已接收客户端的数据:" + new String(buffer,0,len));
        }
        // 释放资源
        inputStream.close();
        socket.close();
    }

    @Test
    public void client() throws IOException {
        // 创建了一个Socket通信的客户端
        Socket socket = new Socket();
        // 第一个参数就是获取当前电脑的IP地址
        // 第二个参数就是服务器的端口号
        socket.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(),8888));
        // 客户端发送数据给服务器
        OutputStream outputStream = socket.getOutputStream();
        String data = "hello server!";
        outputStream.write(data.getBytes());
        System.out.println("客户端已发送数据:" + data);
        outputStream.close();
        socket.close();
    }

UDP

不可靠的传输协议

    @Test
    public void client() throws IOException {
        DatagramSocket socket = new DatagramSocket();
        String str = "我通过UDP协议发送的消息";
        byte[] data = str.getBytes();
        //构建成了一个数据报文
        //第一个参数就是要发送的数据
        //第二个参数从哪开始发
        //第三个参数发多长
        //第四个参数指定服务器的IP地址
        //第五个参数就是服务器的端口号//
        DatagramPacket packet = new DatagramPacket(data,
                0,data.length,
                InetAddress.getLocalHost(),9999);
        socket.send(packet);
        socket.close();
    }

    @Test
    public void server() throws IOException {
        //服务器指定端口号
        DatagramSocket socket = new DatagramSocket();
        byte[] buf = new byte[1024*1024];
        DatagramPacket packet = new DatagramPacket(buf,0,buf.length);
        //接受客户端发过来的数据
        socket.receive(packet);
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        socket.close();
    }

URL

        URL url=new URL("https://192.168.1.1:8888");
        // 获取协议
        System.out.println(url.getProtocol());
        // 获取地址
        System.out.println(url.getHost());
        // 获取端口号
        System.out.println(url.getPort());

其它

            InetAddress inet1 = InetAddress.getByName("192.168.1.1");
            InetAddress inet2 = InetAddress.getByName("www.baidu.com");
            
            // 获取本地ip
            InetAddress localHost = InetAddress.getLocalHost();
            
            // 获取本机的主机名
            System.out.println(localHost.getHostName());
            //获取本机ip
            System.out.println(localHost.getHostAddress());

Web

  • 软件架构
    • C/S架构:Client/Server客户端/服务器----------腾讯会议、游戏
    • B/S架构:Browser/Server浏览器/服务器
  • 移动互联的时候--手机端为主,C/S架构
  • Java主要做的就是架构中的Server端
    • 静态资源:所有用户访问后,得到的结果都一样的--------html
    • 动态资源:每个用户访问后,得到的结果都不一样--------爱奇艺
  • web服务器
    • 接收用户的请求,处理请求,给出响应
  • 本机的IP地址
    • cmd----ipconfig
    • 127.0.0.1---本机(建议)
    • localhost---本机(前提条件:电脑要联网,激活一下网卡)
  • 请求:客户端--->服务器
  • 响应:服务器--->客户端
  • 我们一般情况下,给浏览器做出响应,需要遵循浏览器的格式要求:
-------------响应的基本格式----------------
  HTTP/1.1 200 OK
  Content-Length: 39
  Content-Type: text/html;charset=UTF-8

  <h1>hello server</h1>

响应示例如下:

        public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);
        System.out.println("服务器启动成功...");
        Socket accept = serverSocket.accept();
        OutputStream outputStream = accept.getOutputStream();
        // 按照http协议的格式封装一个报文数据
        String response = "HTTP/1.1 200 ok\r\n" + "Content-Length: 39\r\n" + "Content-Type: text/html;charset=UTF-8\r\n\r\n"
                + "<h1>hello server</h1>";
        outputStream.write(response.getBytes());
        //强行数据输出
        outputStream.flush();
        // 这个流不要着急关,因为突然的关闭会导致浏览器和服务器断开连接
    }

重定向

重定向会重新定位到新的页面,而且地址栏的地址也会随之变化。
示例如下:

        public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务器启动成功...");
        Socket server = serverSocket.accept();
        OutputStream outputStream = server.getOutputStream();
        // 按照http协议的格式封装一个报文数据
        String response = "HTTP/1.1 302 Moved Temporarily\r\n"+
                "Location: https://www.baidu.com\r\n\r\n";
        outputStream.write(response.getBytes());
        outputStream.flush();
        // 这个流不要着急关,因为突然的关闭会导致浏览器和服务器断开连接
    }