网络编程的基本概念
IP和端口
IP是互联网中联网设备的唯一标识,而网络编程是和远程计算机的通信,所以必须要能定位到远程计算机,IP就是用来解决此类问题;一台计算机中可能有很多进程,具体和哪一个进程进行通信,这就得靠端口来识别。
TCP和UDP协议
TCP是Tranfer Control Protocol的简称,是一种面向连接的可靠传输协议。通过TCP协议传输,得到是一个顺序的无差错的数据流。TCP比较复杂,但能够为要求可靠性的应用层协议提供服务,如文件传输、邮件发送、网页浏览、远程登录等等。
UDP是User Datagram Protocol的简称,是一种无连接的协议,将数据封包成一个个数据报,独立传输。UDP协议传输不能保证数据不丢失、无差错,也不能保证数据的发送与接收的顺序是一致的。UDP协议比较简单,效率较高,能为对可靠性要求不高、实时性要求比较高的应该提供服务,如即时通讯,视频会议,直播等。
TCP协议特点:
1、面向连接的,提供可靠的数据传输服务;
2、提供了流量控制,TCP能够控制进程发送数据的速率,保证另一端不被大量的数据淹没而出现溢出;
3、提供了阻塞控制,当网络出现阻塞时,TCP也会控制数据的速率和数量;
4、必须建立连接,效率会稍低,但在连接中可以进行大数据量传输;
UDP协议特点:
1、面向无连接的,是一种尽最大努力的方式,不提供可靠的数据传输服务;
2、UDP没有阻塞和流量控制;
3、不需要建立连接,速度较快;
4、UDP是以数据报来传输的,每个数据报的大小限制在64k内;
Socket
Socket是网络驱动层提供给应用程序编程接口或者说是一种机制。网络上的两个程序通过一个双向的通讯连接实现数据交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程方式,一个Socket由一个IP地址和一个端口号唯一确定。
Socket是在应用程序中创建的,它是通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和Port。创建完Socket以后,应用程序将数据写入到Socket中,由Socket交给驱动程序向网络发送数据;计算机从网络上收到与某个Socket绑定的IP和Port的相关数据后,再由驱动程序交给Socket,应用程序便可以从这个Socket中读取收到的数据。网络应用程序就是这样通过Socket发送和接收数据的。
Socket的基本工作流程包含以下四个步骤:
1、创建Socket;
2、打开连接到Socket的输入输出流;
3、按照一定的协议对Socket进行读写操作;
4、关闭Socket;
Java网络编程常用类
InteAddress类
InteAddress是一个封装IP地址信息的类。IP地址是使用32位或者128位无符号数字,UDP和TCP协议都是在它的基础上构建的。InteAddress将IP地址以对象的形式进行封装,可以更方便的操作和获取其属性。注意InteAddress没有构造方法,只可以通过静态方法来获取它的对象(该方法会自动判断是创建Inte4Address,还是创建Inte4Address)。
下面是InteAddress的常用方法:
// 获取本地主机IP地址对象
static InetAddress getLocalhost();
// 获取给定主机名的IP地址对象
static InetAddress getByName(String host);
// 获取给定主机名的IP地址对象数组
static InetAddress[] getAllByName(String host);
// 通过IP地址获取InetAddress对象
static InetAddress getByAddress(byte[] addr);
// 获取IP地址字符串
String getHostAddress();
// 获取此IP地址主机名
String getHostName();
import java.net.InetAddress;
public class IpDemo {
public static void main(String args[]) throws Exception {
// 获取本机Ip
InetAddress localhost = InetAddress.getLocalHost();
System.out.println("address: " + localhost.getHostAddress());
System.out.println("name: " + localhost.getHostName());
// 获取指定域名主机IP(如果该主机有多个IP,只获取其中一个)
InetAddress ia = InetAddress.getByName("www.baidu.com");
System.out.println("address: " + ia.getHostAddress());
System.out.println("name: " + ia.getHostName());
// 获取指定域名主机所有IP
InetAddress[] iaArray = InetAddress.getAllByName("www.sina.com");
for (InetAddress i : iaArray) {
System.out.println("address: " + i.getHostAddress());
System.out.println("name: " + i.getHostName());
}
// 通过IP地址获取InetAddress对象
InetAddress ip = InetAddress.getByAddress(new byte[] { 121, 14, 1, (byte) 189 });
System.out.println(ip.getCanonicalHostName());
}
}
Socket和ServerSocket类
Socket和ServerSocket类均位于java.net包中,是Java实现TCP协议通信的重要类。Socket表示客户端套接字,用来接收和发送数据的;ServerSocket表示服务器端套接字,用来监听客户端请求连接,并建立连接,获取对应socket对象。(详情参照Java TCP通信)
DatagramSocket和DatagramPacket类
DatagramSocket和DatagramPacket均位于java.net包中,是Java实现UDP协议通信的重要类。DatagramPacket用来表示存放数据的数据报,DatagromSocket用来接受或者发送数据报。(详细参照Java UDP通信)