网络编程基础

来源:互联网 发布:广联达软件销售电话 编辑:程序博客网 时间:2024/06/05 13:32

网络基础:
 计算机网络协议三个组成部分:
  1、语义部分:用于决定双方对话类型
  2、语法部分:用于决定双方对话格式
  3、变化规则:用于决定通信双方的应对关系
 ISD分层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 
 TCP/IP分层:
 IP(Internet Protocol)协议:互联网协议,支持网间互联的数据报协议,提供网间连接的完善功能,包括IP数据报规定互联网范围内的地址格式。
 TCP(Transmission Contorl Protocol)协议:传输控制协议,规定一种可靠的数据信息传递服务。
 IP地址:用于标识网络中的一个通信实体,基于IP协议网络中传输的数据包,必须使用IP地址进行识别。
 端口号:用于表示数据交给哪个通信程序处理,不能有两个程序使用同一个端口,可以使0~65535.

计算机网络由一组通信信道相互连接的机器组成(主机和路由器):

    主机:运行应用程序的计算机,应用程序包括网络浏览器、即时通信代理或者文件共享程序。

    路由器:将信息从一个信道传递到或转发到另一个信道。

    讯息:程序创建和解释的字节序列,成为分组报文。

    协议:相当于相互信息的程序间达成的一种约定,规定了分组报文的交换方式和包含的数据。


Java的基本网络支持:
    提供了java.net包,包中URL和URLConnection等类提供编程式访问Web,URLDecoder和URLEncoder提供字符串转换方法。
InetAddress类代表地址:
    getByName(String host):根据主机获取对应的InetAddress对象。
    getByAddress(byte[] addr):根据原始IP地址获取对应InetAddress对象。

使用URLDecoder和URLEncoder:
    URLDecorder类静态方法:decode(String s,String enc):将application/x-www-form-urlencoded MIME字符串转换为普通字符串。
    URLEncoder静态方法:encode(String s, String enc):将普通字符串转换为application/x-www-form-urlencoded MIME字符串。
使用URL和URLConnection:
    URL(Uniform Resource Locator)对象代表同意资源定位器,只想互联网“资源”的指针。可以有协议名、主机、端口号和资源组成:
   protocol://host:port/resourceName     例如:http://www.baidu.com
   主要方法:
   URLConnection openConnection():返回URLConnection对象,表示到URL所引用的远程对象的连接;
   InputStream openStream():打开与此URL的连接,返回一个读取URL资源的InputStream。


实现多线程下载步骤:
    1、创建URL对象;
    2、获取指定URL资源大小(getFileLength);
    3、在本地磁盘上创建一个与网络资源相同大小的空文件;
    4、计算每条线程应该下载资源的那个部分;
    5、一次创建、启动多线程下载资源。
URL的openConnection()方法返回URLConnection对象,用于程序和URL之间通信连接,创建连接步骤:
    1、调用URL对象openConnection方法创建URLConnection对象;
    2、设置URLConnection参数和普通请求属性;
    3、如果GET方式请求,使用connet方法建立连接即可;POST方式请求,获取URLConnection实例对应的输入流发送请求参数;
    4、远程资源变为可用,程序可以访问资源头字段或通过输入流获取资源的数据。


基于TCP协议的网络编程:
TCP/IP协议是可靠的网络协议,在通信两端各建立一个Socket,从而在通信两端形成网络虚拟链路。
Java对基于TCP/IP协议网络通信提供良好封装,使用Socket对象代表两端端口,通过Socket产生IO流进行通信。
TCP服务端:
    使用ServerSocket类,创建SercerSocket对象监听客户端的Socket连接,没有连接,则一直等待。
    主要方法:
    Socket accept():如果接收到客户端Socket请求,返回一个和客户端对应的Socket,否则一直等待;
    ServerSocket(int port):用指定端口port创建SeverSocket;
    ServerSocket(int port,int backlog):增加一个用来改变队列长度的backlog;
    ServerSocket(int port,int backlog,InetAddress localAddr):及其存在多个IP情况,允许通过localAddr参数绑定指定IP地址。
Socket类进行通信:
    创建Socket对象,Socket构造器:
    Socket(InetAddress/String remoteAddress,int port):创建连接到指定远程机的Socket,没有本地地址、端口。
    Socket(InetAddress/String remoteAddress,int port,InetAddress localAddr ,int localPort):创建连接Socket,指定本地地址、端口。
    setSoTimeout(int timeout):设置超时时长,在进行读写操作前超出时间,抛出SocketTimeoutException异常。
    获取连接后,无须区分服务器,客户端,通过Socket输入流和输出流进行通信:
    InputStream getInputStream():返回Socket对应输入流,程序通过该输入流读取数据;
    OutputStream getOutputStream():返回Socket对听输出流,程序通过该输出流输出数据。
    Socket提供了两个半关闭方法:
    shutdownInput():关闭Socket输入流,只可以通过输出流输出数据;
    shutdownOutput():关闭Socket输出流,只可以通过输入流读取数据。
    先后调用shutdownInput(),shutdownOutput()方法,该Socket没有被关闭,只是该Socket不能输入输出而已。


NIO实现非阻塞Socket通信:
   前面介绍网络通信程序给予阻塞式API,即当程序执行输入输出操作时会一直阻塞该线程,所以服务器必须为每个客户端提供一条独立线程处理;
   NIO API可以让服务器使用一个或有限个线程同时处理所有的客户端。
   Java的NIO非阻塞式Socket通信提供了几个特殊类:
    Selector:SelectableChannel对象的对路复用器,采用非阻塞方式通信的Channel都应该注册到SelectableChannel对象。
    SelectableChannel:对表非阻塞IO才做的Channel对象,可以将其注册到Selector上,提供一个select()方法监控多个IO Channel。
    SelectionKey:代表SelectableChannel和Selector之间的注册关系。
    ServerSocketChannel:支持非阻塞操作,对java.net.ServerSocket提供TCP协议IO接口,只支持OP_ACCEPT操作。
    SocketChanel:支持非阻塞操作,对java.net.ServerSocket提供TCP协议IO接口,支持OP_CONNECT,OP_READ和OP_WIRTE操作