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日

相关文章

  • JavaWeb实现文件上传与下载实例详解

    JavaWeb实现文件上传与下载实例详解 1. 实现文件上传 1.1. HTML表单 首先需要编写一个表单用于上传文件: <form action="FileUploadServlet" method="post" enctype="multipart/form-data"> <i…

    Java 2023年5月19日
    00
  • Java Apache Commons报错“TransformerFactoryConfigurationError”的原因与解决方法

    “TransformerException”是Java的ApacheCommons类库中的一个异常,通常由以下原因之一引起: XML格式错误:如果XML格式不正确,则可能会出现此异常。例如,可能会缺少必需的元素或属性。 XSLT格式错误:如果XSLT格式不正确,则可能会出现此异常。例如,可能会使用错误的XSLT模板或模板配置错误。 以下是两个实例: 例1 如…

    Java 2023年5月5日
    00
  • 如何使用JFrame完成动态模拟时钟

    使用JFrame完成动态模拟时钟的攻略可以分为以下几个步骤: 1. 导入Swing包 使用JFrame需要导入Swing包,可以在文件头添加以下代码: import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; import java.awt.Graphics…

    Java 2023年5月26日
    00
  • spring 整合 mybatis 中数据源的几种配置方式(总结篇)

    下面是关于“spring 整合 mybatis 中数据源的几种配置方式(总结篇)”的完整攻略: 1. 简介 在Java项目中,数据源是一个非常重要的组成部分,而MyBatis是一款数据库框架,而Spring是一个很不错的框架,其中,Spring可以与MyBatis进行整合,提供便捷的数据访问功能,其中数据源的配置是一个重要环节。 在这篇攻略中,我们将会全面讲…

    Java 2023年5月19日
    00
  • Java线程组与未处理异常实例分析

    Java线程组和未处理异常之间有一定的内在联系。在某些情况下,程序出现未处理异常之后可能会导致程序崩溃或者停止运行,这个时候我们需要通过Java线程组来捕获异常并进行处理。 什么是Java线程组 Java是一种多线程语言,线程是执行程序的基本单元。Java线程组是一组线程的集合,它可以将一组线程放在同一个组中,然后对这个组进行管理。Java线程组的主要作用是…

    Java 2023年5月27日
    00
  • java实现简单猜拳小游戏

    Java实现简单猜拳小游戏攻略 本文旨在介绍如何使用Java语言实现一个简单的猜拳小游戏。在本文中,我们将涉及如何实现游戏逻辑,如何获取用户输入以及如何进行游戏界面的展示。接下来将详细介绍这些内容。 实现游戏逻辑 在猜拳游戏中,玩家与计算机进行猜拳比赛并决定胜负。为了实现这个过程,我们可以使用Java中的随机数来模拟计算机的猜拳选择,并根据玩家选择和计算机选…

    Java 2023年5月19日
    00
  • 使用Java Minio搭建自己的文件系统详解

    使用 Java Minio 搭建自己的文件系统 本文将为您详细介绍如何使用 Java Minio 搭建自己的文件系统,让您轻松实现对象存储和文件管理。 什么是Java Minio? Java Minio 是 Minio 这个开源对象存储服务的 Java 版本的 SDK。它提供了对于 Minio 这个云存储的 Java 编程式接口,方便 Java 开发者使用和…

    Java 2023年5月20日
    00
  • Java封装数组之改进为泛型数组操作详解

    Java封装数组之改进为泛型数组操作详解 在Java程序开发中,经常会使用数组来存储和处理数据,但是传统的数组存储方式存在类型不安全、代码冗长等问题,为了解决这些问题,Java提供了泛型数组,即封装数组。本文将详细介绍Java封装数组的概念,封装原理以及如何改进为泛型数组的操作步骤和技巧。 一、概念 Java封装数组是指在类中定义数组变量,封装了数组的属性和…

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