一、概述
1、计算机网络
计算机网络是将地理位置不同的具有独立功能的多台计算机机器外部设备,通过通信线路连接起来。在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息共享的计算机系统。
2、网络编程
就是用来实现网络互联的不同计算机上运行的程序间可以进行数据交换。
3、Socket套接字(Socket:插座)
Socket套接字用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。
Socket就是为网络编程提供的一种机制:通信的两端都有Socket;网络通信其实就是Socket间的通信;数据在两个Socket间进行IO传输。
二、网络通信中的三要素
1、IP概述
IP是每个设备在网络中的唯一标识。每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。
DOS命令查看IP地址:ipconfig
2、端口号概述
每个程序在设备上的唯一标识。每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序。
端口号的范围:0-65535,其中0-1024系统使用或保留端口,应该使用1024以上的。
常用端口:
- mysql:3306
- Oracle:1521
- web:80
- tomcat:8080
- QQ:4000
3、协议概述
协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。主要有两种:UDP协议和TCP协议
(1)UDP协议
将数据源和目的封装在数据包中,不需要建立连接;每个数据包的大小限制为64k;因为无连接,是不可靠协议;不需要建立连接,速度快。
(2)TCP协议
建立连接,形成传输数据的通道,在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低。
三次握手:客户端先向服务器端发起请求,服务器端相应请求,传输数据。
三、InetAddress的概述和测试
1、概述
InetAddress类是Java专门用来标识网络地址类,用它创建的对象,包含了主机名和数字类型的地址信息。
2、静态方法(获取InetAddress对象)
- static InetAddress getByName(String host):
通过主机名或者ip地址字符串来获得一个对象,这个对象是用来保存IP地址的。
使用主机名和ip地址的区别:传主机名可能有重复,重复后只能获取其中一个,但是传ip地址,获取的一定是唯一的。 - static InetAddress getLocalHost():
返回本地主机,如果仅仅是获得本机信息,就是使用这个,返回InetAddress 这个类的对象。
3、成员方法
- String getHostName():
获取此IP地址的主机名。 - String getHostAddress():
返回IP地址的字符串
4、测试
public class InetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
// 静态方法,获取InetAddress对象
// static InetAddress getByName(String host);
InetAddress address1 = InetAddress.getByName("ASUS");
System.out.println(address1);
// static InetAddress getLocalHost();
InetAddress address2 = InetAddress.getLocalHost();
System.out.println(address2);
// 成员方法
// String getHostAddress()
String hostAddress = address1.getHostAddress();
// String getHostName();
String hostName = address1.getHostName();
System.out.println(hostAddress);
System.out.println(hostName);
}
}
四、UDP协议传输数据
1、UDP协议发送数据
UDP协议在传输数据的时候传输的数据包,所以我们在传输数据的时候需要将数据打包,然后再传递,使用的方法:
- DatagramPacket (byte[], int length, InetAddress address, int port):
构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号。
参数说明:
byte[] buf:字节数据
int length:发送字节数组的长度
InetAddress address:设备的ip地址对象
int port:端口号
发送数据的步骤:
1.创建UDP发送端Socket对象
2.创建数据并打包
3.传输数据
4.释放资源
public class SendDemo {
public static void main(String[] args) throws IOException {
//1.创建UDP发送端Socket对象
DatagramSocket ds = new DatagramSocket();
//2.创建数据并打包
//打包的数据
String s = "hello";
byte[] bys = s.getBytes();
//获取本机地址
InetAddress address = ds.getLocalAddress();
//创建端口号
int port = 10086;
//创建数据包
DatagramPacket dp = new DatagramPacket(bys, bys.length, address, port);
//3.传输数据
ds.send(dp);
//4.释放资源
ds.close();
}
}
2、UDP协议接收数据
由于发送过来的是一个数据包,所以我们还需要创建一个数据报包来接收他,然后再解析数据。
接收数据步骤:
1.创建接收端Socket对象
2.接收数据
3.解析数据
4.输出数据
5.释放资源
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//1.创建接收端Socket对象
DatagramSocket ds = new DatagramSocket(10086);//参数为发送端的端口号
//2.接收数据
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
ds.receive(dp);
//3.解析数据
InetAddress address = dp.getAddress();//获取发送端地址
byte[] data = dp.getData();//获取数据
int length = dp.getLength();//获取数据长度
//4.输出数据
System.out.println("发送端地址:"+address);
System.out.println(new String(data,0,length));
//5.释放资源
ds.close();
}
}
注意:
1.接收的时候需要指定端口号,必须和发送端打包时候端口号一样
2.接收的时候也需要创建数据包来接收数据
3.接收的时候没有返回值,数据都在数据包里面,需要进行解析
3、UDP协议收发数据注意事项
1.如果端口号错误,数据可以正常发出,不会报出异常,但是收不到数据;
2.如果控制台打印
Exception in thread "main" java.net.BindException: Address already in use: Cannot bind
说明此端口号已经绑定了。
五、TCP协议传输数据
1、TCP协议发送数据(Client客户端)
由于数据传输使用的都是IO流,所以我们需要创建IO流对象
使用步骤:
1.创建客户端Socket对象
2.调用Socket类方法创建字节输出流对象
3.传输数据
4.释放资源
public class ClientDemo {
public static void main(String[] args) throws IOException {
//1.创建客户端Socket对象,传入地址和端口
Socket s = new Socket(InetAddress.getLocalHost(),10086);
//2.调用Socket类方法创建字节输出流对象
OutputStream os = s.getOutputStream();
//3.传输数据
String str = "hello";
os.write(str.getBytes());
//4.释放资源
s.close();
}
}
2、TCP协议接收数据(Server服务器端)
使用步骤:
1.创建服务器端Socket对象
2.监听,等待连接
3.调用Socket类方法创建字节输入流对象
4.接收数据
5.释放资源
public class ServerDemo {
public static void main(String[] args) throws IOException {
//1.创建服务器端Socket对象,传入客户端的端口
ServerSocket ss = new ServerSocket(10086);
//2.监听(阻塞),等待连接
Socket s = ss.accept();
//3.调用Socket类方法创建字节输入流对象
InputStream is = s.getInputStream();
//4.接收数据
InetAddress address = s.getInetAddress();//获取客户端ip地址
byte[] bys = new byte[1024];
int len;
len = is.read(bys);
System.out.println("客户端的IP地址为:"+address);
System.out.println(new String(bys,0,len));
//5.释放资源
s.close();
//ss.close();//实际使用中,服务器都是不关闭的,所以服务器端的Socket对象我们一般不释放
}
}
六、UDP协议和TCP协议的特性及应用场景
1、特性
UDP:数据包,无连接,简单,不可靠,会丢包,会乱序(实际中遇到的主要是丢包)
TCP:流式,有连接,复杂,可靠,延迟较大、带宽占用较大(均是相对于UDP来说)
2、应用场景
不同的应用场合会选择不同的协议。以流媒体为例,一类是对实时性要求不高的音视频点播应用(比如各大视频网站),这类应用就多用TCP/HTTP,因为用户可以忍受延时,可以进行缓冲,但不能忍受丢包导致的马赛克。
另一类是对实时性要求很高的音视频通信应用,比如视频会议、视频监控,这类应用用户是无法忍受过高的延时的,相反,偶尔丢一下包却无关大碍。而且,在这类应用中,基于UDP的组播技术也是经常用到的,因为它可以大大减轻服务器和交换机的压力。
总的来说:
UDP协议及时性高于可靠性,主要应用于要求及时性较高的数据传输中。
TCP协议可靠性高于及时性,主要应用于要求可靠性较高的数据传输中。
网友评论