一站式学习Java网络编程-学习手记

Posted 爱上口袋的天空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一站式学习Java网络编程-学习手记相关的知识,希望对你有一定的参考价值。

1.BIO阻塞模型

简述BIO模型中服务端与客户端的响应过程

  1. 服务器serverSocket先要和端口进行绑定
  2. 绑定完成后,执行accept方法,等待客户端的连接,这个方法是阻塞式调用,也就是说,要一直等待客户端的连接响应,不做其他事情,一直等,(被阻塞的还有InputStream.read()、OutputStream.write(),这两个也会一直等待客户端的响应)
  3. 客户端创建Socket对象,绑定服务器的ip地址与端口号,与服务器进行连接
  4. 服务器接收到客户端的连接请求,accept方法获取到客户端的socket信息,连接成功
  5. 服务器与客户端创建各自的io流,实现全双工通信之后便可以随时结束连接

2.代码解析

 这里的BufferedReader运用了装饰器模式,包裹在另外一个输入数据流之上,

 


3. 简单实战演示

3.1 服务器

 import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static void main(String[] args) {

        final String QUIT="quit";
       //服务器端监听端口8888
        final int DEFAULT_PORT=8888;
        ServerSocket serverSocket=null;

        try {
            //绑定监听端口
            serverSocket =new ServerSocket(DEFAULT_PORT);
            System.out.println("启动服务器,监听默认端口"+DEFAULT_PORT);

            while(true){
                //等待客户端连接
                Socket socket=serverSocket.accept();
                System.out.println("客户端["+socket.getPort()+"]已经连接");
                //BufferedReader创建一个缓冲区,降低直接访问数据源的频率
                BufferedReader reader=new BufferedReader(
                        new InputStreamReader(socket.getInputStream())
                );
                BufferedWriter writer=new BufferedWriter(
                        new OutputStreamWriter(socket.getOutputStream())
                );

                String msg=null;

                while ((msg=reader.readLine())!=null) {
                    //读取客户端发送的消息

                     System.out.println("客户端["+socket.getPort()+"]:"+msg);

                     //回复客户发送的消息
                     writer.write( "服务器:"+msg+"\\n");
                     //flush缓冲区所有数据全部发送出去
                     writer.flush();

                     //查看用户是否退出
                    if(QUIT.equals(msg)){
                        System.out.println("客户端["+socket.getPort()+"]已断开链接");
                        break;
                    }
                }

            }
        }catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(serverSocket != null){
                try {
                    serverSocket.close();
                    System.out.println("服务器端关闭serverSocket");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


3.2 客户端

 import java.io.*;
import java.net.Socket;

public class Client {
    public static void main(String[] args) {

        final String QUIT="quit";
        //服务器端主机地址
             final String DEFAULT_SERVER_HOST="127.0.0.1";
        //端口号
             final int DEFAULT_SERVER_PORT=8888;
             Socket socket=null;
             BufferedWriter writer=null;

        try {
            //创建Socket
            socket=new Socket(DEFAULT_SERVER_HOST,DEFAULT_SERVER_PORT);

            //创建IO流
            BufferedReader reader=new BufferedReader(
             new InputStreamReader(socket.getInputStream())
            );

             writer=new BufferedWriter(
              new OutputStreamWriter(socket.getOutputStream())
            );

            //等待用户输入信息
           BufferedReader consoleReader=
                   new BufferedReader(new InputStreamReader(System.in)
                   );
            while (true) {
                String input=consoleReader.readLine();

                //发行消息给服务器
                writer.write(input+"\\n");
                writer.flush();

                //读取服务器返回的消息
                String msg=reader.readLine();
                System.out.println(msg);

                //查看用户是否退出
                if(QUIT.equals(input)){
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                writer.close();
                System.out.println("关闭客户端socket");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }

}

3.3 响应结果

Server运行结果

Client运行结果

 

 

以上是关于一站式学习Java网络编程-学习手记的主要内容,如果未能解决你的问题,请参考以下文章

一站式学习Java网络编程-学习手记

一站式学习Java网络编程-学习手记

一站式学习Java网络编程-学习手记

一站式学习Java网络编程-学习手记

一站式学习Java网络编程

Python网络爬虫学习手记——爬虫基础