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日

相关文章

  • Golang实现带优先级的select

    Golang实现带优先级的select攻略 在Golang中,select语句用于在多个通道上执行非阻塞的操作。然而,Golang的select语句默认是平等的,即在多个通道上等待时,每个通道有相同的机会被选择。但是,有时候我们希望某些通道具有更高的优先级,即在选择通道时它们有更大的几率被选中。下面是Golang实现带优先级的select的完整攻略。 步骤1…

    other 2023年6月28日
    00
  • 详解Java如何使用注解来配置Spring容器

    Java注解是一种实现反射机制的标记,使用注解可以将特定信息与程序中的元素进行关联,更加灵活地配置系统。在Spring框架中使用注解可以方便地配置Spring容器。 下面是详细讲解Java如何使用注解来配置Spring容器的完整攻略: 1. 添加注解配置文件 Spring框架推荐我们将注解配置信息放在单独的Java类中,作为Spring的配置文件,以@Con…

    other 2023年6月27日
    00
  • update中实现子查询

    以下是关于在update中实现子查询的完整攻略,包括基本介绍、实现步骤、示例说明等内容。 1. 基本介绍 在SQL中,子查询是一种嵌套在其他查询中的查询语句。在update语句中,我们可以使用子查询来更新表中的数据。子查询可以返回一个或多个值,这些值可以用于更新中的数据。在使用子查询时,我们需要注意子查询的语法和使用方法,以便正确实现update中的子查询。…

    other 2023年5月10日
    00
  • Foobar2000如何更改窗口布局?Foobar2000更改窗口布局教程

    Foobar2000如何更改窗口布局? Foobar2000是一款流行的音乐播放器,它允许用户自定义窗口布局以满足个人需求。下面是更改Foobar2000窗口布局的完整攻略。 步骤1:打开Foobar2000首选项 首先,打开Foobar2000音乐播放器。然后,点击菜单栏上的“文件”选项,选择“首选项”。 步骤2:选择布局选项 在首选项窗口中,点击左侧导航…

    other 2023年9月5日
    00
  • 深入解析Android中View创建的全过程

    深入解析Android中View创建的全过程 在Android中,View的创建过程是一个相对复杂的过程,涉及到多个环节和步骤。下面将详细讲解View创建的全过程,并提供两个示例说明。 1. 布局文件解析 View的创建过程通常是从布局文件开始的。Android使用XML文件来描述布局,通过解析布局文件可以获取到View的层次结构和属性信息。 示例1:假设我…

    other 2023年8月21日
    00
  • JS中this上下文对象使用方式

    JS中的this代表当前函数的执行环境,即当前函数的上下文对象。一个函数的this值是在函数调用时确定的,也就是在运行时动态绑定的。因此,可以灵活地根据调用函数的不同,来指定this的值和作用范围。本文将为您详细讲解JS中this上下文对象的使用方式,包括常规函数和箭头函数,同时提供相应的示例说明。 常规函数中的this 在JS中,函数的this值可以通过4…

    other 2023年6月26日
    00
  • 半小时通透Java的泛型

    半小时通透Java的泛型 Java中的泛型可以在编译时期强制类型检查,提高代码的可读性和可维护性。本篇文章将通过以下几个方面入门讲解Java的泛型。 为何需要泛型 Java是一门强类型语言,变量在声明时就必须指定数据类型。但是,有些场景下程序员无法确定类型,例如:在集合类中存储对象时,使用Object类型无法满足需求,会导致类型转换错误和代码可读性差。针对这…

    other 2023年6月26日
    00
  • vivoy93s如何查看内存?

    Vivo Y93s 如何查看内存 Vivo Y93s 是一款智能手机,可以通过以下步骤查看其内存信息: 打开手机设置:在主屏幕上找到并点击 \”设置\” 图标。 进入存储设置:在设置菜单中,向下滚动并点击 \”存储\” 选项。 查看内存信息:在存储设置页面,您将看到手机的存储使用情况。其中包括内部存储和外部存储(如果有的话)。点击 \”内部存储\” 选项以查…

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