2016-1-3
ch17 网络编程
-
网络编程的基础知识
-
-
网络基础知识(拓扑结构,传输介质,通信协议,TCP/IP协议)
-
IP地址和端口号
-
A,B,C,D,E五类IP
-
公认端口(0~1023),注册端口(1024~49151),动态和私有端口(49152~65535)
-
-
Java的基本网络支持
-
使用InetAddress
-
-
获取InetAddress实例
-
getByName(String Host)
-
getByAddress(byte[] addr)
-
-
InetAddresss类提供了一个isReachable()方法用于测试是否可以到达该地址
-
使用URLDecoder和URLEncoder
-
用于完成普通字符串与application/x-www-form-urlencoded MIME字符串之间的转换
-
使用URL和URLConnection
-
资源可以是简单的文件或目录,也可以是对更复杂对象的引用,例如对数据库或搜索引擎的查询
-
URLConnection openConnection():返回一个URLConnection对象,它代表了与URL所引用的远程对象的连接
-
InputStream openStream():打开与此URL的连接,并返回一个用于读取该URL资源的InputStream
-
创建一个URL连接,并发送请求,读取此URL应用的资源需要的步骤:
-
通过调用URL对象的openConnection()方法来创建URLConnection对象
-
设置URLConnection的参数和普通请求属性
-
如果只是发送GET请求,则使用connect()方法建立与远程资源之间的实际连接即可;如果需要发送POST方式的请求,则需要获取URLConnection实例对应的输出流来发送请求参数
-
远程资源变为可用,程序可以访问远程资源的头字段或通过输入流读取远程资源的数据。
-
如果程序要发送POST请求,则需要先设置doIn和doOut两个请求头字段的值,再使用URLConnection对应的输出流来发送请求参数
-
不管是发送GET请求还是发送POST请求,程序获取URLConnection响应的方式完全一样——如果程序可以确定远程响应是字符流,则可以使用字符流来读取;如果程序无法确定远程响应是字符流,则使用字节流读取即可
-
基于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()
-
当调用Socket的shutdownInput()或shutdownOutput()方法关闭输入流或输出流之后,该Socket无法再次打开输出流或输入流
-
-
使用NIO实现非阻塞Socket通信
-
JDK1.4开始,开发高性能的网络服务器
-
使用NIO API可以让服务器端使用一个或有限几个线程来同时处理连接到服务器端的所有客户端
-
Java的NIO为非阻塞式Socket通信提供了如下几个特殊类:
-
Selector:位SelectableChannel对象的多路复用器,所有希望采用非阻塞方式进行通信的Channel都应该注册到Selector对象。
-
-
Selector可以同时监控多个SelectableChannel的IO状况,这是非阻塞IO的核心。一个Selector实例有三个SelectionKey集合:
-
所有的SelectionKey集合:代表了注册在该Selector上的Channel,这个集合可以通过keys()方法返回;
-
被选择的SelectionKey集合:代表了所有可通过select()方法获取的,需要进行IO处理的Channel,这个集合可以通过selectedKeys()返回;
-
被取消的SelectionKey集合:代表了所有被取消注册关系的Channel,在下一次执行select()方法时,这些Channel对应的SelectionKey会被彻底删除,程序通常无须直接访问该集合。
-
-
应用程序可以调用SelectableChannel的register()方法将其注册到指定的Selector上,当该Selector上的某些SelectableChannel上有需要处理的IO操作时,程序可以调用Selector实例的select()方法获取它们的数量,并可以通过selectedKeys()方法返回他们对应的SelectionKey集合——通过集合就可以获取所有需要进行IO处理的SelectableChannel集
-
SelectionChannel对象支持阻塞和非阻塞两种模式(所有的Channel默认都是阻塞模式),必须使用非阻塞模式才能利用非阻塞IO操作
-
服务器端的Selector仅需要监听两种操作:连接和读数据
-
-
使用Java7的AIO实现非阻塞通信
-
Java7的NIO.2提供了异步Channel支持,这种异步Channel可以提供更高效的IO
-
如果按POSIX的标准来划分IO,可以把IO分为两类:同步IO和异步IO
-
AsynchronousServerSocketChannel是一个负责监听的Channel,创建步骤:
-
调用open()静态方法创建一个未监听端口的AysnchronousServerSocketChannel
-
-
调用AsynchronousServerSocketChannel的bind()方法指定该Channel在指定地址,指定端口监听
-
-
如何实现socket版HttpClient:http://wen866595.iteye.com/blog/1168658