Java 学习--网络编程(一)
一、网络通信的要素。1、 IP。网络通信首先要找到通讯方的IP地址,在网络当中IP是连接在网络中的计算机的唯一标识。
2、 端口。数据要发送到对方指定的应用程序上,为了达到准确无误,将这些网络应用程序进行数字标识,这些数字标识就称为端口具体来说是逻辑端口。
3、 通讯协议。规定了双方进行通讯时需要遵守的规则。主要学习TCP/IP协议与UDP/IP协议。
二、Java中对IP地址处理。
在Java中有专门处理IP的类——InetAddress类:此类表示互联网协议 (IP) 地址。该类无构造函数,可以通过以下方法得到一个InetAddress的对象。
1、 static InetAddress[] getAllByName(String host)
在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
2、static InetAddress getByAddress(byte[] addr)
在给定原始 IP 地址的情况下,返回InetAddress 对象。
3、static InetAddress getByAddress(String host, byte[] addr)
根据提供的主机名和 IP 地址创建InetAddress。
4、static InetAddress getByName(String host)
在给定主机名的情况下确定主机的 IP 地址。
5、static InetAddress getLocalHost()
返回本地主机。
可以调用如下方法获取IP:
1、 String getCanonicalHostName()
获取此 IP 地址的完全限定域名。
2、 String getHostAddress()
返回 IP 地址字符串(以文本表现形式)。
3、String getHostName()
获取此 IP 地址的主机名。
三、UDP与TCP
UDP,在通讯过程中将数据的源和目的封装成数据包,不需要建立连接,每个数据包的大小限制在64k之内,因为是无连接,所以是不可靠的,但是其通讯速度快。
TCP,在通讯过程中需要建立连接,并形成数据通道,在连接中可以传输大量数据,它是通过三次握手建立的连接,所以具有可靠性,但是因为需要先建立连接才能实现通讯,所以这种方式效率较低。
四、Socket
Socket是一种为网络服务提供的机制。在网络通讯的两端都有Socket,数据在两个Socket之间通过IO传输,网络通信其实质就是Socket间的通信。
UDP的Socket建立:
需要先了解两个类:DatagramSocket(此类表示用来发送和接收数据报包的套接字)与DatagramPacket(此类表示数据报包,数据报包用来实现无连接包投递服务)。
发送端:
1、 通过DatagramSocket创建udp的Socket服务。DatagramSocket ds = new DatagramSocket();
2、 确定数据,并封装成数据包。DatagramPacket dp = new DatagramPacket(…….)。
3、 通过udp的Socket服务将已有的数据包发送出去。ds.send(dp);
4、 关闭资源。ds.close();
接收端:
1、 通过DatagramSocket创建udp的Socket服务,通常在这里设置一个监听端口,用以指定该接收断处理哪个端口发来的数据。DatagramSocket ds = newDatagramSocket(int mark);
2、 定义一个用来存储接收到的数据的空数据包。DatagramPacket dp = newDatagramPacket(…….)。
3、 通过udp的Socket服务将将接收到的数据包存储在第2步中定义的空数据包中。ds.receive(dp);
4、 通过数据包的方法获取器中的数据。
InetAddress getAddress() 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
byte[] getData() 返回数据缓冲区。
int getLength() 返回将要发送或接收到的数据的长度。
int getOffset() 返回将要发送或接收到的数据的偏移量。
int getPort() 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
SocketAddress getSocketAddress() 获取要将此包发送到的或发出此数据报的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。
5、 关闭资源。ds.close();
TCP的Socket建立:
TCP的Socket建立主要涉及两个类Socket类与ServerSocket类。Socket类实现客户端套接字(也可以就叫“套接字”可以称为端口)。套接字是两台机器间通信的端点。ServerSocket类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
客户端:
1、 建立Socket服务,指定要连接的主机和端口。Socket s = new Socket(Stringhost, int port);
2、 获取Socket流中的输出流,将数据写到该流中,通过网络发送给服务端。OutputStream out = S.getOutputStream();
3、 获取Socket流中的输入流,获取服务端反馈的信息。InputStream in = S.getInputStream();
4、 关闭客户端。S.close();
服务端:
1. 建立ServerSocket服务,指定要接收的端口。ServerSocket ss = newServerSocket (int port);
2. 获取连接到服务端的客户端Socket。Socket s = ss.accept();
3. 获取Socket流中的输出流,将数据写到该流中,通过网络发送给服务端。OutputStream out = S.getOutputStream();
5、 获取Socket流中的输入流,获取服务端反馈的信息。InputStream in = S.getInputStream();
6、 关闭客户端。S.close();
7、 关闭服务端。ss.close();