网络编程
什么是网络编程?
**网络编程:**在网络通信协议下,不同计算机上运行的程序,进行的数据传输
计算机与计算机之间通过网络进行数据传输
java中可以使用java.net包下的技术开发常见的网络应用程序
常见的软件架构(C/S、B/S)
**C/S:**Client/Server 客户端/服务器

优点:画面可用做的非常精美,用户体验好
缺点:需要开发客户端,也需要开发服务端
用户需要下载核更新的时候太麻烦
通过客户端访问服务器
**B/S:**Browser/server 浏览器/服务器

通过浏览器访问服务器
**优点:**不需要开发客户端,只需要页面+服务端
用户不需要下载,打开浏览器就能用
缺点:如果应用过大,用户体验受到影响
总结

网络编程三要素
**IP:**设备在网络中的地址,是唯一的标识
**端口号:**应用程序在设备中的唯一标识
**协议:**数据在网络中的传输规则,常见的协议有UDP、TCP、http、https、ftp
IP(Internet Protocol),互联网协议地址,也称IP地址
是分配给上网设备的数字标签
上网设备在网络中的地址,是唯一的
**IPv4:**Internet Protocol version 4 ,互联网通信协议第四版
采用32位地址长度,分成4组

**IPv6:**Internet Protocol version 6 ,互联网通信协议第六版


IPv4的地址分类形式
公网地址(万维网使用)和私有地址(局域网使用)

特殊IP地址


不一样

常用的CMD命令:
**ipconfig:**查看本机IP地址
**ping:**检查网络是否畅通
InetAddress的使用
java
package com.itheima.a01InetAddressdemo;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class MyInetAddressDemo1 {
public static void main(String[] args) throws UnknownHostException {
//1、获取InetAddress的对象
//IP的对象 一台电脑的对象
InetAddress address = InetAddress.getByName("DESKTOP-UA5S79S");
System.out.println(address);
//获取电脑的主机名
String name = address.getHostName();
System.out.println(name);
//获取电脑的IP地址
String ip = address.getHostAddress();
System.out.println(ip);
}
}
端口号
应用程序在设备中的唯一标识
**端口号:**由两个字节表示的整数,取值:0~65535
其中0~1023之间的端口号用于一些指明的网络服务或应用
我们自己使用1024以上的端口号就可以了
一个端口号只能被一个应用程序使用
协议
计算机网络中,连接和通信的规则被称为网络通信协议
OSI参考模型(太过理想,未能广泛推广)

TCP/IP参考模型(TCP/IP协议)(国际标准)

UDP协议
用户数据报协议(User Datagram Protocol)
面向无连接通信协议
速度快,有大小限制,一次最多发送64K,数据不安全,容易丢失数据
不管是否连接成功,直接发送

UDP通信程序(发送数据)
1)创建发送端的 DatagramSocket对象
2)数据打包 DatagramPacket
3)发送数据
4)释放资源
java
package com.itheima.a02udpdemo;
import java.io.IOException;
import java.net.*;
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
//细节:绑定端口,以后我们就是通过这个端口往外发送
//空参:所有可用的端口中随机一个进行使用
//有参:指定端口号进行绑定
DatagramSocket ds = new DatagramSocket();
//打包数据
String str = "你好呀!";
//将字符串转换为字节数组
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10086;
//创建DatagramPacket对象
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
//发送数据
ds.send(dp);
//关闭资源
ds.close();
}
}
UDP通信程序(接收数据)
1)创建接收端的 DatagramSocket对象
2)接收打包好的数据
3)解析数据包
4)释放资源
java
package com.itheima.a02udpdemo;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ReceiveMessageDemo {
public static void main(String[] args) throws IOException {
//细节:接收的时候,一定要绑定端口
//而且绑定的端口号,要和发送端绑定的端口号一致
DatagramSocket ds = new DatagramSocket(10086);
//接收数据包
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
ds.receive(dp);
//解析数据包
int length = dp.getLength();
byte[] data = dp.getData();
InetAddress address = dp.getAddress();
int port = dp.getPort();
System.out.println("接收到数据" + new String(data, 0, length));
System.out.println("该数据是从:" + address + "的" + port + "端口发出的");
//关闭资源
ds.close();
}
}

UDP的三种通信方式
1)单播
以前的代码就是单播
2)组播
组播地址:224.0.0.0~239.255.255.255
其中224.0.0.0~224.0.0.255为预留的组播地址

3)广播
广播地址;255.255.255.255

TCP协议
传输控制协议TCP(Transmission Control Protocol)
面向连接的通信协议
速度慢,没有大小限制,数据安全

TCP通信程序
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象
通信之前要保证连接已经建立
通过Socket产生IO流来进行通信

java
package com.itheima.a02tcpdemo1;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
//TCP协议,发送数据
//创建Socket对象
//细节:在创建对象的同时会连接服务器
//如果连接不上,代码会报错
Socket socket = new Socket("127.0.0.1", 10001);
//从连接通道中获取输出流
OutputStream os = socket.getOutputStream();
//写出数据
os.write("aaa".getBytes());
//释放资源
os.close();
socket.close();
}
}
java
package com.itheima.a02tcpdemo1;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
//TCP协议,接收数据
//创建对象
ServerSocket ss = new ServerSocket(10001);
//监听客户端连接
Socket socket = ss.accept();
//从连接通道中获取输入流
InputStream is = socket.getInputStream();
int b;
while((b = is.read()) != -1){
System.out.print((char)b);
}
//释放资源
socket.close();
ss.close();
}
}
在这种情况下,只能发送英文,发送中文的话会出现乱码现象
如何解决:

提高读取效率

TCP通信程序(三次握手)
确保连接建立

TCP通信程序(四次挥手)
确保连接断开,且数据处理完毕

