1.网络模型概述
a.概述:计算机网络是指由通信线路互联的许多自主工作的计算机构成的集合体,各个部件之间以何种规则进行通信,就是网络模型研究的问题。网络模型一般指OSI七层参考模型和TCP/IP四层参考模型。这两个模型在网络中应用最广泛。
图例:
2.网络要素
a.IP地址:InetAddress
网络中设备的标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
b.端口号
用于标识进程的逻辑地址,不同进程的标识
有效端口:0--65535,其中0-1024系统使用或保留端口
c.传输协议
通讯的规则
常见协议:TCP,UDP
3.IP对象:InetAddress
代码示例:
//获取本地主机IP地址对象
InetAddress ip = InetAddress.getLocalHost();
//获取其他主机的ip地址对象
ip = InetAddress.getByName("123.125.114.5");
System.out.println(ip.getHostAddress());
System.out.println(ip.getHostName());
4.UDP协议
发送端代码示例:
/*
* 创建UDP传输的发送端 思路:
* 1.建立UDP的socket服务
* 2.将要发送的数据封装到数据包中
* 3.通过udp的socket服务将数据包发送出去
* 4.关闭socket服务
*/
System.out.println("发送端启动...");
//1.建立UDP的socket服务,使用DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
//2.将要发送的数据封装到数据包中
String str = "udp传输演示:哥们来了!";
//使用DatagramPacket将数据封装到该对象包中
byte[] buf = str.getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.163"),10000);
//3.通过UDP的socket服务将数据包发送出去,使用send方法
ds.send(dp);
//4.关闭资源
ds.close();
接收端代码示例:
/*
* 建立UDP接收端的思路
* 1.建立udp socket服务
* 2.创建数据包,用于存储接收到的数据,方便用数据包对象方法解析这些数据
* 3.使用socket服务的receive方法将接收端数据存储到数据包中
* 4.通过数据包的方法解析数据包中的数据
* 5.关闭资源
*/
System.out.println("接收端启动...");
//1.建立UDP socket服务,使用 DatagramSocket方法,并明确端口
DatagramSocket ds = new DatagramSocket(10000);
//2.创建数据包用于存储数据,使用DatagramPacket
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3.接收数据,使用socket服务的receive方法
ds.receive(dp);
//4.解析数据包中的数据,比如地址、端口、数据内容
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+port+":"+text);
//5.关闭资源
ds.close();
5.TCP协议
客户端代码示例:
/*客户端数据发送带服务端
*
* Tcp传输,客户端建立的过程
* 1.创建tcp客户端socket服务,使用的是socket对象
* 建议该对象一创建就明确目的地,要连接的主机
* 2.如果连接建立成功,说明数据传输通道已建立
* 该通道就是socket流,是底层建立好的,既然是流说明这里既有输入,又有输出
* 想要输入或输出流对象,可以找socket来获取
* 可以通过getOutputStream()和getInputStream()来获取两个字节流
* 3.使用输出流,将数据写出
* 4.关闭资源
*/
System.out.println("客户端启动...");
//1.创建客户端socket服务
Socket socket = new Socket("192.168.1.163",10001);
//2.获取socket流中的输出流
OutputStream out = (OutputStream) socket.getOutputStream();
//3.使用输出流将指定的数据写出去
out.write("tcp演示:哥们又来了!".getBytes());
//4.关闭资源
socket.close();
服务端代码示例:
/*
* 建立tcp服务端的思路:
* 1.创建服务端socket服务,通过ServerSocket
* 2.服务端必须对外提供一个端口,否则客户端无法连接
* 3.获取连接过来的客户端对象
* 4.通过客户端对象获取socket流读取客户端发来的数据并打印在控制台上
* 5.关闭资源,关闭客户端,关闭服务端
*/
System.out.println("服务端启动...");
//1.创建服务端socket服务,使用ServerSocket并明确端口
ServerSocket ss = new ServerSocket(10001);
//2.获取连接过来的客户端对象
Socket s = ss.accept();
//3.通过socket对象获取输入流,要读取客户端发来的数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println("server:"+text);
//4.关闭资源
s.close();
ss.close();
6.客户端和服务端交互
客户端代码示例:
System.out.println("客户端启动...");
//1.创建客户端socket服务
Socket socket = new Socket("192.168.1.163",10001);
//2.获取socket流中的输出流
OutputStream out = socket.getOutputStream();
//3.使用输出流将指定的数据写出去
out.write("tcp演示:哥们又来了!".getBytes());
//4.读取服务端返回的数据,使用socket读取流
InputStream in = socket.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(text);
//5.关闭资源
socket.close();
服务端代码示例:
System.out.println("服务端启动...");
//1.创建服务端socket服务,使用ServerSocket并明确端口
ServerSocket ss = new ServerSocket(10001);
//2.获取连接过来的客户端对象
Socket s = ss.accept();
//3.通过socket对象获取输入流,要读取客户端发来的数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println("server:"+text);
//4.使用客户端socket对象的输出流给客户端返回数据
OutputStream out = s.getOutputStream();
out.write("收到".getBytes());
//5.关闭资源
s.close();
ss.close();
7.URL&URLConnection
代码示例:
String str_url = "http://192.168.1.100:8080/myweb/1.html?name=lisi";
//将url地址封装为url对象
URL url = new URL(str_url);
System.out.println("getProtocol:"+url.getProtocol());//获取此url协议名称
System.out.println("getHost:"+url.getHost());//获取此url的主机名
System.out.println("getPort:"+url.getPort());//获取此url的端口号
System.out.println("getFile:"+url.getFile());//获取此url的文件名
System.out.println("getPath:"+url.getPath());//获取此url的路径部分
System.out.println("getQuery:"+url.getQuery());//获取此url的查询部分
//打开到此URL的链接并返回一个用于从该连接读入的InputStream
// InputStream in = url.openStream();
// byte[] buf = new byte[1024];
// int len = in.read(buf);
// String text = new String(buf,0,len);
//
// System.out.println(text);
//
// in.close();
//获取url对象的url连接器对象,将连接封装成对象:java中内置的可以解析的具体协议的对象+socket
URLConnection con = url.openConnection();
System.out.println(con);
8.常见网络结构
/*
* 网络结构:
* 1.C/S client/server
* 特点:
* 该结构的软件,客户端和服务端都要编写
* 可是开发成本较高,维护较麻烦
* 好处:
* 客户端在本地可以分担一部分运算
* 2.B/S browser/server
* 特点:
* 该结构的软件,只开发服务器端,不开发客户端,因为客户端直接由浏览器取代
* 好处:
* 开发成本相对低,维护更简单
* 缺点:所有运算都要在服务端完成
*/