Java读书笔记(5)-网络编程

2016-1-3数据库

ch17 网络编程编程

  1. 网络编程的基础知识服务器

    • 网络基础知识(拓扑结构,传输介质,通讯协议,TCP/IP协议)网络

    • IP地址和端口号多线程

    • A,B,C,D,E五类IP并发

    • 公认端口(0~1023),注册端口(1024~49151),动态和私有端口(49152~65535)app

  1. Java的基本网络支持异步

    • 使用InetAddresssocket

  • 获取InetAddress实例性能

    • getByName(String Host)

    • getByAddress(byte[] addr)

  • InetAddresss类提供了一个isReachable()方法用于测试是否能够到达该地址

    • 使用URLDecoderURLEncoder

  • 用于完成普通字符串application/x-www-form-urlencoded MIME字符串之间的转换

    • 使用URLURLConnection

  • 资源能够是简单的文件或目录,也能够是对更复杂对象的引用,例如对数据库或搜索引擎的查询

  • URLConnection openConnection():返回一个URLConnection对象,它表明了与URL所引用的远程对象的链接

  • InputStream openStream():打开与此URL的链接,并返回一个用于读取URL资源的InputStream

  • 建立一个URL链接,并发送请求,读取此URL应用的资源须要的步骤:

  1. 经过调用URL对象的openConnection()方法来建立URLConnection对象

  2. 设置URLConnection的参数和普通请求属性

  3. 若是只是发送GET请求,则使用connect()方法创建与远程资源之间的实际链接便可;若是须要发送POST方式的请求,则须要获取URLConnection实例对应的输出流来发送请求参数

  4. 远程资源变为可用,程序能够访问远程资源的头字段或经过输入流读取远程资源的数据。

  • 若是程序要发送POST请求,则须要先设置doIndoOut两个请求头字段的值,再使用URLConnection对应的输出流来发送请求参数

  • 无论是发送GET请求仍是发送POST请求,程序获取URLConnection响应的方式彻底同样——若是程序能够肯定远程响应是字符流,则能够使用字符流来读取;若是程序没法肯定远程响应是字符流,则使用字节流读取便可

  1. 基于TCP协议的网络编程

    • TCP协议基础

    • 使用ServerSocket建立TCP服务器端

      • ServerSocket ss=new ServerSocket(30000);

        while(true)

        {

        Socket s=ss.accept();

        ...

        }

      • 使用Socket进行通讯

        Socket s=new Socket(“127.0.0.1”,30000);//客户端链接服务器端

      • Socket创建以后无须再区分服务器端,客户端,经过各自的Socket进行通讯便可

      • InputStream getInputStream():返回该Socket对象对应的输入流,让程序经过该输入流从Socket中取出数据

      • OutputStream getOutputStream():返回该Socket对象对应的输出流,让程序经过输出流向Socket中输出数据

      • 读写超时和链接超时的设置

    • 加入多线程

      • 服务器为每一个Socket单独启动一个线程,每一个线程负责与一个客户端通讯

      • 客户端读取服务器端数据的线程一样会被阻塞,因此系统应该单独启动一个线程,该线程专门负责读取服务器端数据

    • 记录用户信息

      • 实现自定义登陆协议,群聊,私聊

    • 半关闭的Socket

      • shutdownInput():关闭Socket的输入流,isInputShutdown()

      • shutdownOutput():关闭Socket的输出流,isOutputShutdown()

      • 当调用SocketshutdownInput()shutdownOutput()方法关闭输入流或输出流以后,该Socket没法再次打开输出流或输入流

    • 使用NIO实现非阻塞Socket通讯

      • JDK1.4开始,开发高性能的网络服务器

      • 使用NIO API可让服务器端使用一个或有限几个线程来同时处理链接到服务器端的全部客户端

      • JavaNIO为非阻塞式Socket通讯提供了以下几个特殊类:

        1. Selector:位SelectableChannel对象的多路复用器,全部但愿采用非阻塞方式进行通讯的Channel都应该注册到Selector对象。

      • Selector能够同时监控多个SelectableChannelIO情况,这是非阻塞IO的核心。一个Selector实例有三个SelectionKey集合:

        1. 全部的SelectionKey集合:表明了注册在该Selector上的Channel,这个集合能够经过keys()方法返回;

        2. 被选择的SelectionKey集合:表明了全部可经过select()方法获取的,须要进行IO处理的Channel,这个集合能够经过selectedKeys()返回;

        3. 被取消的SelectionKey集合:表明了全部被取消注册关系的Channel,在下一次执行select()方法时,这些Channel对应的SelectionKey会被完全删除,程序一般无须直接访问该集合。

      • 应用程序能够调用SelectableChannelregister()方法将其注册到指定的Selector上,当该Selector上的某些SelectableChannel上有须要处理的IO操做时,程序能够调用Selector实例的select()方法获取它们的数量,并能够经过selectedKeys()方法返回他们对应的SelectionKey集合——经过集合就能够获取全部须要进行IO处理的SelectableChannel

      • SelectionChannel对象支持阻塞和非阻塞两种模式(全部的Channel默认都是阻塞模式),必须使用非阻塞模式才能利用非阻塞IO操做

      • 服务器端的Selector仅须要监听两种操做:链接和读数据

    • 使用Java7AIO实现非阻塞通讯

      • Java7NIO.2提供了异步Channel支持,这种异步Channel能够提供更高效的IO

      • 若是按POSIX的标准来划分IO,能够把IO分为两类:同步IO和异步IO

      • AsynchronousServerSocketChannel是一个负责监听的Channel,建立步骤:

        1. 调用open()静态方法建立一个未监听端口的AysnchronousServerSocketChannel

      • 调用AsynchronousServerSocketChannelbind()方法指定该Channel在指定地址,指定端口监听 

    如何实现socket版HttpClient:http://wen866595.iteye.com/blog/1168658

相关文章
相关标签/搜索