目录
[IPv4 的地址分类形式](#IPv4 的地址分类形式)
[UDP 协议收发数据](#UDP 协议收发数据)
[TCP 协议收发数据](#TCP 协议收发数据)
网络编程基本概念
可以让设备中的程序与网络上其他设备中的程序进行数据交互的技术(实现网络通信)。

基本的通信架构
基本的通信架构有2种形式:CS架构( Client客户端/Server服务端 ) 、 BS架构(Browser浏览器/Server服务端)。





网络编程三要素


IP地址
IPV4

IPV6

IP 的作用
设备在网络中的地址,是唯一的标识
IPv4 有什么特点
目前的主流方案
最多只有2^32次方个ip,目前已经用完了
IPv6有什么特点
为了解决IPv4不够用而出现的
最多有2^128次方个ip
可以为地球上的每一粒沙子都设定ip
IPv4 的地址分类形式

IPv4 的地址分类形式

特殊IP地址



常用的CMD命令
ipconfig:查看本机IP地址
ping:检查网络是否连通
现在如何解决IPv4不够的问题?
利用局域网IP解决IP不够的问题
特殊的IP是什么?
127.0.0.1(永远表示本机)
常见的两个CMD命令?
ipconfig:查看本机IP地址
ping:检查网络是否连通
IP和网址

InetAddress对象
为了方便我们对IP地址的获取和操作,Java提供了一个类InetAddress 供我们使用
InetAddress:此类表示Internet协议(IP)地址。
|-------------------------------------------|-----------------------------------|
| 方法名 | 说明 |
| static InetAddress getByName(String host) | 确定主机名称的IP地址。 主机名称可以是机器名称,也可以是IP地址 |
| String getHostName() | 获取此 IP 地址的主机名 |
| String getHostAddress() | 返回文本显示中的 IP 地址字符串 |
端口号
应用程序在设备中唯一的标识。
端口号:由两个字节表示的整数,取值范围:0~65535
其中0~1023之间的端口号用于一些知名的网络服务或者应用。
我们自己使用1024以上的端口号就可以了。
注意:一个端口号只能被一个应用程序使用

协议


UDP 协议收发数据
UDP是面向无连接通信协议。
速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据
UDP协议发送数据
package com.itheima.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Receive {
public static void main(String[] args) throws IOException {
//创建接受对象
DatagramSocket socket = new DatagramSocket(9999);
//准备接受端的包裹对象
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
//接受数据
socket.receive(packet);
//拆包
byte[] data = packet.getData();
String s = new String(data,0, packet.getLength());
String hostAddress = packet.getAddress().getHostAddress();
System.out.println("接收到"+hostAddress+"发送的数据"+s);
}
}
package com.itheima.udp;
import java.io.IOException;
import java.net.*;
public class Send {
public static void main(String[] args) throws IOException {
//创建发送端的datagramSocket 端数据 发送端
DatagramSocket socket = new DatagramSocket(8888);
//准备数据
String msg ="你好";
byte[] bytes = msg.getBytes();
//打包数据
DatagramPacket pak = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 9999);
//发送数据
socket.send(pak);
//释放资源
socket.close();
}
}

UDP协议收发数据
使用 DatagramSocket 搭建站点
使用 DatagramPacket 打包数据
send 方法用于发送
receive 方法用于接收
TCP 协议收发数据
package com.itheima.tcp;
import javax.imageio.stream.FileImageInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
//使用file对象封装要上传的文件
File file = new File("D:\\2.jpg");
//1,创建客户端的站点和服务端指定ip和端口
Socket socket = new Socket("localhost", 8899);
//客户端通过socket获取传输数据的输入输出流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
//客户端创建本地流对象 读取要上传的数据
FileImageInputStream fis = new FileImageInputStream(file);
byte[] bytes = new byte[1024];
int len;
while ((len = fis.read(bytes))!=-1){
//重点:将读取到的字符 通过网络流对象写给服务器端
os.write(bytes,0,len);
}
//客户端给服务端结束的标记
socket.shutdownOutput();
fis.close();
//读取服务端发来的消息
byte[] data = new byte[1024];
int dataLength = is.read(data);
String msg = new String(data, 0, dataLength);
System.out.println("读取到的数据"+msg);
//关闭流
is.close();
os.close();
socket.close();
}
}
package com.itheima.tcp;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
//1,serverSocket
ServerSocket serverSocket = new ServerSocket(8899);
System.out.println("服务器开始 等待客户端连接......");
//响应客户端请求发送的数据
Socket scoket = serverSocket.accept();
System.out.println("响应成功");
//服务器端通过socket获取传输数据的输入输出流
InputStream inputStream = scoket.getInputStream();
OutputStream outputStream = scoket.getOutputStream();
//本地字输出流
FileOutputStream fos = new FileOutputStream("E://result.jpg");
//读取客户端发过来的文件(图片文字)
byte[] buffer = new byte[1024];
int len ;
while ((len = inputStream.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.close();
//5,写出上传成功的消息给客户端
outputStream.write("上传成功".getBytes());
//关闭流
inputStream.close();
outputStream.close();
serverSocket.close();
}
}
TCP 协议是 面向连接 的通信协议
速度慢,没有大小限制,数据安全
通过三次握手建立连接
通过四次挥手断开连接




TCP 协议区分客户端和服务端
客户端创建 Socket 对象,指定IP和端口号
服务端创建 ServerSocket 对象,指定端口号
调用accept相应请求,得到Socket对象
两端通过socket对象获取输入输出流,收发数据