java网络编译:

  • 基础知识:
    ①、ip地址和端口号:
    ip地址是用来识别网络中的一个实体,而这个实体可以理解为一个主机,而端口号则是用来区分具体的通讯程序的。
    ②、tcp / udp协议:
    tcp是一个可靠数据传输:http和ftp都是采用的它;而udp是一个无连接的协议。如qq聊天。
    ③、URL:统一资源定位器,指向了互联网的一个资源,下面看一下通过URL来获取数据示例:

    ④、InetAddress:这个是java中代表IP地址的类。

  • socket:
    ①、创建socket实例:

    ②、客户端连接:
            1、创建Socket对象:
            2、连接建立后,通过输出流向服务器端发送请求信息。
            3、通过输入流获取服务器响应的信息。
            4、关闭响应资源。
    其示例代码如下:

    ③、服务端连接:
           1、创建ServerSocket对象,绑定监听接口。
           2、通过accept()方法监听客户端请求。
           3、连接建立后,通过输入流读取客户端发送的请求信息。
           4、通过输出流向客户端发送信息。
           5、关闭相关资源。
    其示例代码如下:

    ④、总结:
           1、创建ServerSocket和Socket。
           2、打开连接到Socket的输入/输出流。
           3、按照协议对Socket进行读/写操作。
           4、关闭输入输出流、关闭Socket。

阻塞IO:

  • java的I/O接口:
    ①、基于字节操作的I/O接口:
    ②、基于字符操作的I/O接口:
    ③、基于磁盘操作的I/O接口:
    ④、基于网络操作的I/O接口:
  • 阻塞IO的通信模型:

    也就是在调用read()是阻塞的,会一直等待有数据时才会返回,socket.accept()就是阻塞的,当接收到客服端的请求之后就会开启一个线程去处理客户端的请求,但是这个模型存在一些缺点:1是客服端很多的时候,会创建大量的处理线程,而且每个线程都会占用栈空间和CPU的时间,2是阻塞可能带来频繁的上下文切换,而大部份上下文切换可能是无意义的,也加得了CPU的负担。

  • 总结: 
    1、BIO数据在写入OutputStream或者从InputStream读取时都有可能会阻塞。
    2、当前一些需要大量HTTP长连接的情况。
    3、需要另一种新的I/O操作方式,也就是NIO。

NIO:

  • 工作原理:

    其实它的工作原理很简单:有一个专门的线程来处理所有的IO事件,同时它又是事件驱动机制的,当事件到来的时候会触发,而不是同步的去监视事件,另外它有线程之间的通讯方式,线程之间是通过wait和notify进行通讯的,而且每一次上下文切换都是有意义的,这样就减少了无意义的切换,提高了CPU的使用率,那这种机制到底是怎么来实现的呢?

  • 通信模型:

    其实就是客服端与服务器端各自维护一个管理通道对象,也就是图中的Selector,它可以监测一个或多个Channel上的事件,如果服务端注册一个读事件,这个时候客服端给服务端发送了一些数据,NIO的服务端就会在Selector添加一个读事件,服务端的处理线程就会轮循的访问Selector,如果访问Selector有感兴趣的事件到达,那么就处理这个事件,如果没有感兴趣的事件到达,则一直会阻塞直到感兴趣的事件到达。

  • 实例:
    客户端:

    服务器端:

最新文章

  1. 13.JAVA之GUI编程将程序打包jar
  2. [LeetCode] Paint Fence 粉刷篱笆
  3. 如何搭建Percona XtraDB Cluster集群
  4. python读取excel数据,并可视化展现
  5. Hibernate 查询MatchMode的四种模式
  6. tomcat服务器上webapps里的文件名和项目名称不一样,修改方法
  7. C# 线程(一)
  8. Log Explorer使用说明
  9. Windows 服务 创建 和 安装 -摘自网络
  10. 如何在windows系统自带命令查看硬件信息?
  11. pac 文件使用到的javascript函数
  12. RMAN-06496: must use the TO clause when the database is mounted or open
  13. Wix打包系列(五) 部署数据库
  14. 自制刻度尺-前端简易实现"腾讯信用"界面
  15. 学号:201521123116 《java程序设计》第八周学习总结
  16. form表单数据封装成json格式并提交给服务器
  17. Docker笔记——Docker安装及制作镜像
  18. Python面试题练习
  19. winfrom 关闭别的应用程序的窗体或者弹出框(winform 关闭句柄)
  20. springboot之定时任务

热门文章

  1. 软件测试第2周个人作业:WordCount编码测试
  2. RestTemplate连接池(转载)
  3. 如何在picture上显示透明Label
  4. kubernetes的namespaces总是Terminating
  5. 基于freescale i.Mx6(ARM)的阿里云oss调试记录
  6. springboot自动配置国际化失效分析
  7. java——HashSet中add()方法不能加重复值得原因理解(我们一起来看底层代码吧)
  8. JS基础_自增自减练习
  9. C++内存分配和分区
  10. Eclipse 快捷键、文档注释、多行注释的快捷键