把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。
Java提供的网络类库,可以实现网络连接联网的底层细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并且 Java 实现了一个 跨平台的网络库,程序员面对的是一个统一的网络编程环境
**网络编程的目的:**直接或间接的通过网络协议与其他计算机实现数据交换,进行通讯。
网络编程中由两个主要的问题:
网络编程中的三个要素:
所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。
IP地址的组成
IP地址 = 网络地址+主机地址
A类IP地址:第一段号码为网络地址,剩下的三段号码为本地计算机的号码
B类IP地址:前二段号码为网络地址,剩下的二段号码为本地计算机的号码
C类IP地址:前三段号码为网络地址,剩下的一段号码为本地计算机的号码
IP地址分类
A类 1.0.0.1—127.255.255.254
(1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址)
(2)127.X.X.X是保留地址,用做循环测试用的。
B类 128.0.0.1—191.255.255.254 172.16.0.0—172.31.255.255是私有地址。
C类 192.0.0.1—223.255.255.254 192.168.x.x是私有地址
D类 224.0.0.1—239.255.255.254
E类 240.0.0.1—247.255.255.254
特殊地址
127.0.0.1 回环地址,可用于测试本机的网络是否有问题. ping 127.0.0.1
DOS命令 ipconfig:查看本机IP地址
xxx.xxx.xxx.255 广播地址
设备与外界通讯交流的出口,可以理解为一个进出房间的门。
端口号:标识正在计算机上运行的进程
要求: 不同的进程有不同的端口号
范围: 被规定为一个16位的整数0-65535
端口号与IP地址的组合得出一个网络套接字:Socket
逻辑端口分类: TCP端口和UDP端口。
计算机网络中实现通信必须要有一些约定,即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。
Osi七层参考模型
应用层:实现人机交互的界面
表示层:编码 解码 加密 解密
会话层:建立 维持 终止会话进程
传输层:通过端口号区分不同服务,数据分段
网络层:通过ip地址进行逻辑寻址 路由器
数据链路层: 媒介访问控制层 MAC
逻辑链路层 llc 为上层提供fcs校验
物理层:定义电气电压接口规范光学特性

UDP协议:非面向连接的不可靠传输协议
TCP协议: 面向连接的可靠传输协议
Tcp面向连接体现在三次握手

四次断开

客户端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class TestUDP {
public static void main(String[] args) {
DatagramSocket socket = null;
try {
// 注意,创建一个udp socket对象,默认占据了8080
socket = new DatagramSocket(8080);
//提供发送的信息
String msg = "Hello World";
byte[] buf = msg.getBytes();
// 数据报对象
DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress("127.0.0.1", 8888));
//发送数据
socket.send(packet);
System.out.println("发送成功");
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭资源
if (socket != null){
socket.close();
}
}
}
}
服务器端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.DatagramSocketImpl;
import java.net.SocketException;
public class TestUDP02 {
public static void main(String[] args) {
DatagramSocket socket = null;
try {
socket = new DatagramSocket(8888);
while (true) {
byte[] buf = new byte[1024];
DatagramPacket pd = new DatagramPacket(buf, 0, buf.length);
System.out.println("正在等待客户端发送数据……");
// 等待接受数据
socket.receive(pd);
System.out.println("接收到数据……");
// 将数据转换出来
byte[] msg = pd.getData();
String sendIP = pd.getAddress().getHostAddress();
int sendPort = pd.getPort();
System.out.println("接受到"+ sendIP +":"+ sendPort +"发送过来的数据,数据是:"+ new String(msg));
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
socket.close();
}
}
}
客户端:
import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
public class TestSocket {
public static final String DES_IP = "192.168.1.3";
public static final int DES_PORT = 8080;
public static void main(String[] args) {
Socket socket = new Socket();
try {
socket.connect(new InetSocketAddress(DES_IP, DES_PORT));
System.out.println("成功连接到服务器");
InputStream is = socket.getInputStream();
String msg = null;
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while ((msg = br.readLine()) != null){
System.out.println("接收到服务器传递过来的数据,数据是:" + msg);
}
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Hello World!");
out.println("DDDDDDD");
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器端:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TestSocketServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(8080);
while (true){
System.out.println("服务器开始运行了,等待客户端连接上来");
Socket socket = serverSocket.accept();
System.out.println(socket.getInetAddress().getHostName());
System.out.println(socket.getLocalAddress());
System.out.println(socket.getPort());
//推送一条消息过去
String msg = "欢迎您进入我们的QQ";
OutputStream os = socket.getOutputStream();
PrintWriter out = new PrintWriter(os, true);
out.println(msg);
//要写在线程里
// InputStream is = socket.getInputStream();
// msg = null;
// BufferedReader br = new BufferedReader(new InputStreamReader(is));
// while ((msg = br.readLine()) != null){
// System.out.println("接收到客户端传" + socket.getInetAddress().getHostAddress() + ":" + socket.getPort() + "递过来的数据,数据是:" + msg);
// }
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}