Java基于socket实现的客户端和服务端通信功能完整实例

Java基于socket实现的客户端和服务端通信功能完整实例

什么是Socket

Socket是一个抽象的概念,可以理解为“插座”,在计算机网络中,两个程序通过Socket在网络上互相通信。Socket提供了程序与网络之间的通信接口。

Java中的Socket

Java的Socket是基于TCP/IP协议实现的。在Java中,可以通过Socket类和ServerSocket类来创建客户端和服务器端的Socket。

创建服务器端Socket(ServerSocket)

服务器端Socket创建时需要指定端口号(port)。当客户端需要与服务器进行通信时,需要连接这个端口号。

下面代码创建了一个ServerSocket,并在端口号8080上监听客户端的请求:

try {
    // 创建ServerSocket对象,并指定监听端口号
    ServerSocket serverSocket = new ServerSocket(8080);
    //等待请求的到来,并且返回一个Socket对象,创建一个线程处理
    while(true){//多次处理请求
        Socket socket = serverSocket.accept();//等待客户端访问
        new Thread(new ServerThread(socket)).start();//启动线程处理请求
    }
} catch (IOException e) {
    e.printStackTrace();
}

创建客户端Socket(Socket)

客户端的Socket创建时需要指定服务器端的IP和端口号。当客户端需要与服务器进行通信时,需要通过该IP和端口号连接服务器。

下面代码创建了一个Socket,并连接服务器上的IP地址为127.0.0.1,端口号为8080的服务器:

try{
    // 创建Socket对象,并指定服务器的IP和端口号
    Socket socket = new Socket("127.0.0.1", 8080);
    //向服务器发送请求
    PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
    printWriter.println("This is a client message!");
    //接收服务器的响应
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String line = bufferedReader.readLine();
    System.out.println("received from server:" + line);
    //关闭各种连接
    bufferedReader.close();
    printWriter.close();
    socket.close();
} catch(Exception e) {
    e.printStackTrace();
}

完整实例

下面是一个Java基于Socket实现的客户端(Client)和服务端(Server)通信的完整实例。

客户端发送字符串消息到服务器端的示例代码:

public class Client {

    public static void main(String[] args) {
        String host = "127.0.0.1";
        int port = 8000;
        try{
            // 创建Socket对象,并指定服务器的IP和端口号
            Socket socket = new Socket(host, port);
            //向服务器发送请求
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
            String message = "hello,world!";
            printWriter.println(message);
            // 接收来自服务器的回复
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println("received from server: " + bufferedReader.readLine());

            //关闭各种连接
            bufferedReader.close();
            printWriter.close();
            socket.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

服务端接收字符串消息并回复到客户端的示例代码:

public class Server {

    public static void main(String[] args) {
        int port = 8000;
        try {
            // 创建ServerSocket对象,并指定监听端口号
            ServerSocket serverSocket = new ServerSocket(port);
            while (true) {// 多次处理请求
                Socket socket = serverSocket.accept();//等待客户端访问
                //获取客户端的信息(IP、port)
                InetSocketAddress clientInfo = (InetSocketAddress) socket.getRemoteSocketAddress();
                String clientIP = clientInfo.getAddress().getHostAddress();
                int clientPort = clientInfo.getPort();
                System.out.println("accept client:"
                        + clientIP + ":" + clientPort);

                // 用线程池处理请求,提高服务器性能
                new Thread(new ServerHandler(socket)).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static class ServerHandler implements Runnable {

        private Socket socket;

        public ServerHandler(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            BufferedReader bufferedReader = null;
            PrintWriter printWriter = null;
            try {
                // 接收客户端发送的请求
                bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String message = bufferedReader.readLine();
                System.out.println("received from client: " + message);

                //向客户端发送回复
                printWriter = new PrintWriter(socket.getOutputStream(), true);
                String replyMessage = "reply-" + message;
                printWriter.println(replyMessage);

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //关闭各种连接
                try {
                    bufferedReader.close();
                    printWriter.close();
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

上面的例子就是一个完整的Java基于Socket实现的客户端-服务器端通信功能的示例,可以通过该例子进一步深入理解Socket编程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java基于socket实现的客户端和服务端通信功能完整实例 - Python技术站

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

相关文章

  • mongodb中的group

    以下是详细讲解“mongodb中的group的完整攻略,过程中至少包含两条示例说明: MongoDB中的group MongoDB是一个开源的文档数据库,支持多种查询。其中,group操作可以对集合中的文档进行分组,并对每个分组进行聚合操作。本攻略将介绍MongoDB中的group操作,包括基本概念、使用方法和两个示例说明。 基本概念 在开始使用MongoD…

    other 2023年5月10日
    00
  • PowerToys首个Win10预览版发布 重启的Windows工具集

    PowerToys首个Win10预览版发布 重启的Windows工具集 微软 PowerToys 是一组免费的 Windows 工具,可以增强 Windows 系统的使用体验,最近其首个 Win10 预览版也已经发布。本文将为大家介绍 PowerToys 的主要功能及使用方法。 功能介绍 PowerToys 有多项功能,如下: FancyZones 该工具可…

    other 2023年6月27日
    00
  • IIS7.5提示无法写入配置文件web.config的解决方法

    问题描述: 当在IIS7.5的管理控制台中尝试更改Web站点的配置,或者在托管Web应用程序的IIS的Web服务器上运行的托管Web应用程序尝试将更改写入其Web.config文件时可能会出现以下错误消息: “不能写入配置文件web.config,请检查它是否已经锁定或只读。” 出现此错误消息是因为IIS 7.5使用了新的应用程序池身份验证模型,称为“托管服…

    other 2023年6月25日
    00
  • perl 文件操作总结

    Perl 文件操作总结 文件句柄 在 Perl 中,文件句柄用于与外部文件进行交互。这包括打开、读取和关闭文件。 打开文件 我们可以使用 open 函数打开一个外部文件,并将其指定为一个文件句柄。语法如下: open FILEHANDLE, EXPR 其中 FILEHANDLE 是您打算使用的文件句柄名称,EXPR 是包含您要打开的文件的路径和名称的字符串表…

    other 2023年6月27日
    00
  • icloud内存大小怎么看? icloud内存使用情况查询教程

    iCloud内存大小怎么看? iCloud是苹果公司提供的云存储服务,用于存储和同步用户的数据。要查看iCloud的内存大小,可以按照以下步骤进行操作: 打开设置:在iOS设备上,点击主屏幕上的“设置”图标,进入设置界面。 选择你的Apple ID:在设置界面中,点击顶部显示的你的Apple ID,进入Apple ID设置页面。 进入iCloud设置:在Ap…

    other 2023年8月1日
    00
  • 解释执行和编译执行的区别?

    当我们编写代码的时候,我们需要将代码转换成计算机可以理解和执行的语言,那么将代码转换成可执行指令的过程,就可以分为两种方式,一种是通过编译执行,另一种是通过解释执行。 编译执行 编译执行是指在代码执行前,先进行整个程序的编译,把程序源代码全部编译成计算机可执行的代码,这个可执行文件可以被多次运行,因此编译执行的好处在于它可以更快地执行代码。其一次性的编译过程…

    other 2023年6月26日
    00
  • Spring中实例化bean的四种方式详解

    下面我将为你详细讲解 Spring 中实例化 bean 的四种方式。 方式一:使用构造器实例化bean 说明: 在 Spring 容器初始化时,重新创建并实例化一个新的对象,该对象的构造函数会被调用,其参数值来自于<constructor-arg> 或者 spring:arg 传入的值。 示例1: 这是一个通过构造器实例化bean的简单示例,代码…

    other 2023年6月26日
    00
  • 详解Linux系统下PXE服务器的部署过程

    下面是详解Linux系统下PXE服务器的部署过程的完整攻略。 一、PXE服务器简介 PXE(Preboot eXecution Environment)是一种基于网络的远程启动技术,能够在网卡启动的基础上,通过网络启动计算机。PXE服务器就是支持PXE的服务器,主要功能是为客户端提供网络启动所需要的相关数据和服务。 二、PXE服务器的部署过程 1.安装DHC…

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