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日

相关文章

  • JSP中param动作的实例详解

    当我们想要把参数传递给 JSP 页面时,param 动作是一种非常有用的方法。通过在 JSP 页面中使用 param 动作,我们可以轻松地向页面中传递参数,这些参数可以来自域对象,例如 request、session 或 application,也可以来源于页面 URL 中的查询字符串或表单提交。本文将为大家深入详解 param 动作的用法,通过两个实例帮助…

    Java 2023年6月15日
    00
  • Java 类型相互转换byte[]类型,Blob类型详细介绍

    针对Java类型相互转换byte[]类型、Blob类型的问题,以下是一个完整的攻略说明。 一、基础概念 Java中的Blob类型指的是二进制大对象(Binary Large Object),通常用于保存大型数据,如图片、音频等。在数据库中一般以byte[]类型存储。 在Java中,byte[]是字节数组类型,表示由多个字节构成的数组。可以将Blob类型转换为…

    Java 2023年5月20日
    00
  • Java中的Hibernate是什么?

    Hibernate是一种Java持久化框架,它是一种ORM(对象关系映射)工具,旨在解决Java应用程序中关系型数据持久化的问题。ORM是一种编程技术,将对象与数据库之间的映射关系纳入国内的程序逻辑,从而实现通过对象对数据库的访问。 Hibernate可以让开发人员将实体类对象映射到数据库表中,能够自动执行诸如保存、更新和删除操作。使用Hibernate将J…

    Java 2023年4月27日
    00
  • SpringMVC整合SpringSession 实现sessiong

    SpringMVC整合SpringSession 实现session 在Web应用程序中,Session是一种非常重要的机制,它可以帮助我们在不同的请求之间共享数据。SpringMVC提供了与SpringSession集成的支持,可以帮助我们更方便地管理Session。本文将详细介绍如何使用SpringMVC整合SpringSession实现Session管…

    Java 2023年5月17日
    00
  • Java中Date,Calendar,Timestamp的区别以及相互转换与使用

    Java中Date,Calendar,Timestamp的区别以及相互转换与使用 在Java中,Date、Calendar和Timestamp是处理日期和时间的三个主要的类。本文将详细介绍它们的区别以及如何相互转换和使用。 Date类 Date类是Java中最早的日期和时间处理类。它表示从GMT(格林尼治标准时间)1970年1月1日00:00:00时间开始至…

    Java 2023年5月20日
    00
  • 详解Java中Thread 和Runnable区别

    当开发多线程程序时,Java中有两种方式可以创建线程:继承Thread类或实现Runnable接口。虽然它们最终实现的目标是相同的,但它们之间仍然存在一些重要区别。本文将详细讲解Thread和Runnable的区别,让您在编写多线程程序时选择最佳方案。 一、继承Thread类 继承Thread类是创建线程的传统方式。这是通过继承Thread类并覆盖其中的ru…

    Java 2023年5月18日
    00
  • java音频播放示例分享(java如何播放音频)

    Java音频播放示例分享 在Java中,我们可以借助Java Sound API来播放音频。本文将详细介绍如何使用Java Sound API来播放音频文件。 首先创建一个播放器类 我们首先需要创建一个播放器类,该类可以使用Java Sound API来播放音频文件。下面是一个基本的播放器类示例: import java.io.File; import ja…

    Java 2023年5月26日
    00
  • win10 64位 jdk1.8的方法教程详解

    Win10 64位 JDK1.8的安装方法教程详解 1. 下载JDK 首先,你需要在Oracle官网下载JDK1.8的安装包。你可以通过以下链接进入下载界面:Java SE Development Kit 8 Downloads。在下载页面中,你需要同意许可协议并选择适合你的操作系统的版本进行下载。 2. 安装JDK 安装JDK很简单。按照以下步骤操作即可:…

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