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

相关文章

  • ajax详解_动力节点Java学院整理

    AJAX详解 什么是AJAX AJAX(Asynchronous JavaScript and XML)即异步 JavaScript 和 XML,是一种在Web页面中实现异步数据交互的通信技术。它的核心是 XMLHttpRequest 对象,它可以在不刷新页面的情况下发送和接收数据。 AJAX的优点 页面无需刷新,数据实时更新 能够异步加载数据,减少页面加载…

    Java 2023年5月26日
    00
  • jQuery ajaxForm()的应用

    当需要通过 AJAX 方式向服务器提交表单数据时,jQuery 提供了方便的方法 ajaxForm()。下面是该方法的详细介绍及应用攻略。 ajaxForm() 方法的使用 基本语法 $(selector).ajaxForm(options); 其中,selector 是表单的选择器,options 是一个对象,包含了一些可选参数及回调函数,具体参数如下: …

    Java 2023年6月16日
    00
  • Spring AOP官方文档学习笔记(三)之基于xml的Spring AOP

    1.声明schema,导入命名空间 (1)如果我们想要使用基于xml的spring aop,那么,第一步,我们需要在xml配置文件中声明spring aop schema,导入命名空间,如下这是一个标准的模板 <?xml version=”1.0″ encoding=”UTF-8″?> <beans xmlns=”http://www.sp…

    Java 2023年5月4日
    00
  • 排序算法图解之Java冒泡排序及优化

    我来为你详细讲解“排序算法图解之Java冒泡排序及优化”的完整攻略。 简介 排序算法在计算机学科中是非常重要的内容,冒泡排序就是其中的一种,设计简单,易于理解和实现,其时间复杂度为O(n^2)。本篇文章主要介绍了Java语言实现冒泡排序的方式以及针对普通冒泡排序算法的优化。 冒泡排序 冒泡排序是稳定排序中的一种,其基本操作是将相邻的元素进行比较和交换,每次循…

    Java 2023年5月19日
    00
  • 如何使用Java运行期注解?

    准备工作: 在本地电脑上安装Java开发环境,确保可以运行Java程序。 Step 1:定义注解 在Java中,定义注解需要使用@interface关键字,如下所示: public @interface MyAnnotation { String value(); } 其中,@interface是用来声明一个注解的关键字,MyAnnotation是注解的名称…

    Java 2023年5月11日
    00
  • Maven下载和配置环境教程

    Maven下载和配置环境教程 Maven是一款十分流行的项目管理和构建工具,通过引入依赖的方式将项目工程带入到一个统一管理的框架之中。下面是Maven下载和配置环境的攻略。 下载Maven Maven的官方网站为:http://maven.apache.org/,打开网页后可以选择下载最新版的Maven,也可以选择下载历史版本。可以根据自己的需要进行下载。下…

    Java 2023年5月20日
    00
  • SpringBoot3.0自定stater模块的操作流程(chatGPT提供的49种场景)

    Spring Boot 3.0 自定义 Starter 模块的操作流程 Spring Boot 3.0 是一个快速构建 Spring 应用程序的框架,它提供了许多便利的功能,例如自动配置、嵌入式服务器和健康检查等。在本文中,我们将详细讲解 Spring Boot 3.0 自定义 Starter 模块的操作流程。 什么是 Starter 模块 Starter …

    Java 2023年5月15日
    00
  • Java多线程中的Balking模式详解

    让我来给您详细讲解一下“Java多线程中的Balking模式”的攻略。 什么是Balking模式 Balking是一种设计模式,它用于在并发编程中避免重复执行代码。这种模式通常用于程序中存在运行条件无法实现的情况下(例如正在发生的网络超时或其他必要资源无法访问等)。 Balking模式的实现过程 Balking模式的核心思想是,检查并避免尝试重复执行正在发生…

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