Java 网络编程核心基础:IP地址、端口、TCP/UDP协议与代码实战

程一诺
程一诺
发布时间:2026-10-16 | 3人浏览过
原创

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 编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表