目录
1.基本概念
网络编程是指编写能够在计算机网络中进行通信和数据交换的程序的过程。它涉及使用特定的编程语言和网络协议来创建客户端和服务器应用程序,这些应用程序能够通过网络发送和接收数据。
网络编程的基本模式:CS(客户端 - 服务端) BS(浏览器 - 服务端)
BS的优点:
- 易于部署和维护:BS架构的应用程序通常只需要在服务器端进行更新和维护,用户界面通过浏览器访问,无需在每个客户端上安装更新。
- 跨平台:可以在任何带有浏览器的设备上运行,不受操作系统和硬件的限制。
- 成本效益:减少了客户端软件分发和维护的成本。
- 集中式数据管理:数据集中存储在服务器上,易于进行集中管理和备份。
- 实时更新:用户可以实时访问最新的数据和功能。
缺点:
- 依赖网络:需要稳定的网络连接,网络问题可能影响用户体验。
- 性能限制:大量数据交互可能导致性能瓶颈。
- 安全性问题:数据在客户端和服务器之间传输,需要确保数据传输的安全。
- 用户体验:虽然现代Web技术已经非常先进,但某些情况下可能无法完全复制桌面应用程序的丰富交互体验。
- 功能限制:对于需要复杂计算或高度定制化界面的应用程序,浏览器可能存在功能限制。
CS的优点:
- 强大的客户端功能:CS架构允许开发功能丰富的桌面应用程序,提供更好的用户体验。
- 离线功能:即使在没有网络连接的情况下,某些CS应用程序也可以运行。
- 更好的性能:由于数据处理可以在客户端进行,减轻了服务器的负担,可能提供更快的响应时间。
- 定制化:可以为特定任务或工作流程定制用户界面和功能。
- 安全性:数据和处理可以在客户端进行,减少了数据在网络中传输的风险
缺点:
- 部署和维护成本:需要在每个客户端机器上安装和更新应用程序。
- 平台依赖性:可能需要为不同的操作系统开发不同的客户端应用程序。
- 成本:开发和维护成本较高,特别是当需要支持多个平台时。
- 数据同步:在多客户端环境中,数据同步和一致性管理可能成为挑战。
- 升级困难:升级客户端应用程序可能需要逐个机器进行,这可能导致版本不一致的问题。
2.协议
1、 UDP协议(用户数据协议):UDP是无连接通信协议,即在数据传输的时,数据的发送端和接收端是不建立逻辑的,由于使用UDP协议消耗的资源小,通信效率高,所以通常会用于:
视频、会议、音频和普通数据的传输
UDP三种通讯方式:
单播:用于两个主机之间的端对端的通信
组播:用于一组特定的主机进行通信
广播:用于一个主机对整个局域网上所有主机上的数据通信
2、TCP协议(传输控制协议):TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑联系,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。
三次握手
TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠
四次挥手
四次挥手是确保连接断开,并且数据处理完毕
3.在Java中使用UDP协议
步骤如下:
首先是编写发送数据代码
1、创建发送端的Socket对象(DatagramSocket)
2、创建数据,并把数据打包
3、调用DatagramSocket对象的方法发送数据
4、关闭发送端
/**
* @author 大黑
*/
public class SendDemo {
public static void main(String[] args) throws IOException {
//发送数据
//创建发送端数据对象(socket)
//使用空参构建就会随机端口号
DatagramSocket ds = new DatagramSocket();
//准备数据,发送什么
String msg = "hello 大黑";
byte[] bytes = msg.getBytes();
//给哪台电脑发
// 这里就填写本地ip
InetAddress byName = InetAddress.getByName("127.0.0.1");
//发送的端口号 ---这个端口可以自己定义
int port = 10086;
// 这里的DatagramPacket参数大致就是这几个
// 发送字数据字节bytes,字节长度bytes.length,ip地址byName,端口号port
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, byName, port);
//发送数据
ds.send(dp);
}
}
接着编写接受数据代码
1、创建接收端的Socket对象
2、创建一个数据包,用于接受数据
3、调用DatagramSocket对象的方法接收数据
4、解下数据包,并把数据在控制台显示
5、关闭接收端
/**
* @author 大黑
*/
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//创建接受端的Socket对象(DatagramSocket)
//发送端的端口是向10086发送的,接收也只能从10086端口接收
DatagramSocket ds = new DatagramSocket(10086);
//创建接收的数据对象
//创建用来接收数据的字节数组
byte[] bytes = new byte[1024];
DatagramPacket dp =new DatagramPacket(bytes, bytes.length);
//接收数据
ds.receive(dp);
//解析数据
byte[] bytes1 = dp.getData();
int len = dp.getLength();
InetAddress inetAddress = dp.getAddress();
int port = dp.getPort();
System.out.println("接收到的数据:"+new String(bytes1,0,len));
System.out.println("该数据是从"+inetAddress+"这台电脑"+port+"这个端口发出的");
//释放资源
ds.close();
}
}
接着来进行测试,这里要注意,要先启动接受端的程序,再启动发送端的程序。如果先启动发送端的程序,程序执行完就回结束,不会等待接收端接受到数据才结束,这个时候再启动接收端,接收端就会一直等待
4.在Java中使用TCP协议
步骤如下:
首先还是编写发送(客户端)数据代码
1、创建客户端的Socket对象与指定服务端连接
2、获取输出流,写数据
3、释放资源
/**
* @Author: 大黑
* @Date: 2024/3/11 21:37
*/
public class ClientTCPDemo {
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());
//释放资源
os.close();
socket.close();
}
}
接着编写接收数据的代码:
1、创建服务端的Socket对象(ServerSocket)
2、监听客户端连接,返回一个Socket对象 Socket accept()
3、获取输入流,读数据,并把数据显示在控制台
4、释放资源
/**
* @Author: 大黑
* @Date: 2024/3/11 21:59
*/
public class RecieveTCPDemo {
public static void main(String[] args) throws IOException {
//TCP协议,接收数据
//1.创建对象ServerSocket
// 这里的端口号必须要跟发送端的端口一致
ServerSocket serverSocket = new ServerSocket(10086);
//2.监听客户端连接
Socket socket = serverSocket.accept();
//3.从连接通道中获取输入流读取数据
InputStream inputStream = socket.getInputStream();
//将字节流转变成字符流
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
//提高读取效率,将字符流再转换成缓冲流
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
int b;
while ((b = bufferedReader.read()) != -1) {
System.out.print((char)b);
}
//4.释放资源
socket.close();
serverSocket.close();
}
}
这里还是要先启动接受端的程序,这样在启动发送端的程序时才能创建连接成功,因为TCP协议是需要客户端和服务端建立连接的,如果,这里服务端没有启动,就不能创建连接,客户端就会报错拒绝连接