Java进阶学习:网络服务器编程

Java进阶学习:网络服务器编程

Java进阶学习中,网络服务器编程是非常关键的一部分。本文将介绍网络服务器编程方面的完整攻略,包括必要的基础知识,如何创建网络服务器,如何创建服务器/客户端,以及一些实例说明。

1. 基础知识

在进行网络服务器编程之前,需要掌握以下基础知识:

  • TCP/IP 协议
  • Socket 编程
  • 多线程编程

TCP/IP协议是 Internet 上数据通信的基础协议,Socket编程是实现网络通信的具体技术,多线程编程则是实现服务器的关键技术之一。

2. 创建网络服务器

创建网络服务器需要以下步骤:

  1. 创建一个ServerSocket实例,并指定端口号;
  2. 调用ServerSocket的accept()方法接收客户端请求,该方法将阻塞进程,直到有客户端请求连接;
  3. 将获得的Socket实例传递给一个新的线程进行处理,以允许服务器同时处理多个客户端的请求。

下面是一个简单的Java代码示例:

ServerSocket serverSocket = new ServerSocket(9999);
while (true) {
    Socket socket = serverSocket.accept(); // 阻塞等待客户端连接请求

    // 创建新线程处理客户端请求
    Runnable runnable = new ServerThread(socket);
    new Thread(runnable).start();
}

3. 创建服务器/客户端

创建服务器/客户端需要以下步骤:

  1. 创建一个ServerSocket实例,并指定端口号;
  2. 当服务器继续监听客户端请求时,创建一个Socket实例来连接到服务器;
  3. 通过Socket实例,向服务器发送请求或接收数据。

以下是一个Java代码示例:

// 服务器端
ServerSocket serverSocket = new ServerSocket(9999);
while (true) {
    Socket socket = serverSocket.accept(); // 阻塞等待客户端连接请求

    // 创建新线程处理客户端请求
    Runnable runnable = new ServerThread(socket);
    new Thread(runnable).start();
}

// 客户端
String host = "localhost";
int port = 9999;

Socket socket = new Socket(host, port);

// 发送请求
OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello, World!".getBytes());

// 接收响应
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
String response = new String(bytes, 0, len);

4. 实例说明

实例一

实现一个简单的聊天程序,允许多个客户端同时连接。当任何客户端发送消息时,服务器将消息广播给所有连接的客户端。

以下是Java代码示例:

// 服务器端
public class ChatServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("聊天室已开启,等待客户端接入...");
        List<Socket> sockets = new ArrayList<>();
        while (true) {
            Socket socket = serverSocket.accept();
            sockets.add(socket);
            Runnable runnable = new ChatServerThread(socket, sockets);
            new Thread(runnable).start();
        }
    }
}

public class ChatServerThread implements Runnable {
    private Socket socket;
    private List<Socket> sockets;

    public ChatServerThread(Socket socket, List<Socket> sockets) {
        this.socket = socket;
        this.sockets = sockets;
    }

    @Override
    public void run() {
        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while (true) {
                String message = bufferedReader.readLine();
                if (message == null) {
                    sockets.remove(socket);
                    break;
                }
                for (Socket socket : sockets) {
                    if (socket != this.socket) {
                        OutputStream outputStream = socket.getOutputStream();
                        outputStream.write(message.getBytes());
                        outputStream.flush();
                    }
                }
            }
            System.out.println(socket.getRemoteSocketAddress() + " 已断连");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// 客户端
public class ChatClient {
    public static void main(String[] args) throws IOException {
        String host = "localhost";
        int port = 9999;
        Socket socket = new Socket(host, port);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        OutputStream outputStream = socket.getOutputStream();
        InputStream inputStream = socket.getInputStream();
        while (true) {
            String message = bufferedReader.readLine();
            outputStream.write(message.getBytes());
            outputStream.flush();
            byte[] bytes = new byte[1024];
            int len = inputStream.read(bytes);
            String response = new String(bytes, 0, len);
            System.out.println("[" + socket.getInetAddress().getHostAddress() + "]:" + response);
        } 
    }
}

实例二

实现一个简单的HTTP服务器,当服务器接收到HTTP请求时,返回一个HTML页面作为响应。

以下是Java代码示例:

public class HttpServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);
        while (true) {
            Socket socket = serverSocket.accept();
            Runnable runnable = new HttpRequestThread(socket);
            new Thread(runnable).start();
        }
    }
}

public class HttpRequestThread implements Runnable {
    private Socket socket;

    public HttpRequestThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            OutputStream outputStream = socket.getOutputStream();
            PrintWriter printWriter = new PrintWriter(outputStream);
            String line;
            while ((line = bufferedReader.readLine()) != null && !line.equals("")) {
                System.out.println(line);
            }
            String response = "<html><body><h1>Hello, World!</h1></body></html>";
            printWriter.println("HTTP/1.1 200 OK");
            printWriter.println("Content-Type: text/html");
            printWriter.println("Content-Length: " + response.length());
            printWriter.println("");
            printWriter.println(response);
            printWriter.flush();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// 客户端
public class HttpClient {
    public static void main(String[] args) throws IOException {
        String host = "localhost";
        int port = 8080;
        Socket socket = new Socket(host, port);
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("GET / HTTP/1.1\r\nHost: localhost:8080\r\n\r\n".getBytes());
        outputStream.flush();
        InputStream inputStream = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = inputStream.read(bytes);
        String response = new String(bytes, 0, len);
        System.out.println(response);
    }
}

以上就是Java进阶学习中网络服务器编程方面的完整攻略,包括基础知识、创建网络服务器、创建服务器/客户端和实例说明。希望这篇文章能够对Java编程人员有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java进阶学习:网络服务器编程 - Python技术站

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

相关文章

  • Java SpringMVC实现自定义拦截器

    Java SpringMVC实现自定义拦截器 简介 在Java SpringMVC中,可以通过自定义拦截器来实现许多功能,例如登录验证、权限控制、日志记录等。通过拦截器,我们可以在请求到达Controller之前或之后对请求进行一些处理。在本文中,我们将讲解如何使用Java SpringMVC来实现自定义拦截器。 1. 创建拦截器 实现HandlerInte…

    Java 2023年6月15日
    00
  • java中全排列的生成算法汇总

    Java中全排列的生成算法汇总 一、什么是全排列 全排列,是指将一组数按一定顺序进行排列,称为这组数的全排列。 如有三个数a、b、c,则它们的全排列有:a、b、c、ab、ac、ba、bc、ca、cb、abc、acb、bac、bca、cab、cba 共6个。 二、生成全排列的算法 在Java中,生成全排列的算法有以下几种: 1.递归算法 这种算法实现简单,思路…

    Java 2023年5月19日
    00
  • 详解Spring MVC CORS 跨域

    详解Spring MVC CORS 跨域 CORS(Cross-Origin Resource Sharing)是一种Web浏览器的安全机制,用于限制跨域请求。在Spring MVC中,我们可以使用@CrossOrigin注解来处理CORS跨域请求。 @CrossOrigin注解 @CrossOrigin注解是Spring MVC提供的一个注解,它可以用来处…

    Java 2023年5月18日
    00
  • MyBatis简介与配置MyBatis+Spring+MySql的方法

    MyBatis简介 MyBatis是一个优秀的基于Java的持久层框架,它内部封装了JDBC,通过XML或注解将Java对象和SQL语句进行映射,使得开发者可以通过简单的配置和少量代码来进行复杂的数据库操作。 配置MyBatis+Spring+MySQL 步骤一:创建Maven项目 首先,创建一个基于Maven的Java项目,命名为mybatis-demo。…

    Java 2023年5月20日
    00
  • JavaWeb动态导出Excel可弹出下载

    引言: 在JavaWeb开发过程中,有时候需要将数据库中的数据导出为Excel文件,然后让用户可以进行下载。而且,下载的过程中需要提供一些提示信息,如下载进度、下载成功等信息。本文将详细介绍如何使用JavaWeb动态导出Excel并实现弹出下载的效果。 步骤: 1.创建Excel文件 我们可以使用Apache POI来创建Excel文件,这里就不过多介绍了,…

    Java 2023年6月15日
    00
  • Java多线程 ReentrantLock互斥锁详解

    Java多线程 ReentrantLock互斥锁详解 在多线程编程中,为了避免线程间的竞争条件和数据不一致问题,通常需要使用互斥锁来控制线程的访问。 Java中的ReentrantLock是一种可重入的独占锁,它可以用来保护共享资源,避免多个线程同时访问造成数据不一致的问题。下面我们将详细介绍ReentrantLock的用法和注意事项。 1. Reentra…

    Java 2023年5月18日
    00
  • Java Scala之面向对象

    Java Scala之面向对象:完整攻略 什么是面向对象 面向对象(Object Oriented Programming,简称OOP)是一种编程范式,主要思想是将数据和对数据的相关操作封装在一个单元中,形成对象。通过对对象的定义、组合和继承等机制实现程序的可扩展性、灵活性和可维护性。 面向对象的三大特征 封装(Encapsulation) 封装就是将程序中…

    Java 2023年5月26日
    00
  • MybatisPlus如何处理Mysql的json类型

    下面是MybatisPlus如何处理MySQL的Json类型的攻略: 背景 MySQL从5.7开始支持Json类型。对于Java开发者来说,通常使用json字符串表示json类型的数据。在开发过程中,可能需要把json字符串映射成Java对象并进行持久化或者把Java对象转换成json字符串进行传输。在使用MybatisPlus做ORM开发时,可以通过使用@…

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