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日

相关文章

  • python 中的 super详解

    Python 中的 super 详解 Python 的 super 函数是一种很特殊和重要的方法,它允许派生类调用父类的方法、属性等,本文将详细讲解 super 函数的用法及其机制。 什么是 super 函数 super 函数是 Python 中的一个内置函数,它常用于在派生类中调用其基类的方法或属性。通过 super 函数,我们可以更加方便地实现派生类与基…

    other 2023年6月27日
    00
  • delphi中tstringlist类常用属性方法详解

    Delphi中TStringList类常用属性方法详解 Delphi中的TStringList类是一个常用的字符串列表类,它封装了很多关于字符串列表的常用操作。在本文中,我们将详细介绍TStringList类的常用属性和方法,以便于在Delphi程序开发中灵活和高效地使用它。 属性 Capacity 该属性用于设置或获取TStringList对象的容量,即该…

    其他 2023年3月28日
    00
  • vue+element-ui集成随机验证码+用户名+密码的form表单验证功能

    下面是关于如何实现“vue+element-ui集成随机验证码+用户名+密码的form表单验证功能”的完整攻略。 确定所需组件 首先我们需要引入vue和element-ui组件库,以及一个用于生成随机验证码的插件,常用的有vue-verify-plugin等。 <template> <div class="form-contain…

    other 2023年6月27日
    00
  • centos7安装composer

    以下是关于“CentOS 7安装Composer”的完整攻略,包括安装Composer的方法、配置Composer的方法和两个示例等。 安装Composer CentOS 上装Composer需要先安装PHP和相关扩展,然后下载Composer安装脚本并运行。 安装PHP和相关扩展 sudo yum install php php-cli php-commo…

    other 2023年5月7日
    00
  • flex与js交互浅析

    flex与js交互浅析 引言 Flex布局是我们日常网页开发中常用的布局方式,常常用来实现页面结构、响应式布局等效果。而JavaScript是前端开发的重要一环,我们经常会在页面中利用JS来实现一些交互效果。本文旨在说明Flex布局与JS交互的一些技巧和问题。 Flex布局的基本概念和用法 Flex布局是一种新的布局方式,相较传统的盒模型布局,具有优雅的语法…

    其他 2023年3月28日
    00
  • Java单元测试工具之JUnit的使用

    Java单元测试工具之JUnit的使用攻略 JUnit是Java中最常用的单元测试框架之一。它提供了一组用于编写和运行单元测试的类和注解。以下是使用JUnit进行单元测试的详细攻略: 步骤1:导入JUnit依赖 首先,您需要在项目中导入JUnit的依赖。可以通过以下方式在Maven项目中添加JUnit依赖: <dependency> <gr…

    other 2023年10月17日
    00
  • 网线ip总是冲突怎么办 网线连上后提示IP地址冲突的解决方法

    网线IP总是冲突的解决方法攻略 当网线连接上后提示IP地址冲突时,这可能是因为多个设备在同一网络上使用了相同的IP地址。为了解决这个问题,你可以采取以下步骤: 步骤一:确认IP地址冲突 首先,你需要确认是否真的存在IP地址冲突。你可以按照以下步骤进行确认: 打开命令提示符(Windows)或终端(Mac和Linux)。 输入命令 ipconfig(Windo…

    other 2023年7月30日
    00
  • ipv6怎么设置? ipv6的开启方法

    IPv6设置攻略 1. 检查设备和网络支持 首先,确保你的设备和网络支持IPv6。大多数现代操作系统和路由器都支持IPv6,但仍然有一些旧设备可能不支持。你可以在设备的说明书或官方网站上查找相关信息。 2. 检查网络提供商支持 确认你的网络提供商是否支持IPv6。有些网络提供商可能仅提供IPv4连接,或者需要你联系他们以获取IPv6支持。如果你的网络提供商不…

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