java网络编程

来源:互联网 发布:360压缩 mac 编辑:程序博客网 时间:2024/06/04 18:58
一、什么是TCP/IP?什么是IP?
1.TCP/IP即传输控制协议/网际互联协议。该组协议主要包括:
  TCP:传输控制协议。
  IP:网际互联协议。
  UDP:用户数据报协议。
  ICMP:互联网控制信息协议。
  SMTP:简单邮件传输协议。
  SNMP:简单网络管理协议。
  FTP:文件传输协议。
  ARP:地址解析协议。

 TCP/IP通常被看成一个4层模型,分为应用层、传输层、网络层、网络接口层。
  应用层:向用户提供一组应用程序,这一层用到了很多协议,例如万维网HTTP协议、邮件传输SMTP协议、文件传输FTP协议等。
  传输层:提供应用程序间的通信,这一层的协议有TCP、UDP。
  网络层:负责相邻计算机之间的通信,主要定义了IP地址的格式,这一层的协议有IP。
  网络接口层:负责接收IP数据包并通过网络进行发送,或者从网络上接收物理帧,抽出IP数据报,交给网络层。


2.什么是IP?

IP协议又称互联网协议,是支持网间互联的数据报协议,它与TCP协议一起构成了TCP/IP协议族的核心。

整个IP地址空间有4组8位二进制数,IP地址被分为A、B、C、D、E五类:
  1·A类地址
     网络标识由第一组8位二进制数表示,特点是网络标识的第一位二进制数取值为“0”。A类地址有126个网段(排除全0),每个网络大约有1670万台主机。
  2·B类地址
     网络标识由前两组8位二进制数表示,特点是网络标识的前两位二进制数取值为“10”。B类地址有16384个网段,每个网络允许有65533台主机。
  3·C类地址
     网络标识由前三组8位二进制数表示,特点是网络标识的前三位二进制数取值为“110”。C类地址有254台主机。

采用点分十进制表示法,A类地址范围为1.0.0.1-127.255.255.254,B类地址范围为128.1.0.1-191.255.255.254,C类地址范围为192.0.1.1-223.255.255.254。
注意:由于网络地址紧张,主机地址相对过剩,通常采取子网掩码的方式来指定网段号。


二、TCP和UDP有什么区别?
  1.TCP提供可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用,可用于实现面向连接、端到端和可靠的数据包发送。
    UDP则不提供可靠性、流控或差错恢复功能。
  2.TCP支持的应用协议主要有Telnet、FTP、SMTP等,UDP支持的协议主要有NFS(网络文件系统)、SNMP、DNS、TFTP等。
  3.TCP建立连接需要三次握手(理解三次握手的过程),释放连接需要四次握手(理解四次握手的过程)。


三、什么是HTTP?工作原理如何?
  1.概念
    超文本传输协议。
  2.工作原理
    从用户输入URL到网页显示,经历几个过程:客户端发送请求,服务器响应请求,客户端处理响应。
  3.HTTP请求和响应格式
    请求数据包:
       1·请求行,其中包括请求类型、资源路径url、协议,例如get regist.do?name=zs  HTTP/1.1
       2·消息头(键值对),例如content-type=text/html
       3·实体类容:如果请求方式是post方式,请求参数及值会放在这儿。 
                   如果请求方式是get方式,请求参数与值是包含在请求资源路径里。

    响应数据包:
       1·状态行,其中包括协议、状态码、状态描述,例如 HTTP/1.1  200  OK。
       2·消息头
       3·实体内容:服务器返回给客户端的处理结果。
   4.get、post的区别
   5.HTTP状态管理:Cookie,Session


四、Socket通信时如何获取主机和客户机的IP地址?
   java.net.InetAddress类可以实现通过主机地址获取ip地址,通过ip地址获取主机地址。
   1.String getHostAddress():通过InetAddress对象获取ip地址字符串。
   2.String getHostName():通过InetAddress对象获取此ip地址的主机名。
   3.InetAddress getLocalHost():获取本地主机的InetAddress对象。
   4.InetAddress[] getAllByName(String host):获取给定主机名对应的所有ip地址。
   5.InetAddress getByName(String host):获取给定主机名对应的ip地址。
   6.InetAddress getByAddress(byte[] address):给定原始ip,获取InetAddress对象。IPv4是4个字节,IPv6是16个字节。
  
   在Socket编程时,通过Socket类的getInetAddress()方法可以获取此套接字连接到的远程IP地址。


五、如何利用Socket实现基于TCP的通信?
主要使用Socket类和ServerSocket类。

   第一种情况:客户端写服务端读
   1.服务端示例代码
   public class Server 
   {
      public static void main(String args[]) throws IOException {
      //为了简单起见,所有的异常信息都往外抛
      int port = 8899;
      //定义一个ServerSocket监听在端口8899上
      ServerSocket server = new ServerSocket(port);
      //server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
      Socket socket = server.accept();
      //跟客户端建立好连接之后,我们就可以获取socket的InputStream,并从中读取客户端发过来的信息了。
      Reader reader = new InputStreamReader(socket.getInputStream());
      char chars[] = new char[64];
      int len;
      StringBuilder sb = new StringBuilder();
      while ((len=reader.read(chars)) != -1) {
         sb.append(new String(chars, 0, len));
      }
      System.out.println("from client: " + sb);
      reader.close();
      socket.close();
      server.close();
   }  
}

   2.客户端示例代码
   public class Client {
   public static void main(String args[]) throws Exception {
      //为了简单起见,所有的异常都直接往外抛
      String host = "127.0.0.1";  //要连接的服务端IP地址
      int port = 8899;   //要连接的服务端对应的监听端口
      //与服务端建立连接
      Socket client = new Socket(host, port);
      //建立连接后就可以往服务端写数据了
      Writer writer = new OutputStreamWriter(client.getOutputStream());
      writer.write("Hello Server.");
      writer.flush();//写完后要记得flush
      writer.close();
      client.close();
   }
}

   第二种情况:客户端和服务端同时读和写

   第三种情况:多个客户端连接同一个服务端


六、如何利用Socket传输中文字符?
对于这种服务端或客户端接收中文乱码的情况通常是因为数据发送时使用的编码跟接收时候使用的编码不一致。
   1.使用DataOutputStream的writeUTF()方法发送信息,使用DataInputStream的readUTF()方法接收信息。
   2.使用Writer字符流发送信息,使用Reader字符流接收信息。而且必须使用统一的编码。


七、如何在Socket读取数据时设置超时?
   Socket为我们提供了一个setSoTimeout()方法来设置接收数据的超时时间,单位是毫秒。当设置的超时时间大于0,并且超过了这一时间Socket还没有接收到返回的数据的话,Socket就会抛出一个SocketTimeoutException。


八、如何利用Socket传递对象信息?
    在Socket通信时,可以用对象将传输的信息封装,然后以对象为单位在网络中进行传输,当然对象必须实现序列化。


九、如何利用Socket传输文件?
    利用Socket传输文件和传输字符的过程相似,只是在传输过程中多了读写文件的操作。


十、如何利用Socket实现基于UDP的通信?
    基于UDP协议实现两台计算机之间的通信,主要使用DatagramSocket和DatagramPacket类。
    DatagramSocket类表示用来发送和接收数据报的套接字。数据报套接字是包投递服务的发送或接收。每个数据报套接字上发送或接收的包都是单独编址和路由的。从一台计算机发送到另一台计算机上的多个包可能选择不同的路由,也可能按照不同的顺序到达。
    DatagramSocket总是启用UDP广播发送。为了接收广播包,应该讲DatagramSocket绑定到通配符地址。在某些实现中,将DatagramSocket绑定到一个具体的地址时广播包也可以被接收。
    DatagramPacket类表示数据报包。数据报包用来实现无连接包投递服务,每条报文仅根据该包中包含的信息从一台计算机路由到另一台计算机。从一台计算机发送到另一台计算机的多个包可能选择不同的路由,也可能按不同的顺序到达。


十一、如何利用UDP  Socket技术实现IP多点传送?
   IP多点传送(multicast delivery)是针对点到点的传送和广播传送两种方法而言的,它是指在一定的组内对其成员举行的广播,是一种有限的广播.组中的某个成员发出的信息,组中的别的全部成员都能收到.它是UDP Sockets的一个分支.
   UDP基础
   利用用户数据报协议(User Datagram Protocol,简称UDP)举行会话必须将信息装配成一定尺寸的小报文,当发送一条信息,接纳方可否收到并返复书息永久是不肯定的,假如无法收到返复书息,我们就无法肯定我们发送的信息能否被接纳——它大概在途中丧失,接纳者返回的呼应信息也大概丧失,别的,接纳者也大概忽视我们的信息,因此,UDP被描写为不坚固的、无衔接的和面向消息的.
   IP多点传送原理
   为了支持IP多点传送,某些范围的IP地址被单独留出专门用于这个目的,这些IP地址是D类地址,其地址的最高四比特的位情势为“1110”,即IP地址的范围在224.0.0.0和239.255.255.255之间.它们中的每一个IP地址都可以被引用作为一个多点传送组,任何故该IP地址编址的IP报文将被该组中的别的全部机械接纳,也就是说,一个IP地址就相当于一个邮箱.别的,组中的成员是动态的并随时间而改变.
   关于IP多点传送,网间网组管理协议(Internet Group Management Protocol,简称IGMP),用于管理多点传送组中的成员.支持多点传送的路由可以利用IGMP决意本地的机械能否赞成加入某个组,一个多点传送路由可以决意能否转发一个多点传送报文.
   影响多点传送报文的一个重要参数是time-to-live(TTL).TTL用于描写发送者但愿传送的信息能通过量少差别的网络.当报文被路由器转发,报文中的TTL将减一,当TTL为零时,报文将不再向前发送.
   在实际利用中,我们必须注意下面几点:
   1.这些IP地址只能作为信宿地址利用,绝对不能呈目前任何信源地址域中,也不能呈目前源途径或记录途径选项中:

   2.由于IP多点传送是一对多的传送,因此,不能操纵不对与掌握报文协议(Internet Control Message Protocol,简称ICMP)产生出错报文.

   3.发送一个信息到一个组,发送主机可以不是组中的成员;

   4.一些组被Internet Assigned Numbers Authority(IANA)分配,保存用于特别的目的,详情拜见:ftp://ftp.internic.net/rfc/rfc1700.txt.别的,避免利用一些保存组,从224.0.0.0到224.0.0.225仅限于本地子网利用.倡议在224.0.1.27和224.0.1.225之间肆意选取一个IP地址.

   5.假如我们选取的组已经被利用,与其他机械的通讯将会混乱,一旦发生,可以退出利用,试试其他的地址.

   6.当一个机械加入一个多点传送组,它将开始接纳该IP多点传送地址的信息.假如多点传送报文分发到网络上,任何监听该信息的机械城市有机会接纳它.关于IP多点传送,没有一个机制对相同网络上的机械可否加入该多点传送组加以限制.因此,安全性是我们必须考虑的问题之一.

   7.挑选的TTL参数应尽大概小.一个大的TTL值会不必要地占用Internet带宽.此外,还大概破坏差别区域利用相同组的别的的多点传送通讯.


十二、如何获取Internet资源的大小?
    URL类和URLConnection类。


十三、如何实现Internet资源的单线程下载?
    URLConnection类。


十四、URL如何通过proxy代理访问Internet资源?


十五、如何实现Internet资源下载的断点续传?


十六、如何实现Internet资源的多线程下载?
   

十七、如何解析Internet网页的内容?
    首先使用URL类和URLConnection类获取指定网页的流信息,然后使用字符串切割或正则表达式获取需要的信息。


参考资料:http://haohaoxuexi.iteye.com/blog/1979837

         http://blog.sina.com.cn/s/blog_e3b907d70101g4ne.html




0 0