网络编程之Socket类和InetAddress类

来源:互联网 发布:虚拟陀螺仪的软件 编辑:程序博客网 时间:2024/05/18 19:20

Java中的网络支持
针对网络通信的不同层次,Java提供了不同的API,其提供的网络功能有四大类:

InetAddress:用于标识网络上的硬件资源,主要是IP地址
URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据
Sockets:使用TCP协议实现的网络通信Socket相关的类
Datagram:使用UDP协议,将数据保存在用户数据报中,通过网络进行通信。

基于Socket的低层次Java网络编程
Socket通信:网络上的两个程序通过一个双向饿的通讯连接实现数据的交换,这个双向链路的一端被称为一个Socket,Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议中一个非常流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。

Socket通讯的一般过程

使用Socket进行Client/Server程序设计的一般连接过程是这样的:Server端Listent(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accpet(接受)消息。一个连接就建立起来了,Server端和Client端都可以通过Send,Write等方法与对方通信。

对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:

1:创建Socket
2:打开连接到Socket的输入输出流
3:按照一定的协议对Socket进行读写操作
4:关闭Socket

创建Socket
Java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。
其构造方法如下:

   Socket(InetAddress address, int port);  Socket(InetAddress address, int port, boolean stream);  Socket(String host, int prot);  Socket(String host, int prot, boolean stream);   Socket(SocketImpl impl)  Socket(String host, int port, InetAddress localAddr, int localPort)  Socket(InetAddress address, int port, InetAddress localAddr, int localPort)  ServerSocket(int port);  ServerSocket(int port, int backlog);  ServerSocket(int port, int backlog, InetAddress bindAddr)

其中address、host和port分别是双向连接中另一方的IP地址、主机名和端口号,stream指明socket是流socket还是数据报socket,localPort表示本地主机的端口号,localAddr和bindAddr是本地机器的地址(ServerSocket的主机地址),impl是socket的父类,既可以用来创建serverSocket又可以用来创建Socket。count则表示服务端所能支持的最大连接数。

例如:
  Socket client = new Socket(“127.0.01.”, 80);
  ServerSocket server = new ServerSocket(80);
  注意,在选择端口时,必须小心。每一个端口提供一种特定的服务,只有给出正确的端口,才能获得相应的服务。0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23, 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。
  在创建socket时如果发生错误,将产生IOException,在程序中必须对之作出处理。所以在创建Socket或ServerSocket是必须捕获或抛出例外。

InetAddress
InetAddress类用于标识网络上的硬件资源,标识互联网协议(IP)地址。
该类没有构造方法

1 //获取本机的InetAddress实例2 InetAddress address =InetAddress.getLocalHost();3 address.getHostName();//获取计算机名4 address.getHostAddress();//获取IP地址5 byte[] bytes = address.getAddress();//获取字节数组形式的IP地址,以点分隔的四部分7 //获取其他主机的InetAddress实例8 InetAddress address2 =InetAddress.getByName("其他主机名");9 InetAddress address3 =InetAddress.getByName("IP地址");

参考博客:
http://www.cnblogs.com/rocomp/p/4790340.html