Java网络编程之简单的服务端客户端应用实例

下面是详细讲解“Java网络编程之简单的服务端客户端应用实例”的完整攻略。

简介

网络编程是指在计算机网络环境下,不同计算机之间利用程序进行数据交换。Java提供了一套完善的网络编程库,可以快速实现各种网络应用程序。本篇攻略将针对Java网络编程的服务端和客户端进行详细介绍,并通过示例演示其具体实现方法。

服务端

服务端是指在网络中提供服务的计算机程序,主要负责处理客户端的请求,并返回相应的结果。在Java网络编程中,服务端一般有以下实现步骤:

  1. 创建ServerSocket对象,指定端口号,监听客户端的请求;
  2. 调用accept()方法,等待客户端的连接请求;
  3. 接收到客户端的连接请求后,创建Socket对象,获取输入输出流,并进行通信;
  4. 服务端响应客户端请求,返回响应结果;
  5. 通信完成后,关闭输入输出流,关闭Socket连接。

下面是一个服务端示例代码:

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) throws Exception{
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("Server is ready.");

        while(true){
            Socket socket = serverSocket.accept();
            System.out.println("Client connected.");

            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);

            String line = in.readLine();
            System.out.println("Client message: " + line);

            out.println("Server response: " + line);

            out.close();
            in.close();
            socket.close();
        }
    }
}

这个例子中,我们创建了一个ServerSocket对象并指定了监听端口号为8888。在while循环中,我们调用accept()方法等待客户端的连接请求。当客户端连接到服务端时,我们获取该连接的输入输出流,进行通信。客户端发送字符串后,服务端返回响应结果。通信完成后,我们关闭输入输出流和Socket连接。

客户端

客户端是指在网络中请求服务的计算机程序,主要负责向服务端发送请求,并接收服务端返回的响应结果。在Java网络编程中,客户端一般有以下实现步骤:

  1. 创建Socket对象,指定服务端IP地址和端口号,建立连接;
  2. 获取输入输出流,并进行通信;
  3. 发送请求到服务端,接收服务端返回的响应结果;
  4. 通信完成后,关闭输入输出流,关闭Socket连接。

下面是一个客户端示例代码:

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) throws Exception{
        Socket socket = new Socket("localhost", 8888);

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);

        out.println("Hello Server.");

        String line = in.readLine();
        System.out.println("Server message: " + line);

        out.close();
        in.close();
        socket.close();
    }
}

这个例子中,我们创建了一个Socket对象并指定了服务端的IP地址和端口号。获取该连接的输入输出流进行通信。客户端发送字符串“Hello Server.”后,服务端返回响应结果。通信完成后,我们关闭输入输出流和Socket连接。

示例说明

示例1:简单文件传输

我们在服务端创建一个文件,然后在客户端连接服务端并将该文件发送到服务端。接着服务端将该文件存储到本地磁盘上。文件传输完成后,服务端将上传结果返回给客户端。

服务端代码:

import java.io.*;
import java.net.*;

public class FileServer {
    public static void main(String[] args) throws Exception{
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("Server is ready.");

        while(true){
            Socket socket = serverSocket.accept();
            System.out.println("Client connected.");

            InputStream in = socket.getInputStream();
            OutputStream out = new FileOutputStream("file.txt");

            byte[] buf = new byte[1024];
            int len = 0;
            while((len = in.read(buf)) != -1){
                out.write(buf, 0, len);
                out.flush();
            }

            out.close();
            in.close();
            socket.close();

            System.out.println("File uploaded successfully.");
        }
    }
}

客户端代码:

import java.io.*;
import java.net.*;

public class FileClient {
    public static void main(String[] args) throws Exception{
        Socket socket = new Socket("localhost", 8888);

        OutputStream out = socket.getOutputStream();
        InputStream in = new FileInputStream("file.txt");

        byte[] buf = new byte[1024];
        int len = 0;
        while((len = in.read(buf)) != -1){
            out.write(buf, 0, len);
            out.flush();
        }

        in.close();
        out.close();
        socket.close();

        System.out.println("File uploaded successfully.");
    }
}

示例2:多线程聊天室

我们在服务端创建一个聊天室,客户端可以连接到聊天室并进行在线聊天。服务端可以实时转发客户端的消息到所有在线连接的客户端。客户端可以随时退出聊天室。

服务端代码:

import java.io.*;
import java.net.*;
import java.util.*;

public class ChatServer {
    static List<ClientThread> clients = new ArrayList<>();

    public static void main(String[] args) throws Exception{
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("Server is ready.");

        while(true){
            Socket socket = serverSocket.accept();
            System.out.println("Client connected.");

            ClientThread client = new ClientThread(socket);
            clients.add(client);
            client.start();
        }
    }

    static class ClientThread extends Thread{
        Socket socket;
        BufferedReader in;
        PrintWriter out;

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

        public void run(){
            try{
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);

                while(true){
                    String line = in.readLine();
                    System.out.println(line);

                    for(ClientThread client : clients){
                        if(client != this){
                            client.out.println(line);
                        }
                    }

                    if(line.trim().equals("BYE")){
                        clients.remove(this);
                        in.close();
                        out.close();
                        socket.close();
                        return;
                    }
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

客户端代码:

import java.io.*;
import java.net.*;
import java.util.*;

public class ChatClient {
    public static void main(String[] args) throws Exception{
        Socket socket = new Socket("localhost", 8888);

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);

        new Thread(new InputThread(in)).start();

        Scanner scanner = new Scanner(System.in);
        while(true){
            String line = scanner.nextLine();
            out.println(line);
            if(line.trim().equals("BYE")){
                break;
            }
        }

        out.close();
        in.close();
        socket.close();
    }

    static class InputThread implements Runnable{
        BufferedReader in;

        public InputThread(BufferedReader in){
            this.in = in;
        }

        public void run(){
            try{
                while(true){
                    String line = in.readLine();
                    System.out.println(line);
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

这个例子中,我们创建了一个多线程的聊天室,在服务端创建了一个Thread子类来处理客户端的消息。每当有客户端发送消息时,服务端会将其转发给所有在线连接的客户端。客户端在发送消息后,也可以接收到其他客户端发送的消息。通信完成后,我们关闭输入输出流和Socket连接。

以上就是“Java网络编程之简单的服务端客户端应用实例”的完整攻略,希望可以帮助到大家。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java网络编程之简单的服务端客户端应用实例 - Python技术站

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

相关文章

  • JAVA随机打乱数组顺序的方法

    下面是“JAVA随机打乱数组顺序的方法”的完整攻略: 题目分析 首先,我们需要了解一下题目的意思,了解题目的要求是什么。题目要求我们实现一种方法,可以随机打乱给定数组的元素顺序。 方法解析 接下来,我们来分析一下如何实现这种方法。一种简单的方式是通过 Fisher–Yates 洗牌算法(也称为 Knuth 洗牌算法)来实现。该算法通常被认为是一种非常高效的打…

    Java 2023年5月26日
    00
  • Centos7.5配置java环境安装tomcat的讲解

    下面是完整的CentOS 7.5配置Java环境并安装Tomcat的攻略: 配置Java环境 1. 下载Java安装包 首先需要到官网下载Java安装包。一般推荐下载Java 8或者Java 11版本。 示例命令: wget https://download.java.net/java/GA/jdk11/13/GPL/openjdk-11.0.1_linux…

    Java 2023年5月19日
    00
  • 利用Spring Data MongoDB持久化文档数据的方法教程

    当使用Spring Data MongoDB进行文档数据持久化时,首先需要创建一个实体类,该实体类中需要包含一些注释以告知Spring Data MongoDB如何将该实体类映射到MongoDB集合。 例如,考虑以下实体类: @Document(collection = "myCollection") public class MyEnt…

    Java 2023年5月20日
    00
  • 浅析java异常栈

    下面我将为您详细讲解“浅析Java异常栈”的完整攻略。 浅析Java异常栈 异常栈的概述 在Java中,异常是指当前程序不能够继续执行下去的错误或问题。当程序发生异常时,会自动创建一个异常对象,并将这个异常对象抛出给Java虚拟机,Java虚拟机再根据异常对象调用相应的异常处理程序进行处理。 异常栈是异常处理机制的重要组成部分,它是一个由多个异常堆栈组成的数…

    Java 2023年5月27日
    00
  • 详解Spring连接数据库的几种常用的方式

    详解Spring连接数据库的几种常用方式 Spring框架是当今最流行的Java应用程序框架之一。在开发Java应用程序时,通常需要使用数据库来存储和检索数据。Spring框架提供了多种连接数据库的方式,本文将介绍这些常用的连接方式。 1. 数据库连接配置 在使用Spring连接数据库之前,我们需要做一些配置。下面是一个代表数据库配置的示例文件applica…

    Java 2023年5月20日
    00
  • 什么是线程安全的共享对象?

    以下是关于线程安全的共享对象的完整使用攻略: 什么是线程安全的共享对象? 线程安全的共享对象是指多个线程可以同时访问的对象,而不会出现数据不一致或程序崩溃等问题。在多线程编程中,线程安全的共享对象是非常重要的,因为当多个线程同时访问共享对象时,可能会出现线程间争的问题,导致数据不一致或程序崩溃。 线程安全的共享对象的示例 以下两个示例,分别演示了线程安全的共…

    Java 2023年5月12日
    00
  • Cookie在Java中的使用

    下面是详细讲解 Cookie 在 Java 中使用的攻略: 一、什么是 Cookie Cookie 是存储在用户计算机上的小型文本文件,用于存储 Web 服务器如何处理用户的操作的信息。它可以帮助网站在用户访问过程中存储一些用户信息,例如用户的用户名、购物车信息、上次登录时间等等。Cookie 可以在服务器和客户端之间交换,以使得用户在多个 Web 页面之间…

    Java 2023年6月15日
    00
  • Java算法之BFS,DFS,动态规划和贪心算法的实现

    Java算法之BFS、DFS、动态规划和贪心算法的实现 本文将详细讲解Java中BFS、DFS、动态规划和贪心算法的实现及使用场景。 BFS BFS全称Breadth-First Search,即广度优先搜索。BFS算法主要应用于无权重图的最短路径查找,或者非加权的图上的搜索问题。BFS算法使用了队列的数据结构来辅助实现,具体实现步骤如下: 将起始节点加入队…

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