Java网络编程-Socket实现数据通信
文章目录
前言
本文主要是为下一篇Websockt做铺垫,大家了解socket的一些实现。
网络编程三要素
网络编程是指利用计算机网络进行程序设计、开发的技术。网络编程主要包含三个要素,分别是:
- IP地址和端口号
- 传输协议
- Socket
IP地址和端口号
在计算机网络中,每台计算机都有一个IP地址,用于唯一标识该计算机在网络中的位置。IP地址由32位二进制数表示,通常采用点分十进制表示法,如192.168.1.1。
端口号是指计算机中应用程序与网络之间进行交互时,用于标识该应用程序的一个标识符。端口号是一个16位的无符号整数,取值范围为0-65535,其中0-1023为系统保留端口号,一般用于系统服务。
传输协议
在互联网中,主要有两种传输协议,分别是TCP协议和UDP协议。
TCP协议是一种可靠的面向连接的传输协议。在TCP协议中,数据传输前需要先建立连接,通过三次握手进行确认,保证数据传输的可靠性。TCP协议适用于对数据传输可靠性要求较高的应用场合,如文件传输、电子邮件等。
UDP协议是一种不可靠的无连接传输协议。在UDP协议中,数据在传输过程中不需要建立连接,也不需要进行数据确认。UDP协议适用于对数据传输可靠性要求较低的应用场合,如音视频传输、在线游戏等。
Socket
Socket是一种通信协议,可以实现不同计算机之间的网络通信。使用Socket开发网络应用程序,可以实现客户端与服务器之间的数据交换,比如网页数据、文件传输等。在Java中,可以使用Socket类实现TCP协议的Socket连接。客户端通过创建Socket对象并指定服务端的IP地址和端口号来连接服务端。服务端通过创建ServerSocket对象并监听客户端的请求,等待客户端连接。
使用Scoket实现网络通信
TCP
TCP通信-发送方
public class Client {
public static void main(String[] args) throws IOException {
//TCP协议,发送数据
//1.创建Socket对象
//细节:在创建对象的同时会连接服务端
// 如果连接不上,代码会报错
Socket socket = new Socket("127.0.0.1",10000);
//2.可以从连接通道中获取输出流
OutputStream os = socket.getOutputStream();
//写出数据
os.write("aaa".getBytes());
//3.释放资源
os.close();
socket.close();
}
}
TCP通信-接收方
public class Server {
public static void main(String[] args) throws IOException {
//TCP协议,接收数据
//1.创建对象ServerSocker
ServerSocket ss = new ServerSocket(10000);
//2.监听客户端的链接
Socket socket = ss.accept();
//3.从连接通道中获取输入流读取数据
InputStream is = socket.getInputStream();
int b;
while ((b = is.read()) != -1){
System.out.println((char) b);
}
//4.释放资源
socket.close();
ss.close();
}
}
结果
UDP
UDP通信-发送方
package com.utils;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* @BelongsProject: CSDN_score
* @BelongsPackage: com.utils
* @Author:qiutianshuo
* @Description:
* @CreateTime: 2023-09-01 11:24
* @Version: 1.0
*/
public class SendDemo {
public static void main(String[] args) throws IOException {
//创建发送端的Socket对象(DatagramSocket)
// DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口
DatagramSocket ds = new DatagramSocket();
//创建数据,并把数据打包
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
//构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
byte[] bys = "hello,udp,我来了".getBytes();
DatagramPacket dp = new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),10086);
//调用DatagramSocket对象的方法发送数据
//void send(DatagramPacket p) 从此套接字发送数据报包
ds.send(dp);
//关闭发送端
//void close() 关闭此数据报套接字
ds.close();
}
}
UDP通信-接收方
package com.utils;
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(11111);
ds.receive(dp);
System.out.println(2222);
//3.解析数据包
byte[] data = dp.getData();
int len = dp.getLength();
InetAddress address = dp.getAddress();
int port = dp.getPort();
System.out.println("接收到数据" + new String(data,0,len));
System.out.println("该数据是从" + address + "这台电脑中的" + port + "这个端口发出的");
//4.释放资源
ds.close();
}
}
结果
总结
网络编程是现代计算机技术中非常重要的一部分,上述三要素是网络编程的基础。要实现网络编程,需要了解IP地址和端口号的概念和使用,掌握TCP协议和UDP协议的特点和使用,以及掌握Socket编程相关知识和技能。同时在实现过程中也需要注意安全性问题,例如加密数据传输、防止数据篡改等。
维度 | TCP协议 | UDP协议 |
---|---|---|
传输可靠性 | 面向连接、可靠传输数据 | 无连接、不可靠传输数据 |
连接方式 | 三次握手连接方式 | 无连接方式 |
传输效率 | 传输效率较低 | 传输效率较高 |
数据包大小 | 数据包大小不固定 | 数据包大小固定 |
应用场景 | 适用于对数据传输可靠性要求较高的应用场合,如文件传输、电子邮件等 | 适用于对数据传输可靠性要求较低的应用场合,如音视频传输、在线游戏等 |
错误检测 | 支持错误检测和重传机制 | 不支持错误检测和重传机制 |
拥塞控制 | 有拥塞控制机制,能够避免网络拥塞 | 没有拥塞控制机制,可能导致网络拥塞 |
数据顺序 | 保证数据传输顺序 | 不保证数据传输顺序 |
连接数量 | 连接数量受限于系统内存和处理器能力 | 连接数量受限于系统内存和处理器能力 |