Java实现基于TCP的通讯程序实例解析

yizhihongxing

Java实现基于TCP的通讯程序实例解析

本文将详细讲解如何使用Java实现基于TCP的通讯程序。

环境准备

首先,你需要安装Java开发环境(JDK或者OpenJDK)。建议选择较新版本,以确保兼容性和安全性。

代码实现

1. 服务端代码实现

服务端首先需要创建一个ServerSocket对象,指定服务器的端口号。然后通过ServerSocket对象的accept()方法等待客户端的连接。一旦有连接请求,accept()方法就会返回一个Socket对象,服务端就可以通过Socket对象与客户端进行通讯。

以下是服务端的代码示例:

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

public class TCPServer {

    public static void main(String[] args) throws IOException {

        // 创建一个ServerSocket对象
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务端已启动,等待客户端连接...");

        // 等待客户端的连接
        Socket socket = serverSocket.accept();
        System.out.println("客户端已连接!");

        // 接收客户端发送的数据
        InputStream is = socket.getInputStream();
        byte[] buffer = new byte[1024];
        int len;
        len = is.read(buffer);
        String data = new String(buffer, 0, len);
        System.out.println("客户端消息:" + data);

        // 向客户端发送响应数据
        OutputStream os = socket.getOutputStream();
        String responseData = "Hello, Client!";
        os.write(responseData.getBytes());
        System.out.println("服务端已向客户端发送:" + responseData);

        // 关闭资源
        os.close();
        is.close();
        socket.close();
        serverSocket.close();
    }
}

2. 客户端代码实现

客户端需要先创建一个Socket对象,并指定服务端的IP地址和端口号。然后通过Socket对象与服务端进行通讯。

以下是客户端的代码示例:

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

public class TCPClient {

    public static void main(String[] args) throws IOException {

        // 创建一个Socket对象,并指定服务端的IP地址和端口号
        Socket socket = new Socket("127.0.0.1", 8888);
        System.out.println("已连接到服务器!");

        // 向服务端发送数据
        OutputStream os = socket.getOutputStream();
        String data = "Hello, Server!";
        os.write(data.getBytes());
        System.out.println("客户端已发送消息:" + data);

        // 接收服务端的响应数据
        InputStream is = socket.getInputStream();
        byte[] buffer = new byte[1024];
        int len;
        len = is.read(buffer);
        String responseData = new String(buffer, 0, len);
        System.out.println("服务端消息:" + responseData);

        // 关闭资源
        is.close();
        os.close();
        socket.close();
    }
}

示例说明

示例一:发送文件

以下示例演示了如何使用Java实现向服务端发送文件:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TCPClient {

    public static void main(String[] args) throws IOException {

        Socket socket = new Socket("127.0.0.1", 8888);
        File file = new File("example.txt");

        // 向服务端发送文件
        OutputStream os = socket.getOutputStream();
        FileInputStream fis = new FileInputStream(file);
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }
        System.out.println("文件发送成功!");

        // 关闭资源
        fis.close();
        os.close();
        socket.close();
    }
}

public class TCPServer {

    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = new ServerSocket(8888);
        Socket accept = serverSocket.accept();

        // 接收文件
        InputStream is = accept.getInputStream();
        File file = new File("example.txt");
        FileOutputStream fos = new FileOutputStream(file);
        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }
        System.out.println("文件接收成功!");

        // 关闭资源
        fos.close();
        is.close();
        accept.close();
        serverSocket.close();
    }
}

示例二:多线程服务端

以下示例演示了如何使用Java实现多线程的服务端,可以同时处理多个客户端的连接请求。

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

public class TCPServer {

    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务端已启动,等待客户端连接...");

        while (true) {
            // 等待客户端的连接
            Socket accept = serverSocket.accept();
            System.out.println("客户端已连接!");

            // 新建线程处理客户端请求
            new Thread(() -> {
                try {
                    // 接收客户端发送的数据
                    InputStream is = accept.getInputStream();
                    byte[] buffer = new byte[1024];
                    int len;
                    len = is.read(buffer);
                    String data = new String(buffer, 0, len);
                    System.out.println("客户端消息:" + data);

                    // 向客户端发送响应数据
                    OutputStream os = accept.getOutputStream();
                    String responseData = "Hello, Client!";
                    os.write(responseData.getBytes());
                    System.out.println("服务端已向客户端发送:" + responseData);

                    // 关闭资源
                    os.close();
                    is.close();
                    accept.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现基于TCP的通讯程序实例解析 - Python技术站

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

相关文章

  • JQuery操作三大控件(下拉,单选,复选)的方法

    JQuery是一种流行的JavaScript库,提供了丰富的API和方法来简化JavaScript编程。在Web开发中,下拉框、单选框和复选框是非常常见的控件,JQuery提供了方便的方法来操作这些控件。以下是“JQuery操作三大控件(下拉,单选,复选)的方法”完整攻略: 操作下拉框 获取下拉框选中的值 可以使用 .val() 方法获取下拉框当前选中的值。…

    other 2023年6月27日
    00
  • windows下安装redis客户端

    Windows下安装Redis客户端 Redis是一个开源内存数据库,也是一个键值存储数据库,它支持多种数据结构类型,并且适合于高速读写的场景。Redis的客户端通常是通过REDIS协议来进行连接的。 本文将介绍如何在Windows系统下安装Redis客户端,并通过命令行使用Redis客户端。 步骤一:下载Redis客户端 在Redis官方下载站(https…

    其他 2023年3月29日
    00
  • gvim改变字体大小的命令

    gvim改变字体大小的命令 gvim是一个非常常用的文本编辑器,而改变字体大小是在使用编辑器时经常需要调整的一项设置。在gvim中,我们可以通过几个简单的命令来更改字体大小,本文将为大家介绍这些命令。 改变整个窗口的字体大小 如果你希望改变整个窗口中的字体大小,可以使用以下命令: :set guifont=字体:大小 其中,字体是你想要使用的字体名称,大小是…

    其他 2023年3月28日
    00
  • 辐射4应用程序启动异常0xc000007b错误的解决方法

    标准的markdown格式文本 在本篇文章中,我将详细介绍如何解决“辐射4应用程序启动异常0xc000007b错误”的问题,同时也会提供两条示例说明,方便大家更好地理解。 问题分析 首先,0xc000007b错误是Windows系统特有的错误码,表示“应用程序无法启动,可能是因为系统相关的依赖文件未能正确加载或者缺失”。而辐射4应用程序启动异常,可能有以下原…

    other 2023年6月25日
    00
  • windows下mongodb集群搭建

    在Windows下搭建MongoDB集群需要进行以下步骤: 下载MongoDB安装包并安装 配置MongoDB的配置文件 启动MongoDB节点 初始化MongoDB集群 添加MongoDB节点 验证MongoDB集群是否正常工作 下面将详细介绍每个步骤,并提供两个示例说明。 1. 下载MongoDB安装包并安装 首先需要从MongoDB官网下载Window…

    other 2023年5月5日
    00
  • latex如何将文字标红

    当然,我可以为您提供有关“LaTeX如何将文字标红”的完整攻略,以下是详细说明: LaTeX如何将文字标红 在LaTeX中,可以使用\textcolor命令将文字标红。以下是详细步骤: 导入xcolor宏包 在LaTeX代码中,需要导入xcolor宏包。 latex \usepackage{xcolor} 使用\textcolor命令 在LaTeX代码中,可…

    other 2023年5月7日
    00
  • Vue+ElementUI 中级联选择器Bug问题的解决

    下面是详细的讲解“Vue+ElementUI 中级联选择器Bug问题的解决”的攻略: 问题描述 在使用Vue+ElementUI的级联选择器时,如果选中一个子级,父级的选择器就会被清空。 Bug分析 原因是因为使用Vue时,子组件变更会逐级向上传递,会触发父组件的更新,导致父组件的数据被清空。 解决方案 在使用级联选择器时,我们需要在父组件设置子组件的值时,…

    other 2023年6月27日
    00
  • shell通过正则匹配ip地址实例代码

    当使用Shell脚本编写时,可以使用正则表达式来匹配IP地址。下面是一个完整的攻略,包含了两个示例说明。 步骤1:编写正则表达式 首先,我们需要编写一个正则表达式来匹配IP地址。IP地址由四个数字组成,每个数字的范围是0到255。以下是一个匹配IP地址的正则表达式示例: ^([0-9]{1,3}\\.){3}[0-9]{1,3}$ 步骤2:编写Shell脚本…

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