教你怎么用java实现客户端与服务器一问一答

如何用Java实现客户端与服务器一问一答

1. 建立TCP连接

  1. 客户端调用Socket类的构造方法建立与服务器端的连接。在构造方法中需要传入服务器端的IP地址和端口号,示例代码如下:

java
String serverHost = "127.0.0.1"; // 服务器IP地址
int serverPort = 8888; // 服务器端口号
Socket socket = null;
try {
socket = new Socket(serverHost, serverPort);
} catch (IOException e) {
e.printStackTrace();
}

  1. 服务器端通过调用ServerSocket类的构造方法监听指定的端口号。示例代码如下:

java
int port = 8888; // 监听端口号
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}

2. 通过Input/OutputStream进行读写操作

在建立了TCP连接之后,客户端与服务器端可以通过流对象进行数据的传输。

  1. 客户端可以使用socket对象的getOutputStream()方法获取输出流,通过输出流将数据发送给服务器端。示例代码如下:

java
OutputStream outputStream = socket.getOutputStream();
String message = "Hello, server!";
outputStream.write(message.getBytes());

  1. 服务器端可以使用Socket类的getInputStream()方法获取输入流,通过输入流获取客户端发送的数据。示例代码如下:

java
InputStream inputStream;
try {
inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) {
sb.append(new String(bytes, 0, len, StandardCharsets.UTF_8));
}
System.out.println("Message from client: " + sb);
} catch (IOException e) {
e.printStackTrace();
}

3. 示例1:客户端发送消息给服务端

在这个示例中,客户端将用户输入的字符串发送给服务器,服务器端将收到的字符串原样发送回客户端。

客户端代码

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class Client {

    public static void main(String[] args) {
        String serverHost = "127.0.0.1";
        int serverPort = 8888;
        Socket socket = null;
        try {
            socket = new Socket(serverHost, serverPort);
            System.out.println("Connect to server: " + serverHost + ":" + serverPort);
            OutputStream outputStream = socket.getOutputStream();
            Scanner scanner = new Scanner(System.in);
            while (true) {
                System.out.print("Input message: ");
                String message = scanner.nextLine();
                outputStream.write(message.getBytes(StandardCharsets.UTF_8));
                if ("bye".equalsIgnoreCase(message)) {
                    break;
                }
            }
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

服务器端代码

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class Server {

    public static void main(String[] args) {
        int port = 8888;
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(port);
            System.out.println("Server listening on port " + port);
            while (true) {
                Socket socket = serverSocket.accept();
                System.out.println("New connection accepted: " + socket.getInetAddress() + ":" + socket.getPort());
                InputStream inputStream = socket.getInputStream();
                OutputStream outputStream = socket.getOutputStream();
                byte[] bytes = new byte[1024];
                int len;
                while ((len = inputStream.read(bytes)) != -1) {
                    String message = new String(bytes, 0, len, StandardCharsets.UTF_8);
                    System.out.println("Message from client: " + message);
                    outputStream.write(message.getBytes(StandardCharsets.UTF_8));
                }
                inputStream.close();
                outputStream.close();
                socket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (serverSocket != null) {
                    serverSocket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

4. 示例2:服务器向客户端发送消息

在这个示例中,客户端连接服务器后,服务器向客户端发送消息。

客户端代码

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class Client {

    public static void main(String[] args) {
        String serverHost = "127.0.0.1";
        int serverPort = 8888;
        Socket socket = null;
        try {
            socket = new Socket(serverHost, serverPort);
            System.out.println("Connect to server: " + serverHost + ":" + serverPort);
            InputStream inputStream = socket.getInputStream();
            byte[] bytes = new byte[1024];
            int len = inputStream.read(bytes);
            String message = new String(bytes, 0, len, StandardCharsets.UTF_8);
            System.out.println("Message from server: " + message);
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

服务器端代码

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class Server {

    public static void main(String[] args) {
        int port = 8888;
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(port);
            System.out.println("Server listening on port " + port);
            while (true) {
                Socket socket = serverSocket.accept();
                System.out.println("New connection accepted: " + socket.getInetAddress() + ":" + socket.getPort());
                OutputStream outputStream = socket.getOutputStream();
                String message = "Welcome to the server!";
                outputStream.write(message.getBytes(StandardCharsets.UTF_8));
                outputStream.close();
                socket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (serverSocket != null) {
                    serverSocket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

以上就是用Java实现客户端与服务器一问一答的教程了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:教你怎么用java实现客户端与服务器一问一答 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java高级面试题小结

    让我给大家详细讲解“Java高级面试题小结”的完整攻略。 简介 “Java高级面试题小结”是一篇系统总结Java面试中常出现的高级难点问题以及解决方案的文章。该文主要分为以下几个部分: Java高级面试题分类 Java高级面试题解析及解决方案 Java高级面试题分类 Java高级面试题主要分为以下几个类别: 多线程 并发集合 垃圾回收算法 反射机制 设计模式…

    Java 2023年5月26日
    00
  • 深入浅出Java中重试机制的多种方式

    深入浅出Java中重试机制的多种方式 在开发中,有时会需要对某些操作进行多次尝试,以增加操作的稳定性和可靠性。这时,使用重试机制可以很好地解决这一问题。本文将详细介绍Java中重试机制的多种实现方式。 1. 基于while循环的重试机制 最简单的重试机制就是在while循环中执行某个操作,并在某些限定条件下进行多次尝试。例如以下示例代码: int count…

    Java 2023年5月27日
    00
  • Adobe Acrobat DC怎么使用?Adobe Acrobat DC下载安装图文教程

    如果想要使用 Adobe Acrobat DC 进行 PDF 文件的编辑和管理,可以按照以下步骤进行下载、安装和使用: 下载安装 Adobe Acrobat DC 打开 Adobe 官网(https://www.adobe.com/),选择“Acrobat”选项,并点击“开始免费试用”或“购买”按钮。 如果选择免费试用,则需要输入个人信息和支付信息,之后会获…

    Java 2023年6月15日
    00
  • 记一次Maven项目改造成SpringBoot项目的过程实践

    针对您的问题,我将按照以下步骤进行详细讲解: 1. 创建Spring Boot项目 首先,我们需要创建一个Spring Boot项目。可以在Spring Initializr上选择相应的配置选项,添加所需的依赖,然后点击“Generate”按钮生成项目。 2. 导入原有项目 在创建好的Spring Boot项目中,我们需要将原有的Maven项目代码导入。一般…

    Java 2023年5月19日
    00
  • 详解java 对象锁与类锁

    我们来详细讲解一下 Java 对象锁和类锁。 什么是对象锁? 在 Java 中,每一个对象都有一个锁,也就是监视器锁(Monitor Lock)。当一个线程访问某个对象的 synchronized 方法或 synchronized 块时,这个线程会试图获得这个对象的锁。获得对象锁后,这个线程才能进入 synchronized 方法或 synchronized…

    Java 2023年5月26日
    00
  • Spring Data JPA注解Entity使用示例详解

    Spring Data JPA注解Entity使用示例详解 简介 Spring Data JPA为基于JPA编程提供了一种简单的方法。此模块的主要目标是使基于Spring的应用程序更容易使用JPA,并使使用JPA与Spring的整合更平滑。在这篇文章中,我们将会介绍Spring Data JPA注解Entity的使用方法。 Entity概述 @Entity注…

    Java 2023年5月20日
    00
  • java乐观锁原理与实现案例分析

    Java乐观锁原理与实现案例分析 什么是乐观锁? 乐观锁是一种轻量级锁,它假定不会有其它线程修改共享资源,因此,不需要加锁,只要在最后提交时检查是否有其它线程修改了此数据就好了。 如何实现乐观锁? 实现乐观锁的关键是要保证数据提交时的原子性,通常有两种方式来实现: 基于版本号的乐观锁:通过给数据增加一个版本号,每次操作都需要比较版本号是否一致,只有版本号一致…

    Java 2023年5月18日
    00
  • Java实战之实现一个好用的MybatisPlus代码生成器

    首先需要明确的是,MybatisPlus是Mybatis的一个增强版本,能够大大提高开发效率。而MybatisPlus代码生成器能够自动生成基本的CRUD操作,这对于快速搭建项目是非常有帮助的。下面我将详细讲解如何实现一个好用的MybatisPlus代码生成器。 准备工作 添加MybatisPlus及其依赖到项目中。 创建数据库及数据表。(以下示例中,我们使…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部