使用Java编写Socket程序实现网络通信

一、Socket Programming是什么

Socket Programming(套接字编程)是指使用Socket API进行网络编程。在Java中,Socket可以用来通过TCP/IP协议进行数据交换,可以实现不同机器之间的数据通信。

Socket编程通过创建Socket对象来开启一个端口,端口号是从1到65535之间的整数。一台机器可以同时开启多个端口,不同的端口用来提供不同的服务。

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
    public static void main(String[] args) throws IOException {
        int portNumber = 8080;
        ServerSocket serverSocket = new ServerSocket(portNumber);
        while (true) {
            Socket clientSocket = serverSocket.accept();
            // 开启线程处理客户端请求
            new RequestHandler(clientSocket).start();
        }
    }
}

二、实现Tcp Server服务端

要实现一个Tcp Server服务端,需要创建一个ServerSocket对象,调用accept()方法等待客户端请求,当有客户端请求时,会返回一个Socket对象,通过该对象即可与客户端通信。

开启一个ServerSocket对象,设置端口号,使用accept()方法等待客户端请求:

ServerSocket serverSocket = new ServerSocket(portNumber);
Socket clientSocket = serverSocket.accept();

获取客户端请求后,可以使用输入流读取客户端发送的数据,使用输出流向客户端发送响应数据:

InputStream inputStream = clientSocket.getInputStream();
OutputStream outputStream = clientSocket.getOutputStream();

完整的Tcp Server服务端代码示例:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws IOException {
        int portNumber = 8080;
        ServerSocket serverSocket = new ServerSocket(portNumber);
        while (true) {
            Socket clientSocket = serverSocket.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                out.println(inputLine);
            }
        }
    }
}

三、实现Tcp Client客户端

要实现一个Tcp Client客户端,需要创建一个Socket对象,连接指定的服务器地址和端口号,然后使用输入输出流向服务器发送请求和接收响应。

创建一个Socket对象,设置服务器地址和端口号,向服务器发送请求,并读取响应:

Socket socket = new Socket(serverAddress, portNumber);
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();

完整的Tcp Client客户端代码示例:

import java.io.*;
import java.net.Socket;

public class TcpClient {
    public static void main(String[] args) throws IOException {
        String serverAddress = "localhost";
        int portNumber = 8080;
        Socket socket = new Socket(serverAddress, portNumber);
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String userInput;
        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput);
            System.out.println("echo: " + in.readLine());
        }
    }
}

四、使用UDP协议进行数据传输

使用UDP(User Datagram Protocol)协议可以实现不需要建立连接,直接进行数据传输的网络通信。相比于TCP,UDP更轻便,但无法保证数据的可靠性和顺序。

使用UDP协议创建一个DatagramSocket对象,然后创建一个DatagramPacket对象,该对象包含发送或接收的数据和目标地址和端口号。通过send()方法向指定地址发送数据包,使用receive()方法接收数据包。

完整的UDP Server服务端代码示例:

import java.io.IOException;
import java.net.*;

public class UdpServer {
    public static void main(String[] args) throws IOException {
        int portNumber = 8080;
        DatagramSocket serverSocket = new DatagramSocket(portNumber);
        byte[] receiveData = new byte[1024];
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        while (true) {
            serverSocket.receive(receivePacket);
            String message = new String(receivePacket.getData(), receivePacket.getOffset(), receivePacket.getLength());
            System.out.println("Received message: " + message);
            InetAddress address = receivePacket.getAddress();
            int port = receivePacket.getPort();
            byte[] sendData = message.toUpperCase().getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port);
            serverSocket.send(sendPacket);
        }
    }
}

完整的UDP Client客户端代码示例:

import java.io.IOException;
import java.net.*;

public class UdpClient {
    public static void main(String[] args) throws IOException {
        String serverAddress = "localhost";
        int portNumber = 8080;
        DatagramSocket clientSocket = new DatagramSocket();
        InetAddress address = InetAddress.getByName(serverAddress);
        byte[] sendData = "Hello, UDP!".getBytes();
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, portNumber);
        clientSocket.send(sendPacket);
        byte[] receiveData = new byte[1024];
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        clientSocket.receive(receivePacket);
        String message = new String(receivePacket.getData(), receivePacket.getOffset(), receivePacket.getLength());
        System.out.println("Received message: " + message);
    }
}

五、总结

本文详细介绍了使用Java编写Socket程序实现网络通信的方法,包括Tcp Server服务端,Tcp Client客户端,以及UDP协议的实现方式。希望读者能够通过本文加深对Socket编程的理解,实践中灵活运用。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/251029.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-13 13:32
下一篇 2024-12-13 13:32

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Python程序文件的拓展

    Python是一门功能丰富、易于学习、可读性高的编程语言。Python程序文件通常以.py为文件拓展名,被广泛应用于各种领域,包括Web开发、机器学习、科学计算等。为了更好地发挥P…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29

发表回复

登录后才能评论