套接字编程-实现基于TCP/IP和UDP的客户端和服务器

套接字编程允许你实现基于网络的应用程序。在Java中,java.net包提供了进行网络通信所必需的类和接口。TCP/IP和UDP是两种常见的网络协议,其中TCP是面向连接、可靠的流传输协议,而UDP是无连接、不可靠的数据报传输协议。

以下是使用Java进行TCP和UDP套接字编程的简单示例:

TCP套接字编程

TCP服务器
import java.io.*;
import java.net.*;

public class TCPServer {
    public static void main(String[] args) throws IOException {
        int port = 6789; // 服务器监听端口
        ServerSocket welcomeSocket = new ServerSocket(port);

        while (true) {
            // 等待连接
            Socket connectionSocket = welcomeSocket.accept();

            // 建立输入和输出流
            BufferedReader inFromClient =
                new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());

            // 读取客户端数据
            String clientSentence = inFromClient.readLine();
            System.out.println("Received: " + clientSentence);

            // 处理数据并回复客户端
            String capitalizedSentence = clientSentence.toUpperCase() + '\n';
            outToClient.writeBytes(capitalizedSentence);
        }
    }
}
TCP客户端
import java.io.*;
import java.net.*;

public class TCPClient {
    public static void main(String[] args) throws IOException {
        String sentence;
        String modifiedSentence;
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));

        Socket clientSocket = new Socket("localhost", 6789);

        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

        // 发送数据到服务器
        System.out.println("Enter a sentence:");
        sentence = inFromUser.readLine();
        outToServer.writeBytes(sentence + '\n');

        // 接收服务器的响应
        modifiedSentence = inFromServer.readLine();
        System.out.println("FROM SERVER: " + modifiedSentence);

        clientSocket.close();
    }
}

UDP套接字编程

UDP服务器
import java.io.*;
import java.net.*;

public class UDPServer {
    public static void main(String[] args) throws IOException {
        int port = 9876; // 服务器监听端口
        DatagramSocket serverSocket = new DatagramSocket(port);

        byte[] receiveData = new byte[1024];
        byte[] sendData;

        while (true) {
            // 接收数据
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            serverSocket.receive(receivePacket);
            String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("Received: " + sentence);

            // 发送数据
            InetAddress IPAddress = receivePacket.getAddress();
            int clientPort = receivePacket.getPort();
            String capitalizedSentence = sentence.toUpperCase();
            sendData = capitalizedSentence.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, clientPort);
            serverSocket.send(sendPacket);
        }
    }
}
UDP客户端
import java.io.*;
import java.net.*;

public class UDPClient {
    public static void main(String[] args) throws IOException {
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        DatagramSocket clientSocket = new DatagramSocket();

        InetAddress IPAddress = InetAddress.getByName("localhost");
        byte[] sendData;
        byte[] receiveData = new byte[1024];

        // 发送数据
        System.out.println("Enter a sentence:");
        String sentence = inFromUser.readLine();
        sendData = sentence.getBytes();
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
        clientSocket.send(sendPacket);

        // 接收数据
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        clientSocket.receive(receivePacket);
        String modifiedSentence = new String(receivePacket.getData(), 0, receivePacket.getLength());
        System.out.println("FROM SERVER: " + modifiedSentence);

        clientSocket.close();
    }
}

在这些示例中,我们创建了简单的TCP和UDP服务器,这些服务器会将从客户端接收到的字符串转换为大写,并将其发送回客户端。客户端则发送字符串给服务器,并打印出服务器返回的响应。

要运行这些示例,请先启动服务器程序,然后启动客户端程序。这些程序将允许你在客户端输入一段文本,然后服务器会接收这段文本,处理后再发送回客户端。

步骤如下:

  1. 编译程序:首先,将上面给出的服务器和客户端代码保存到.java文件中。例如,你可以将TCP服务器代码保存为TCPServer.java,将TCP客户端代码保存为TCPClient.java,UDP服务器和客户端代码分别保存为UDPServer.javaUDPClient.java

  2. 运行TCP服务器和客户端:打开终端或命令提示符,导航到包含你的.java文件的目录。

    编译服务器和客户端:

    javac TCPServer.java
    javac TCPClient.java
    

    运行TCP服务器:

    java TCPServer
    

    在另一个终端窗口中,运行TCP客户端:

    java TCPClient
    

    然后按照提示输入一段文本,并查看客户端和服务器之间的交互。

  3. 运行UDP服务器和客户端:同样地,首先编译服务器和客户端:

    javac UDPServer.java
    javac UDPClient.java
    

    运行UDP服务器:

    java UDPServer
    

    在另一个终端窗口中,运行UDP客户端:

    java UDPClient
    

    同样地,输入一段文本并观察客户端和服务器之间的通信。

注意事项:

  • 当你运行TCP/UDP服务器时,它会绑定到一个端口并等待客户端的连接。确保该端口在你的系统上未被占用。
  • 当客户端和服务器在同一台机器上时,你可以使用localhost127.0.0.1作为服务器地址。如果它们在不同的机器上,你需要提供服务器机器的实际IP地址。
  • TCP和UDP使用不同的类来建立网络连接。TCP使用SocketServerSocket,而UDP使用DatagramSocketDatagramPacket
  • 在真实的应用程序中,你需要添加异常处理来管理网络错误,例如连接失败、读写错误等。
  • 另外,你可能需要处理多个客户端连接,这通常通过为每个客户端连接创建新的线程或使用线程池来实现。

通过这些练习,你将获得套接字编程的基本经验,这是网络编程和分布式应用开发中的一个重要方面。

  • 33
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值