Java实现TCP/IP协议的收发数据(服务端)代码实例

下面是详细的Java实现TCP/IP协议的收发数据(服务端)代码实例攻略。

1. TCP/IP协议简介

TCP/IP协议是互联网协议的基础。在互联网的架构中,TCP/IP协议是一种可靠的、面向连接的传输层协议,用于在网络中的不同主机之间传输数据。TCP/IP协议包含了许多子协议,其中比较重要的有TCP协议和IP协议。TCP协议提供了可靠的、面向连接的数据传输服务,而IP协议则负责将数据包从源地址传输到目的地址。

2. TCP/IP协议的服务端实现

2.1. 创建ServerSocket

在Java中,服务端实现TCP/IP协议需要先创建一个ServerSocket对象。ServerSocket对象是用来监听指定网络端口的,等待客户端的TCP连接请求。服务端可以通过以下代码来创建一个ServerSocket对象:

ServerSocket serverSocket = new ServerSocket(port);

其中,port为服务端要监听的端口号。

2.2. 监听客户端连接请求

创建ServerSocket对象后,服务端需要通过ServerSocket对象的accept()方法来监听连接请求,该方法会阻塞当前线程,直到有客户端连接请求到来,才会返回Socket对象。

Socket socket = serverSocket.accept();

2.3. 收发数据

建立连接后,服务端可以通过Socket对象来收发数据。服务端通过Socket的getInputStream()方法获取到输入流,通过getOutputStream()方法获取到输出流。示例代码如下:

InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();

服务端可以通过读取输入流的数据,在输出流中发送响应数据。具体的收发数据代码如下:

// 收发数据循环
while (true) {
    // 读取输入流
    byte[] buffer = new byte[1024];
    int len = in.read(buffer);
    if (len == -1) {
        break;
    }
    // 处理数据
    String request = new String(buffer, 0, len);
    String response = handleRequest(request);
    // 发送响应数据
    out.write(response.getBytes());
}

上述代码中,服务器通过in.read(buffer)方法读取输入流的数据,并将读取到的数据转换成字符串。服务器通过handleRequest()方法来处理收到的数据,并将响应数据转换成字节数组,并通过out.write()方法发送给客户端。

2.4. 关闭连接

服务端在处理完客户端连接请求后应该关闭连接,以释放连接所占用的资源。代码如下:

socket.close();

3. 示例说明

3.1. 示例1:实现一个简单的回显服务器

下面是一个简单的回显服务器示例,示例代码如下:

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

public class EchoServer {
    private static final int PORT = 8888;

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(PORT);
        System.out.println("Server started at port " + PORT);

        while (true) {
            Socket socket = serverSocket.accept();

            InputStream in = socket.getInputStream();
            OutputStream out = socket.getOutputStream();

            byte[] buffer = new byte[1024];
            int len;
            while ((len = in.read(buffer)) != -1) {
                String request = new String(buffer, 0, len);
                String response = "echo: " + request;
                out.write(response.getBytes());
            }

            socket.close();
        }
    }
}

该示例实现了一个简单的回显服务器,可以对客户端发送的数据进行打印,并将收到的数据回显给客户端。

3.2. 示例2:实现一个简单的文件服务器

下面是一个简单的文件服务器示例,该示例可以将指定目录下的文件发送给客户端。示例代码如下:

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

public class FileServer {
    private static final int PORT = 8888;
    private static final String ROOT_DIR = "/path/to/root/dir";

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(PORT);
        System.out.println("Server started at port " + PORT);

        while (true) {
            Socket socket = serverSocket.accept();

            String request = readRequest(socket.getInputStream()).trim();
            System.out.println("Request: " + request);

            File file = new File(ROOT_DIR + request);
            OutputStream out = socket.getOutputStream();

            if (file.exists() && file.isFile()) {
                out.write("HTTP/1.0 200 OK\r\n".getBytes());
                out.write(("Content-Length: " + file.length() + "\r\n").getBytes());
                out.write("\r\n".getBytes());

                try (InputStream in = new FileInputStream(file)) {
                    byte[] buffer = new byte[1024];
                    int len;
                    while ((len = in.read(buffer)) != -1) {
                        out.write(buffer, 0, len);
                    }
                }
            } else {
                out.write("HTTP/1.0 404 Not Found\r\n".getBytes());
                out.write("\r\n".getBytes());
            }

            socket.close();
        }
    }

    private static String readRequest(InputStream in) throws IOException {
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();

        byte[] data = new byte[1024];
        int len;
        while ((len = in.read(data)) != -1) {
            buffer.write(data, 0, len);
            if (len < 1024) {
                break;
            }
        }

        return buffer.toString();
    }
}

该示例实现了一个简单的文件服务器,客户端可以通过HTTP协议请求服务器上指定目录下的文件。当客户端发送GET请求时,服务器会解析请求路径,并将对应文件的内容发送给客户端。如果文件不存在,则服务器会返回404 Not Found响应。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现TCP/IP协议的收发数据(服务端)代码实例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Win10控制面板中如何添加自定义程序?在win10控制面板中添加程序的方法

    添加自定义程序到Win10控制面板是一个方便的方法来快速访问和运行您喜欢的应用程序或程序。在下面的攻略中,我将为您提供在Win10控制面板中添加自定义程序的步骤以及以两个示例说明的方式。 步骤1:创建快捷方式 在添加自定义程序之前,首先,我们需要创建一个快捷方式。要创建一个快捷方式,请遵循以下步骤: 找到您要创建快捷方式的程序,右键单击该程序并选择“发送到”…

    other 2023年6月25日
    00
  • [持续更新]安卓6.0/Android M开发者预览版3更新内容大全

    持续更新安卓6.0/ Android M开发者预览版3更新内容大全 简介 本文章主要介绍安卓6.0/ Android M开发者预览版3更新的详细内容。该预览版的更新主要是对先前版本的一些已知问题的修复和一些新增功能的添加。本文将会列举这些修改和新增功能,并对其中重要的信息进行一些补充和解析。 更新内容 1. 权限控制 Android M相对于以前的版本,在权…

    other 2023年6月26日
    00
  • Java 继承与多态的深入理解

    Java 继承与多态的深入理解 Java中的继承是一种面向对象编程的重要特性。它允许一个类(子类)继承另一个类(父类)的属性和方法,从而使得子类可以重复利用父类的代码,减少了代码的重复性和冗余性。与此同时,Java中的多态又使得代码更加灵活,可以根据不同的类和对象来调用相同的方法,这种特性使得Java的代码具有更好的可扩展性和可维护性。 继承的基本概念 在J…

    other 2023年6月26日
    00
  • Java List移除相应元素的超简洁写法分享

    当我们需要在Java List中移除一个或多个指定元素时,通常的方法是使用for循环遍历列表并逐个删除,这样的代码量比较大,容易出错,而且效率不高。但是,有一种超简洁的写法可以帮助我们轻松实现这个功能。接下来,我将为大家详细讲解这个方法的使用步骤。 1. 基本语法 这种超简洁的写法使用 Java 8 中引入的流(Stream)和 Lambda 表达式的特性,…

    other 2023年6月27日
    00
  • 在vue中使用css modules替代scroped的方法

    在Vue中使用CSS Modules替代Scoped的方法 说明 在Vue项目中,我们通常使用Scoped CSS来确保样式仅适用于单个组件。然而,有时候我们可能需要更灵活的方式来管理组件的样式,这时可以考虑使用CSS Modules。CSS Modules能够为每个样式文件生成一个唯一的类名,从而避免样式冲突,并提供更好的可重用性。 以下是在Vue中使用C…

    other 2023年6月28日
    00
  • Android RecyclerView设置下拉刷新的实现方法

    当在Android应用中使用RecyclerView时,可以通过添加下拉刷新功能来提升用户体验。下面是实现Android RecyclerView下拉刷新的完整攻略: 添加依赖库:首先,在项目的build.gradle文件中添加RecyclerView和SwipeRefreshLayout的依赖库。在dependencies块中添加以下代码: impleme…

    other 2023年9月7日
    00
  • JavaScript如何借用构造函数继承

    JavaScript中可以使用构造函数来实现继承的方式很多,其中一种方式就是借用构造函数。这种方式可以让一个对象的构造函数成为另一个对象的构造函数,并且可以在借用的过程中传递参数。下面是借用构造函数继承的完整攻略。 1. 借用构造函数继承的原理 借用构造函数继承的原理就是在子类的构造函数中调用父类的构造函数,然后将父类的属性和方法都复制到子类中。这样,子类就…

    other 2023年6月26日
    00
  • echart中的itemstyle如何设置

    以下是ECharts中的itemStyle如何设置的完整攻略: 什么是itemStyle? itemStyle是ECharts中的一个配置项,用于设置表中各种图形元素的样式,包括颜色边框、阴影、透明度等。 步骤1:设置全局样式 可以使用ECharts的setOption方法设置全局样式,例如: option = { // 设置全局样式 textStyle: …

    other 2023年5月6日
    00
合作推广
合作推广
分享本页
返回顶部