一、网络相关概念
1.1、IP地址
1.1.1、概念
IP地址(Internet Protocol Address)是指互联网协议地址,又称网际协议地址。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。因此,IP地址是逻辑地址,每台主机的网卡上的MAC地址才是物理地址。
1.1.2、组成
32位。由4个8位二进制组成
8位二进制数的范围是0~255
IP地址 = 网络地址 + 主机地址
- 网络地址:标识计算机或网络设备所在的网段
- 主机地址:标识特定主机或网络设备
0.0.0.0:本机
127.0.0.1:本机回环地址,用于本机测试
255.255.255.255:当前子网,一般用于向当前子网广播信息
1.1.3、配置和检测
win系统查看本机的IP地址
ipconfig
测试网络是否通畅
ping 目标ip地址
1.2、网络通信协议
DNS:Domain Name System,域名系统
为了在网络中不同的计算机之间进行通信而建立的规则、标准或约定的集合
二、基于TCP协议的Socket编程
2.1、Socket简介
借鉴的文章
网络通讯的方式有TCP和UDP两种,其中TCP方式的网络通讯是指在通讯的过程中保持连接,有点类似于打电话,只需要拨打一次号码(建立一次网络连接),就可以多次通话(多次传输数据).
在Java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以java.net.Socket类代表客户端连接,以java.net.ServerSocket类代表服务器端连接。在进行网络编程时,底层网络通讯的细节已经实现了比较高的封装,所以在实际编程时,只需要指定IP地址和端口号码就可以建立连接。正是由于这种高度的封装,一方面简化了Java语言网络编程的难度,另外也使得使用Java语言进行网络编程时无法深入到网络的底层,所以使用Java语言进行网络底层系统编程很困难,具体点说,Java语言无法实现底层的网络嗅探以及获得IP包结构等信息。但是由于Java语言的网络编程比较简单,所以还是获得了广泛的使用。
- 通信链路的端点就被称为“套接字”(英文名Socket)
- 是提供给应用程序的接口
2.2、java.net包
使用Socket需要导入java.net包
- Socket
- ServerSocket
- DatagramPacket
- DatagramSocket
- InetAddress
- ……
2.3、基于TCP协议的Socket网络编程
基于TCP协议的Socket网络编程用来实现双向安全连接网络通信
2.3.1、Socket通信模型
- 进行网络通信时,Socket需要借助数据流来完成数据的传递工作
2.3.2、Socket网络编程步骤
网络编程模型:客户端/服务器(C/S)
代码示例
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(10086);
Socket soc = ss.accept();
InputStream is = soc.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str;
while ((str = br.readLine()) != null) {
System.out.println("这里是服务器端,接收到的客户端信息为:" + str);
}
}
}
-----------------------------------------------------------------------------------------
public class Client {
public static void main(String[] args) throws IOException {
// 创建客户端端点
Socket socket = new Socket("localhost", 10086);
// 获取输出流将登录信息发送给服务器端
OutputStream os = socket.getOutputStream();
String str = "用户名和密码";
byte[] bytes = str.getBytes();
os.write(bytes);
System.out.println("向服务器发送请求成功");
//关闭输出流
socket.shutdownOutput();
}
}
三、基于UDP协议的Socket编程
3.1、TCP和UDP对比
TCP | UDP | |
---|---|---|
是否连接 | 面向连接 | 面向非连接 |
传输可靠性 | 可靠 | 不可靠 |
速度 | 慢 | 快 |
3.2、步骤
- 利用 DatagramPacket 封装数据包
- 利用 DatagramSocket 发送数据包
- 利用 DatagramSocket 接收数据包
- 利用 DatagramPacket 处理数据包
代码示例
public class Send {
public static void main(String[] args) {
DatagramSocket ds = null;
InetAddress ia = null;
String mess = "你好,我想咨询一个问题";
try {
ia = InetAddress.getByName("localhost");
DatagramPacket dp = new DatagramPacket(mess.getBytes(), mess.getBytes().length, ia, 8800);
//创建DatagramSocket对象,向服务器发送数据
ds = new DatagramSocket();
ds.send(dp);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
ds.close();
}
}
}
---------------------------------------------------------------------
public class Receive {
public static void main(String[] args) {
DatagramSocket ds = null;
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, 1024);
try {
ds = new DatagramSocket(8800);
ds.receive(dp);
//显示接收到的信息
String mess = new String(dp.getData(), 0, dp.getLength());
System.out.println(dp.getAddress().getHostAddress()+"说:"+mess);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
ds.close();
}
}
}