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日

相关文章

  • .httacces文件的配置技巧

    下面是“.htaccess文件的配置技巧”的完整攻略: 什么是“.htaccess”文件? “.htaccess”是 Apache Web服务器上存放在网站根目录下的隐藏文件,它允许用户在不修改服务器配置文件的情况下对网站进行一些配置和控制访问。这个文件里面的指令可以用来精确控制Web服务器的行为,例如重写URL、防止目录遍历攻击、设置用户身份验证等。 如何…

    other 2023年6月25日
    00
  • 守望先锋自定义玩法快跑吧小姑娘怎么设置_快跑吧小姑娘玩法攻略

    守望先锋自定义玩法快跑吧小姑娘怎么设置 快跑吧小姑娘是守望先锋中一种自定义玩法,玩家可以通过自定义游戏来体验这种玩法。本文将详细介绍如何设置快跑吧小姑娘的规则和玩法。 快跑吧小姑娘玩法规则 快跑吧小姑娘玩法的规则是玩家需要在规定时间内通过各种障碍物,到达终点。如果在规定时间内没有到达终点,就算游戏失败。玩家可以设置多种障碍物和终点,来丰富玩法。 设置快跑吧小…

    other 2023年6月25日
    00
  • 开发人员选项怎么关闭?安卓手机开发人员选项功能隐藏方法介绍

    关闭安卓手机开发人员选项的方法 在安卓手机中,每个用户都可以访问到开发人员选项。这些选项通常是开发人员用于测试和调节自己的应用程序的。然而,对于一般用户来说,这些选项可能会增加一些安全风险或其他风险。所以,关闭安卓手机开发人员选项是保护您的手机的一个好方法。 步骤1:打开设置 首先,在安卓手机的主屏幕上,点击“设置”图标,进入设置界面。 步骤2:进入开发人员…

    other 2023年6月26日
    00
  • PHP的可变变量名的使用方法分享

    在PHP中,可变变量名是一种特殊的语法,允许使用变量的值作为另一个变量的名称。这种功能可以在特定情况下非常有用。下面是一个详细的攻略,帮助您了解如何使用PHP的可变变量名。 可变变量名的使用方法 可变变量名使用双美元符号($$)来表示。在使用可变变量名时,首先需要定义一个变量,然后使用另一个变量的值作为该变量的名称。 以下是使用可变变量名的示例: 示例1:动…

    other 2023年8月8日
    00
  • Lucene实现索引和查询的实例讲解

    Lucene实现索引和查询的实例讲解 Lucene是一个开源的全文搜索引擎库,它提供了强大的索引和查询功能。本攻略将详细讲解如何使用Lucene实现索引和查询的过程。 步骤1:添加Lucene依赖 首先,我们需要在项目中添加Lucene的依赖。可以通过Maven或Gradle来管理依赖。以下是使用Maven的示例: <dependency> &l…

    other 2023年10月13日
    00
  • torrent是什么文件?怎么打开?

    Torrent是什么文件?怎么打开? Torrent是一种用于下载和共享文件的协议和文件类型。它允许用户通过将文件分成小块并从多个来源下载这些块来实现高速下载。Torrent文件本身是一个包含元数据的小文件,其中包含了指向实际文件的链接、文件大小、文件名和其他相关信息。 要打开Torrent文件并开始下载文件,您需要遵循以下步骤: 选择Torrent客户端软…

    other 2023年8月5日
    00
  • sql一条数据拆分成多条

    SQL一条数据拆分成多条的完整攻略 在SQL中,有时需要将一条数据拆分成多条数据,以便更好地处理和管理。本文将介绍SQL一条数据拆分成多条的完整攻略,包括定义、方法和两个示例说明。 定义 一条数据拆分成多条,是指将一条数据按照某种规则拆分成多条数据。拆分后的数据可以存储到同一个表中,也可以存储到不同的表中。拆分后的数据可以更好地处理和管理,提数据的可用性和性…

    other 2023年5月9日
    00
  • C语言菜鸟基础教程之求1到100的和

    下面是关于“C语言菜鸟基础教程之求1到100的和”的详细攻略: 一、题目描述 本题目要求使用C语言求出1到100的和。 二、解题思路 本题可以使用循环语句来实现,这里我们以for循环为例: 首先定义一个变量sum,用于存储1到100的和,初始值为0。 使用for循环,循环变量i从1到100。 在每次循环中,将i加到sum中。 循环结束后,sum中存储的即为1…

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