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实现网页爬虫的示例讲解

    下面就是Java实现网页爬虫的完整攻略,包括流程、注意事项和示例说明。 流程 网页爬虫的实现流程如下: 定义目标网页地址,并通过Java代码中的URL类创建URL对象。 通过URL对象打开连接并获取输入流,读取目标网页的HTML源代码。 利用正则表达式等方法,从源代码中提取想要的数据或链接。 如果需要,将提取的数据存储到数据库等地方。 如果有链接需要继续抓取…

    Java 2023年5月18日
    00
  • Java实现简易学生管理系统

    Java实现简易学生管理系统完整攻略 需求分析 首先,我们需要确定这个学生管理系统的具体功能需求,比如可以添加学生,删除学生,修改学生信息,查询学生信息等。 设计数据库 接下来,我们需要设计一个数据库来存储学生信息。一个简单的学生信息表可能包含以下字段:学号(ID),姓名(name),性别(gender),年龄(age),班级(class)。 构建项目框架 …

    Java 2023年5月19日
    00
  • java中字符串参数化符号${}的解析

    在Java中,字符串参数化符号${}是用于字符串模板中的占位符,可以在占位符中插入变量名,并在运行时将其动态替换为相应的值。 下面是解析${}的基本过程: 识别占位符 在字符串中找到${的位置,表示占位符开始。 识别变量名 在占位符中寻找变量名,变量名可以是任意的合法Java标识符。 识别默认值 如果占位符中包含默认值,使用冒号 : 来和变量名分隔。默认值是…

    Java 2023年5月26日
    00
  • System.currentTimeMillis()计算方式与时间的单位转换详解

    针对题目中提出的主题,我将分以下几个部分进行详细解释: System.currentTimeMillis()的计算方式 时间单位转换的详解 示例代码 1. System.currentTimeMillis()的计算方式 在Java中,System.currentTimeMillis()方法可以获取当前系统时间。其返回值是以毫秒为单位表示从1970年1月1日0…

    Java 2023年5月20日
    00
  • Java Object类和包装类深入解读

    Java Object类和包装类深入解读 Java中的所有类继承自Object类,这使得Object类成为Java中最基础的类之一。此外,Java中还包含了8个基本数据类型,这些基本数据类型都有其对应的包装类,用来对基本类型进行装箱操作,使其具备对象的特征。本文将深入探讨Java中Object类和包装类的相关知识点和用法。 Object类 什么是Object…

    Java 2023年5月26日
    00
  • js对文章内容进行分页示例代码

    下面我将为你详细讲解如何使用JavaScript对文章内容进行分页,包括示例代码和说明。 示例代码1:基本的分页功能 <!– HTML结构 –> <div id="article-container"></div> <!– 存放文章内容的DIV –> <div id=&quot…

    Java 2023年6月16日
    00
  • Spring概述和快速构建的方式

    作为Spring框架的作者,我很乐意为您详细讲解Spring的概述和快速构建的方式。 Spring框架概述 Spring框架是Java开发的企业级应用程序框架,提供了诸如IOC(Inversion of Control),AOP(Aspect Oriented Programming),事务管理等功能,旨在使开发者构建Java应用程序变得更加简单。Sprin…

    Java 2023年5月19日
    00
  • Java中的匿名内部类是什么?

    匿名内部类是Java中一种特殊的类定义方式,它没有类名,而是将类定义作为表达式的一部分。匿名内部类常常用于定义一个只需要使用一次的类。 在Java中,匿名内部类可以是接口的实现类、抽象类的实现类或者普通类的子类。它通常会隐式地继承一个类或实现一个接口,同时还可以拥有自己的方法和属性。匿名内部类的定义方式与普通类的定义方式相似,但使用了不同的语法。 匿名内部类…

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