教你怎么用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日

相关文章

  • OpenJDK源码解析之System.out.println详解

    OpenJDK源码解析之System.out.println详解 介绍 在Java中,要输出内容到控制台最常见的方式是使用 System.out.println() 方法。但是,了解该方法的运行机制以及它在底层的实现是非常有必要的。本文将侧重于介绍System.out.println()方法的实现原理,以及在OpenJDK源码中的具体实现。 System.o…

    Java 2023年5月26日
    00
  • Java基础语法:逻辑控制

    下面是对于Java基础语法中逻辑控制的完整攻略: 逻辑控制 在Java中,逻辑控制结构有三个主要的表现形式:条件语句、循环语句和跳转语句。这些结构主要用于控制程序的执行流程,使得程序可以按照既定的规则进行操作。 条件语句 条件语句是根据一个条件是否满足,来执行相应的代码块或语句的控制组件。在Java中,常见的条件语句有if语句和switch语句。 if语句 …

    Java 2023年5月23日
    00
  • Spring Security如何实现升级密码加密方式详解

    Spring Security是一个基于Spring框架的安全性框架,可以为Web应用程序提供身份验证、授权、防止CSRF攻击等功能。密码加密方式是Spring Security保护用户密码的一种方式,可以有效防止外部攻击者获取用户密码信息。在安全性方面,密码加密方式的保护能力越强,用户密码的安全性也就越高。下面,就让我们来详细讲解Spring Securi…

    Java 2023年5月20日
    00
  • Spring boot2+jpa+thymeleaf实现增删改查

    以下是详细讲解“Spring boot2+jpa+thymeleaf实现增删改查”的完整攻略。 1. 准备工作 在开始实现增删改查功能之前,我们需要进行一些准备工作。 1.1 创建Spring Boot工程 首先,我们需要创建一个Spring Boot工程,在这里可以使用Spring Initializr快速创建一个基础工程。在创建工程的过程中需要添加依赖S…

    Java 2023年5月20日
    00
  • Java与C++有什么不同?

    Java和C++是两种广受欢迎的编程语言,它们有许多不同之处,下面我将详细讲解Java与C++的不同点: 内存管理 C++程序员需要手动分配和释放内存。在C++中,我们使用new和delete操作符来实现动态内存管理。如果没有正确地释放内存,会导致内存泄漏。 而Java使用垃圾收集器来管理内存,程序员无需手动分配或释放内存。垃圾收集器自动回收无用的对象,使程…

    Java 2023年4月28日
    00
  • Spring MVC中使用Controller如何进行重定向

    在 Spring MVC 中,我们可以使用 Controller 进行重定向。重定向是指将用户请求重定向到另一个 URL,通常用于处理表单提交后的页面跳转。本文将详细讲解 Spring MVC 中使用 Controller 进行重定向的完整攻略,包括如何使用 RedirectAttributes 和 ModelAndView 两种方式进行重定向,并提供两个示…

    Java 2023年5月18日
    00
  • Java中的Checked异常有哪些?

    Java中的Checked异常 在Java程序设计中,异常是无法避免的,可能是程序中的代码出现了错误,也可能是其他外部因素造成的异常。其实,Java中的异常分为两类:Checked异常和Unchecked异常。其中,Checked异常必须在代码中进行处理,否则程序无法编译通过。在本篇攻略中,我们来详细讲解Java中的Checked异常。 Checked异常的…

    Java 2023年4月28日
    00
  • Java中的接口是什么?

    Java中的接口是一种特殊类型的抽象类,它定义了一组标准规范,用于实现类在特定情况下应该采取的行为。接口本身不能被实例化,但是可以被类实现,从而实现接口定义的标准规范。 Java中的接口主要具有以下特点: 接口中的所有方法都是抽象的,不能包含实现。 接口中的所有方法默认是public的,不能使用其他类型的访问修饰符。 接口中可以定义属性,但是这些属性默认是s…

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