zoukankan      html  css  js  c++  java
  • JavaNIO阻塞IO添加服务器反馈

    package com.java.NIO;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    import java.nio.channels.ServerSocketChannel;
    import java.nio.channels.SocketChannel;
    import java.nio.file.Paths;
    import java.nio.file.StandardOpenOption;
    
    import org.junit.Test;
    
    public class TestBlockingNIO {
    
    	@Test//客户端
    	public void client() throws IOException{
    		//1.获取通道
    		SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 1008));
    		
    		FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);
    		
    		//2.分配指定大小的缓冲区
    		ByteBuffer buf = ByteBuffer.allocate(1024);
    		
    		//3.读取本地文件,并且发送到服务器
    		while(inChannel.read(buf)!=-1){
    			buf.flip();
    			sChannel.write(buf);
    			buf.clear();
    		}
    		
    		//开启非阻塞模式
    		sChannel.shutdownOutput();
    		
    		//接收服务器反馈
    		int len = 0 ;
    		while ((len = sChannel.read(buf))!=-1){
    			buf.flip();
    			System.out.println(new String(buf.array(),0,len));
    			buf.clear();
    		}
    		
    		
    		
    		
    		//4.关闭通道
    		inChannel.close();
    		sChannel.close();
    	}
    	
    	
    	@Test//服务器
    	public void server() throws IOException{
    		//1.获取通道
    		ServerSocketChannel ssChannel = ServerSocketChannel.open();
    		
    		FileChannel  outChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.WRITE,StandardOpenOption.CREATE);
    
    		//2.绑定链接
    		ssChannel.bind(new InetSocketAddress(1008));
    		
    		//3.获取客户端连接通道
    		SocketChannel sChannel = ssChannel.accept();
    		
    		//4.分配指定大小的缓冲区
    		ByteBuffer buf =ByteBuffer.allocate(1024);
    		
    		//5.接收客户数据并且保存到本地
    		while(sChannel.read(buf)!=-1){
    			buf.flip();
    			outChannel.write(buf);
    			buf.clear();
    		}
    		//发送反馈给客户端
    		buf.put("服务器接收数据成功".getBytes());
    		buf.flip();
    		sChannel.write(buf);
    		
    		//6.关闭通道
    		sChannel.close();
    		outChannel.close();
    		ssChannel.close();
    	
    	}
    }
    

      

  • 相关阅读:
    [luogu p2482] [SDOI2010]猪国杀
    [luogu p2296] 寻找道路
    左右布局(备用复制)
    导出Excel
    流式布局 及 媒体查询
    echarts设置(持续更新)
    解决Vue中watch首次进入路由不触发的问题
    Math.random
    Vue的拖拽
    使的dialog上下左右居中(弹框居中)
  • 原文地址:https://www.cnblogs.com/fliay/p/7611778.html
Copyright © 2011-2022 走看看