文章目录
前言
在这个信息高速流通的时代,网络编程已成为软件开发中不可或缺的一部分。它允许计算机之间通过互联网或局域网进行数据交换和通信,从而构建出多样化的网络应用。在众多编程语言中,Java因其跨平台的特性、健壮的安全性和强大的社区支持而成为网络编程的热门选择之一。
Java网络编程的核心在于Socket编程,它基于TCP/IP协议栈,允许程序员创建客户端和服务端应用程序,实现数据的发送与接收。无论是构建一个简单的聊天应用,还是开发一个复杂的分布式系统,Java都提供了必要的工具和接口来简化这一过程。
在本篇博客中,我们将深入探讨Java网络编程的基础概念,包括Socket和ServerSocket类的使用,以及如何利用Java提供的APIs来编写高效且可靠的网络应用程序。我们将一步步了解如何创建网络连接,处理输入输出流,以及应对网络通信中可能遇到的各种挑战。
一、网络编程是什么?
在网络通信协议下,不同计算机上运行的程序,进行的数据传输。
Java中可以使用java.net包下的技术轻松开发出常见的网络应用程序。
二、常见的软件架构
三、网络编程的三要素
IP:设备在网络中的地址,是唯一的标识
端口号:应用程序在设备中唯一的标识
协议:数据在网络中传输的规则
常见的协议有UDP、TCP、http、https、ftp
四、IP
1、IP的作用
设备在网络中的地址,是唯一的标识
2、IPv4有什么特点
目前的主流方案
最多只有2^32次方个ip,目前已经用完了
3、IPv6有什么特点
为了解决IPv4不够用而出现的
最多有2^128次方个ip
可以为地球上的每一粒沙子都设定ip
4、现在如何解决IPv4不够的问题
利用局域网IP解决IP不够的问题
5、特殊的IP是什么
127.0.0.1(永远表示本机)
6、常见的两个CMD命令
ipconfig:查看本机IP地址
ping:查看网络是否连同
五、端口号
应用程序在设备中的唯一标识
端口号:由两个字节表示的整数,取值范围:0~65535
其中0~1023之间的端口号用于一些知名的网络服务或者应用。
我们自己使用1024以上的端口就可以了。
注意:一个端口号只能被一个应用程序使用。
六、协议
七、UDP通信程序
1、步骤
2、代码示例(单播)
发送类
import java.io.IOException;
import java.net.*;
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
//发送数据
//1.创建DatagramSocket对象
//细节:
//绑定端口,以后我们就是通过这个端口往外发送
//空参:所有可用的端口中随机一个进行使用
//有参:指定端口号进行绑定
DatagramSocket ds = new DatagramSocket();
//2.打包数据
String str = "你好威啊!!!";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10086;
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
//3.发送数据
ds.send(dp);
//4.释放数据
ds.close();
}
}
接收类
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 {
//接收数据
//1.创建DatagramSocket对象
//细节:
//在接收的时候,一定要绑定端口
//而且绑定的端口要和发送的端口一致
DatagramSocket ds = new DatagramSocket(10086);
//2.接收数据
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
//这个方法是阻塞的
//程序执行到这一步的时候,会在这里死等
//等发送端发送消息
System.out.println(1111);
ds.receive(dp);
System.out.println(2222);
//3.解析数据包
byte[] date = dp.getData();
int len = dp.getLength();
InetAddress address = dp.getAddress();
int port = dp.getPort();
System.out.println("接收到数据"+new String(date,0,len));
System.out.println("该数据是从" + address +"这台电脑中" + port +"这个端口发出的");
//4.释放数据
ds.close();
}
}
3、UDP的三种通信方式
1、单播
以上代码就是单播
2、组播
组播地址:224.0.0.0~239.255.255.255
其中224.0.0.0~224.0.0.225为预留的组播地址
3、广播
广播地址:255.255.255.255
组播代码示例
发送端代码
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
/*
组播发送端代码
*/
//创建MulticastSocket对象
MulticastSocket ms = new MulticastSocket() ;
// 创建DatagramPacket对象
String s = "你好,你好!" ;
byte[] bytes = s.getBytes();
InetAddress address = InetAddress.getByName("224.0.0.1");
int port = 10000;
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, address, port) ;
// 调用MulticastSocket发送数据方法发送数据
ms.send(datagramPacket);
// 释放资源
ms.close();
}
}
接收端代码示例
public class ReceiveMessageDemo3 {
public static void main(String[] args) throws IOException {
/*
组播接收端代码
*/
//1. 创建MulticastSocket对象
MulticastSocket ms = new MulticastSocket(10000);
//2. 将将当前本机,添加到224.0.0.2的这一组当中
InetAddress address = InetAddress.getByName("224.0.0.2");
ms.joinGroup(address);
//3. 创建DatagramPacket数据包对象
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
//4. 接收数据
ms.receive(dp);
//5. 解析数据
byte[] data = dp.getData();
int len = dp.getLength();
String ip = dp.getAddress().getHostAddress();
String name = dp.getAddress().getHostName();
System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + new String(data,0,len));
//6. 释放资源
ms.close();
}
}
八、TCP通信程序
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象
通信之前要保证连接已经建立
通过Socket产生的IO流来进行网络通信
1、步骤
2、代码示例
客户端代码
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
//TCP协议,发送数据
//1.创建Socket对象
//细节:在创建对象的同时会连接服务端
// 如果连接不上,代码会报错
Socket socket = new Socket("127.0.0.1",10086);
//2.可以从连接通道中获取输出流
OutputStream os = socket.getOutputStream();
//写出数据
os.write("你好".getBytes());
//3.释放资源
os.close();
socket.close();
}
}
服务器代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
//1.创建对象ServerSocket
ServerSocket ss = new ServerSocket(10086);
//2.监听客户端的链接、
Socket socket = ss.accept();
//3.从链接通道中输入流读取数据
/*InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);*/
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
int b;
while ((b=br.read()) != -1){
System.out.print((char) b);
}
//4.释放资源
socket.close();
ss.close();
}
}
3、三次握手
4、四次挥手
5、综合练习(上传文件)
总结
在本文中,我们从网络编程的基础出发,理解了Socket和ServerSocket的工作原理,学习了如何创建客户端和服务器端的程序,以及它们是如何通过输入输出流进行数据交换的。我们还讨论了多线程编程在处理并发连接时的重要性,以及如何通过异常处理来增强程序的健壮性。