浅谈Java基于Socket和基于数据报的网络编程(一)

1.网络编程

     在讲网络编程之前先来了解一下网络编程用到一些术语

1.1客户机和服务器

   客户机和服务器都是网络上运行的计算机,二者的区别在于上面运行的程序不同。有些程序可以提供服务,计算机运行了这些程序便成为服务器;有些程序可以使用服务,计算机运行了这些程序编程成为客户机。服务器等待客户机提出请求并予以相应,服务器一般始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来相应客户,同时继续监听服务端口,后来的客户也能得到服务。

1.2 IP地址和端口号

   网络上的机器要进行通信,必须先准确的定位。在TCP/IP协议中,IP层主要负责网络中主机的定位,由IP地址可以唯一的确定Internet上的一台主机。所谓IP地址就是给每个连接在Internet上的主机分配的一个32位地址。根据TCP/IP协议规定,IP地址用二级制来表示,每个IP地址长32位,换算成字节,就是4个字节。由于采用二进制形式的IP地址太长,不方便使用。为了方便,IP地址经常被写成十进制的形式,每个字节对应一个不超过255的十进制数,使用符号"."分开不同的字节。例如,211.64.120.1,IP地址的这种表示法叫做“点分十进制表示法”,这显然比1和0构成的32位序列容易记忆得多。为了更好的记住和描述网络上的一台主机,采用给IP地址起别名的方法,这个别名就是域名。如IP地址211.64.120.1对应的别名就是 www.sdjtu.edyu.cn。在网络是哪个访问一台主机的方式通常为,输入域名,域名解析服务器(DNS)解析域名成IP地址,访问IP地址对应的主机。在浏览器的地址栏中输入211.61.120.1或者www.sdjtu.edu.cn是一样的。

  一台有用IP地址的主机可以提供多种服务,比如Web服务,FTP服务,SMTP服务等,这些服务完全可以在一台主机上,即对应一个IP地址,那么,这台主机是怎样区分不同的服务呢?可以通过端口号来区分,即通过“IP地址+端口号”来唯一确定网络上一台主机上 的一个服务。端口号用整数来表示,范围是从0到65535。其中,任何TCP/IP所提供的服务都用1到1023之间的端口号,这个范围是知名端口号,是由互联网数字分配机构来管理的;大多数TCP/IP给临时端口分配1024到5000之间的端口号;大于5000的端口号为其他Internet上并不常用的服务预留的。知名端口号一般固定分配给一些服务,如21端口分配给FTP(文件传输协议)服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,135端口分配给RPC(远程过程调用)服务等。

1.3 Java提供的通信方式

 1. Socket----面向连接

     使用TCP协议,TCP是一种面向连接保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序无差错的数据流。Java提供Socket和ServerSocket类支持TCP协议。在发送数据之前,发送方与接收方各有一个Socket,它们要建立连接,一旦这两个Socket建立了连接,双方就可以双向数据传输,并且所有发送的信息都会在另一端以同样的顺序被接收安全性高,这种方式如同打电话。例如,HTTP协议是基于连接的。

2. Datagram----无连接的

    使用UDP协议,UDP是一种无连接的协议,一个数据报是一个独立的单元,包含目的地址和要发送的数据,无需建立连接,只是简单的投出数据报。Java提供的DatagramSocket和DatagramPacket类支持UDP协议。效率高,但是安全性不高,这种方式如同邮递信件,TFTP是基于UDP的。

1.4  常用类(java.net包中)

1. InetAddress类

    此类表示互联网中的IP地址。主要方法如下:

    (1)pulic static InetAddress getByName(String host) throws UnknownHostException。在给定的主机名或IP地址的情况下确定返回InetAddress的对象。参数可以是IP地址或主机名的字符串形式,如211.64.120.1或www.sdjtu.edu.cn

    (2)public String getHostName()。获取此IP地址的主机名。

    (3)public static InetAddress getLocalHost() throws UnknownHostException。返回本地主机的InetAddress对象。

    (4)public String getHostAddress()。字符串形式返回IP地址。

     例如:获取IP地址信息

import java.net.*;  //导入net包
public class net1 {
 public static void main(String[] args) {
  try{
   //获取给定IP地址的InetAddress对象
   InetAddress address1=InetAddress.getByName("211.64.120.1");
   //返回该主机的主机名
   System.out.println("211.64.120.1的域名"+address1.getHostName());
   InetAddress address2=InetAddress.getLocalHost(); //获取本地机的InetAddress对象
   System.out.println("本机的机器名:"+address2.getHostName());  //返回本地机的主机名
   System.out.println("本机的IP地址:"+address2.getHostAddress());  //获取本机的IP地址
  }catch(Exception e){
   System.out.println(e.toString());
  }
 }
}

运行结果:

211.64.120.1的域名211.64.120.1
本机的机器名:KDQLRKWERJRL1DT
本机的IP地址:182.121.201.16

上面的程序分别获取了给定的IP地址的主机信息和本机的信息,注意:由于方法getByName()和getLocalHost()声明可能抛出UnknownHostException异常,因此要把他们放到try语句块中。

2. URL类

类URL代表一个统一资源定位符,是指向互联网资源的指针,用于指定资源在Internet上的具体位置。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如,对数据库或者搜素引擎的查询。URL通常baok协议、主机名、端口、文件路径等几部分。例如,http://www.sdjtu.edu.cn/sdjtunet/xyxx.asp

包括http协议,主机名是www.sdjtu.edu.cn,端口用http默认端口号80、文件路径是sdjtunet/xyxx.asp。

(1)构造器:

public URL(String spec) throws MalformedURLException:根据String表示形式创建URL对象。

(2)常用方法:

public String getProtocol();获取此URL的协议名称。

public String getHost(); 获取此URL的主机名。

public int getPort(); 获取此URL的端口号,如果未设置端口号,则返回-1。

import java.net.*;
public class UrlTest {
 public static void main(String[] args) {
  try{
   URL u1=new URL("http://www.sdjtu.edu.cn:80/sdjtunet/xyxx.asp");
   System.out.println("URL:"+u1);
   System.out.println("Protocal:"+u1.getProtocol());  //获取URL的协议名称
   System.out.println("Host:"+u1.getHost());   //获取URL的主机名
   System.out.println("Port:"+u1.getPort());  //URL中无端口号返回-1
   }catch(Exception e){
   System.out.println(e.toString());
  }
 }
}

运行结果:

URL:http://www.sdjtu.edu.cn:80/sdjtunet/xyxx.asp
Protocal:http
Host:www.sdjtu.edu.cn
Port:80

由于上述程序中的URL没有显示的给出端口号,因此得到的端口号为-1,此时用的是http协议的默认端口号80.

posted @ 2013-11-17 17:07  OnlyYou0726  阅读(263)  评论(0编辑  收藏  举报