BIO网络编程

服务端

ServerSocket serverSocket = new ServerSocket(8080);//只是监听8080端口
System.out.println("服务器启动成功");
while (!serverSocket.isClosed()) {
	Socket request = serverSocket.accept(); //获取socket对象,是阻塞方法(如果没有新的连接过来,会一直等待,直到有一个连接被创建)
	//socket对象,可以获取客户端请求,以及给客户端发送响应数据
	System.out.println("收到新连接 : " + request.toString());
	try{
		//需要I/O操作
		InputStream inputStream = request.getInputStream();//获取到socket的InputStream对象
		BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
		String msg;
		while((msg = reader.readLine() )!= null){//没有数据,阻塞
			if(msg.lengtg() == 0){
				break;
			}
			System.out.println(msg);
		}
		System.out.println("收到数据,来自:"+ request.toString());
	}catch(Exception e){
		e.printStackTrace();
	}finally {
       try {
            request.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

	
}

serverSocket.close();

客户端

Socket client = new Socket("localhost", 8080);//两个参数,host和端口
OutputStream out = client.getOutputStream;
String msg = "hello world";
out.write(msg.getBytes(“UTF-8));//是阻塞方法,只有写完,才会返回
clinet.close();

处理多连接

使用线程池,多线程技术

ServerSocket serverSocket = new ServerSocket(8080);
        System.out.println("tomcat 服务器启动成功");
        while (!serverSocket.isClosed()) {
            Socket request = serverSocket.accept();
            System.out.println("收到新连接 : " + request.toString());
            threadPool.execute(() -> {//启动线程池,防止由于下面的while阻塞语句,导致程序不能继续执行
                try {
                    // 接收数据、打印
                    InputStream inputStream = request.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
                    String msg;
                    while ((msg = reader.readLine()) != null) { // 阻塞
                        if (msg.length() == 0) {
                            break;
                        }
                        System.out.println(msg);
                    }
                    System.out.println("收到数据,来自:"+ request.toString());
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        request.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        serverSocket.close();

HTTP协议

浏览器和服务端交互的时候,使用的http协议。

请求数据包解析

在这里插入图片描述

响应数据包解析

在这里插入图片描述

响应状态码

在这里插入图片描述

协议开发—http协议

添加以下代码,可以与浏览器进行交互。

OutputStream outputStream = request.getOutputStream();
outputStream.write("HTTP/1.1 200 OK\r\n".getBytes());
outputStream.write("Content-Length: 11\r\n\r\n".getBytes());
outputStream.write("Hello World".getBytes());
outputStream.flush();

想在Socket之上,支撑更多的功能,而不是简单的数据收发,需要在TCP之上,开发更多协议,例如:http协议

协议:客户端、服务端之间交互的特定规范。请求数据和响应数据,都需要遵循这个协议进行开发

Socket是不支持高级功能的,需要高级的协议,即应用层协议。

阻塞IO的含义

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值