教你怎么用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实现客户端与服务器一问一答的教程了。

阅读剩余 81%

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

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

相关文章

  • JDBC中Statement和Preparement的使用讲解

    当使用JDBC连接数据库时,通常使用Statement和Preparement来执行SQL语句。本攻略将详细讲解它们的使用。 Statement Statement是用于执行静态SQL语句的对象。它适用于只需要执行简单的SQL语句的场景。下面是Statement的使用示例: String sql = "SELECT * FROM users WHE…

    Java 2023年6月16日
    00
  • Spring Boot Reactor 整合 Resilience4j详析

    一、Spring Boot Reactor 整合 Resilience4j Spring Boot是基于Spring框架的快速开发框架,是Spring中最受欢迎的子项目之一。而Reactor则是Spring家族中用于构建反应式应用程序的一个项目。Resilience4j是一个基于Java8和函数式编程设计理念构建的轻量级容错框架。可以在分布式系统中实现自我保…

    Java 2023年5月19日
    00
  • 一个Java配置文件加密解密工具类分享

    让我们来详细讲解一下如何实现一个Java配置文件加密解密工具类。 1. 需求分析 我们需要一个工具类,能够实现对Java配置文件中的敏感信息进行加密和解密的功能。具体功能如下: 加密配置文件中的敏感信息,保证安全性和保密性; 解密配置文件中的敏感信息,方便在代码中使用; 2. 设计思路 我们的设计思路如下: 读取配置文件,并找到需要加密解密的部分; 对配置文…

    Java 2023年5月31日
    00
  • Springboot使用filter对response内容进行加密方式

    下面是“Springboot使用filter对response内容进行加密方式”的完整攻略: 一、添加依赖 在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-st…

    Java 2023年5月20日
    00
  • Java Spring的数据库开发详解

    Java Spring的数据库开发详解攻略 Java Spring提供了便捷的工具来连接数据库,并且可以轻松地对数据库进行操作。下面是Java Spring进行数据库开发的详细攻略。 步骤一:配置数据源 在Spring Boot应用中,我们可以通过Spring的依赖管理器来添加数据库连接器。在配置文件(application.properties或appli…

    Java 2023年6月2日
    00
  • 浅析Redis中String数据类型及其底层编码

    浅析Redis中String数据类型及其底层编码 String数据类型介绍 Redis中String数据类型是最基本、最常用的数据类型之一,它可以保存字符串、整数或者浮点数。String类型可以进行增删改查等常见操作,支持的操作包括SET、GET、INCR等。 String数据类型底层编码 Redis中,对于每一种数据类型,都有对应的底层编码方式,Strin…

    Java 2023年6月1日
    00
  • 详解JSONObject和JSONArray区别及基本用法

    详解JSONObject和JSONArray区别及基本用法 1. JSONObject和JSONArray是什么? 在Java中,JSONObject和JSONArray都是JSON格式数据的提供者。 JSONObject对象表示一个JSON对象,即类似于{ “name”: “张三”, “age”: 18, “gender”: “male” }这样的数据结构…

    Java 2023年5月26日
    00
  • kotlin中数据类重写setter getter的正确方法

    当我们创建一个Kotlin数据类时,它会自动为每一个属性创建默认的 getter 和 setter 方法。但是如果我们需要对某个属性重写 getter 或 setter 方法,我们该怎么做呢? 首先,我们需要在数据类中定义属性并为其提供一个初始值。然后我们需要为该属性定义一个自定义的 setter 或 getter 方法。 下面是一些示例代码,可帮助您理解如…

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