Java笔记(22)网络编程
程序员文章站
2022-03-05 15:42:18
...
Java笔记(22)网络编程
1.网络模型概述
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统;
网络模型一般是指:
1. OSI参考模型;
2. TCP/IP参考模型;
OSI参考模型:
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
TCP/IP参考模型:
- 应用层
- 传输层
- 网际层
- 主机至网络层
2.网络编程三要素
网络编程就是用Java实现计算机间的信息传递和共享;
网络编程三要素:
- IP地址:点分十进制的一串数字地址,是计算机在网络系统中的唯一标识
- 端口:是应用程序的标识。范围:0-65535。其中0-1024一般都被系统应用占用的,不建议使用;
- 协议:协议有两种,UDP和TCP,UDP是将数据打包,有限制不连接,效率高但不可靠;TCP协议是建立数据连接通道,无限制,效率低,可靠;
3.Java获取IP地址的类
在Java中,为了方便我们获取IP地址对象,就提供了InetAddress类供我们使用;
//根据主机名或者IP地址的字符串表现形式获取IP地址对象
InetAddress address = InetAddress.getByName("Y1WYSIAE8KEZZZW");
//根据IP对象获得IP地址
String ip = address.getHostAddress();
System.out.println(ip);
4.Java的Socket通信
在Java中,通过Socket这个套接字来进行计算机间的网络通信,一个Socket包含了IP地址+端口,它通信的原理是让两端都有一个Socket,网络通信其实就是两个Socket间通信,数据在Socket中通过通信协议下的IO流传输;
(1)UDP通信
/**
* 发送端
* @author Administrator
*
*/
public class SendDemo {
public static void main(String[] args) throws IOException {
//创建UDP协议的Socket对象
DatagramSocket ds = new DatagramSocket();
//创建数据并打包
byte[] bys = "hello,Socket!".getBytes();
//创建IP地址对象
InetAddress address = InetAddress.getByName("Y1WYSIAE8KEDZZZ");
//创建数据包对象
DatagramPacket dp = new DatagramPacket(bys, bys.length, address,9099);
//调用Socket的发送方法
ds.send(dp);
//释放资源
ds.close();
}
}
/**
* 这是接收端,也就是服务端
* @author Administrator
*
*/
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// 创建UDP协议Socket对象,并指定端口
DatagramSocket ds = new DatagramSocket(9099);
// 创建一个数据包接收容器
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
// 调用Socket对象接收数据到容器里
ds.receive(dp);
// 解析发送过来的数据
byte[] bys2 = dp.getData();
String s = new String(bys2, 0, bys2.length);
System.out.println(dp.getAddress().getHostAddress() + ":" + s);
// 释放资源
ds.close();
}
}
(2)TCP通信
public class ReceiveSocket {
public static void main(String[] args) throws IOException {
//创建TCP协议的接收端Socket对象,并指定端口号
ServerSocket socket = new ServerSocket(8888);
//监听客户端连接,当客户端连接时产生一个Socket对象
Socket s = socket.accept();
//获取输入流,并包装为高效流
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;
while((line = br.readLine()) != null) {
System.out.println(s.getInetAddress().getHostAddress() + ":" + line);
}
//释放资源,正常开发情况中服务器接收端不需要关闭
s.close();
}
}
public class SendSocket {
public static void main(String[] args) throws IOException {
//创建TCP协议发送端Socket对象
Socket s = new Socket(InetAddress.getByName("Y1WYSIAE8KEZZZZ"), 8888);
//封装输出流对象
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//封装控制台输入对象,将控制台的数据写入流中
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = br.readLine()) != null) {
//是886就退出循环
if(line.equals("886")) {
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}
s.close();
}
}
//注意的是,TCP协议Socket需要先开启服务端,先开启发送端会报错,这是由于TCP通信协议的机制决定的;