Java 网络编程核心基础:IP地址、端口、TCP/UDP协议与代码实战
Java 网络编程主要涉及 IP 地址定位、端口区分进程,以及 TCP 和 UDP 两种核心传输协议。本文梳理了 InetAddress 与 InetSocketAddress 的使用方法,并通过 TCP 和 UDP 的 Socket 通信源码,详细解析了连接建立、数据流处理及文件传输的具体操作。
1. IP 地址与域名解析
IP 地址是网络上计算机的唯一标识。IPv4 由 4 个字节组成,范围从 0-255,地址资源已趋近枯竭;IPv6 则为 128 位长地址。局域网常用 192.168.x.x 段,而 127.0.0.1 或 localhost 代表本机回环地址。为了方便记忆,通常使用域名代替 IP。
第 1 步:查询本机与网站 IP 地址
目的:演示 Java 中获取本机信息及解析域名的基本用法。
入口:InetAddress 类。
动作:调用 getByName() 传入 IP 或域名,使用 getLocalHost() 获取本地主机信息,并利用 getHostAddress() 和 getHostName() 提取对应字段。
重要参数:需捕获 UnknownHostException。
//测试IP
public class TestInetAddress {
public static void main(String[] args) {
try {
//查询本机地址
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
System.out.println(inetAddress);
InetAddress localhost = InetAddress.getByName("localhost");
System.out.println(localhost);
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);
//查询网站ip地址
InetAddress inetAddress1 = InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress1);
//常用方法
System.out.println(inetAddress1.getHostAddress());//ip
System.out.println(inetAddress1.getHostName());//域名,或者自己的名字
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
2. 端口号与进程管理
端口相当于门牌号,用于区分计算机上的不同进程。端口号范围 0-65535,其中 0-1023 为公有端口(如 HTTP:80, HTTPS:443),1024-49151 为用户注册端口(如 Tomcat:8080, MySQL:3306),49152-65535 为动态私有端口。
第 2 步:命令行查看与 Java 创建 SocketAddress
目的:展示系统层面的端口监控及 Java API 中的地址组合使用。
入口:CMD / InetSocketAddress 类。
动作:使用 netstat -ano 查看所有端口,结合 findstr 过滤指定端口并查杀进程;在 Java 中通过构造函数组合 IP 与端口。
//CMD
netstat -ano #查看所有的端口
netstat -ano|findstr "5900" #查看指定的端口
tasklist|findstr "8696" #查看指定端口的进程
//端口示例
public class TestInetSocketAddress {
public static void main(String[] args) {
InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);
System.out.println(socketAddress);
System.out.println(socketAddress.getAddress());
System.out.println(socketAddress.getHostName());//地址
System.out.println(socketAddress.getPort());//端口
}
}
3. 通信协议详解与对比
TCP 提供可靠的面向连接的服务,如同打电话,经历三次握手建立连接、四次挥手断开连接,稳定但效率相对较低;UDP 则是无连接的协议,如同发短信,不区分严格的服务端与客户端,只要准备好即可发送,不稳定但效率高。
第 3 步:实现 TCP 双向聊天
目的:演示基于 TCP 流的 Socket 服务端监听与客户端发送。
入口:ServerSocket, Socket, InputStream/OutputStream。
动作:服务端开启端口阻塞监听 accept(),获取输入流循环读取;客户端连接服务器地址与端口,通过输出流写入消息。注意资源的 finally 块关闭。
//服务端示例片段
public class TcpServerDemo01 {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket accept=null;
InputStream is=null;
ByteArrayOutputStream baos=null;
try {
//1.得有一个地址
serverSocket = new ServerSocket(9999);
while(true){
//2.等待客户端连接过来
accept = serverSocket.accept();
//3.读取客户端的消息
is = accept.getInputStream();
baos = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int len;
while ((len=is.read(bytes))!=-1){
baos.write(bytes,0,len);
}
System.out.println(baos.toString());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 此处省略部分关闭逻辑以保持代码简洁,实际开发必须逐一关闭资源
}
}
}
//客户端示例片段
public class TcpClientDemo01 {
public static void main(String[] args) {
Socket socket=null;
OutputStream os=null;
try {
InetAddress serverIP= InetAddress.getByName("127.0.0.1");
int port=9999;
socket = new Socket(serverIP,port);
os = socket.getOutputStream();
os.write("Hello".getBytes());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭流与socket
}
}
}
第 4 步:实现 TCP 断点续传与文件上传
目的:利用 TCP 流处理二进制大文件传输及状态反馈。
入口:FileInputStream, FileOutputStream。
动作:服务端将输入流数据逐块写入本地文件;客户端读取本地文件写出到 Socket。客户端必须在写出完成后调用 shutdownOutput() 通知服务端结束,随后读取服务端的接收确认消息再关闭连接。
//服务端文件接收片段
public class TcpServerDemo02 {
public static void main(String[] args) throws Exception{
ServerSocket serverSocket = new ServerSocket(9000);
Socket accept = serverSocket.accept();
InputStream is = accept.getInputStream();
FileOutputStream fos = new FileOutputStream("receive.jpg");
byte[] by = new byte[1024];
int len;
while ((len=is.read(by))!=-1){
fos.write(by,0,len);
}
//通知客户端接收完毕
OutputStream os = accept.getOutputStream();
os.write("接收完毕".getBytes());
// 后续关闭逻辑...
}
}
//客户端文件发送片段
public class TcpClientDemo02 {
public static void main(String[] args) throws Exception{
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);
OutputStream os = socket.getOutputStream();
FileInputStream fis = new FileInputStream("D:\\WorkSpace\\JavaSE\\基础语法\\111.png");
byte[] by = new byte[1024];
int len;
while ((len=fis.read(by))!=-1){
os.write(by,0,len);
}
//关键步骤:通知服务器传输结束
socket.shutdownOutput();
// 接收服务器确认并关闭资源...
}
}
第 5 步:UDP 单向消息发送与聊天
目的:体验无连接的数据报收发机制。
入口:DatagramSocket, DatagramPacket。
动作:发送方封装目标 IP、端口和数据构建 DatagramPacket 后发送;接收方初始化相同长度的缓冲区并 receive() 阻塞等待。聊天示例中通过控制台 System.in 持续读取并发送,以字符串内容控制退出。
//发送方
public class UdpClientDemo01 {
public static void main(String[] args) throws Exception{
DatagramSocket datagramSocket = new DatagramSocket();
String msg="你好啊,服务器!";
InetAddress localhost = InetAddress.getByName("localhost");
int port = 9090;
DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
}
//聊天发送方循环示例
public class UdpSenderDemo01 {
public static void main(String[] args) throws Exception{
DatagramSocket datagramSocket = new DatagramSocket(8888);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true){
String data=reader.readLine();
byte[] bytes = data.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length,new InetSocketAddress("localhost",6666));
datagramSocket.send(datagramPacket);
if(bytes.equals("byebye")){ break; }
}
datagramSocket.close();
}
}
以上就是 Java 网络编程中关于 IP、端口及 TCP/UDP 协议实现的详细内容,更多关于 Java Socket 编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













