详解基于java的Socket聊天程序——服务端(附demo)

详解基于java的Socket聊天程序——服务端(附demo)攻略

1. 简介

本文将详细介绍如何使用Java中的Socket编写一个简单的聊天程序。文章分为客户端和服务端两部分,本文将着重讲解服务端的实现过程,并提供对应示例代码。

2. 整体流程

  1. 创建ServerSocket
  2. 等待客户端连接,创建Socket
  3. 创建线程处理客户端连接
  4. 服务端处理客户端的消息

3. 具体实现

  1. 创建ServerSocket

使用Java中的ServerSocket可以很容易地创建一个基于TCP的服务端口。服务端端口和客户端端口号不用相同,可以自己定义。示例如下:

ServerSocket serverSocket = new ServerSocket(9999);
  1. 等待客户端连接,创建Socket

一旦ServerSocket创建完成,服务端就可以开始监听客户端的连接请求,并通过ServerSocket的accept()方法等待客户端连接。一旦有客户端连接,则会返回一个Socket实例。示例如下:

Socket socket = serverSocket.accept();
  1. 创建线程处理客户端连接

服务端需要处理多个客户端连接,所以我们需要为每个客户端都创建一个线程。而线程的实现,需要继承Thread或实现Runnable接口。以下是线程的示例代码:

class ServerThread implements Runnable {
    private Socket socket;

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

    @Override
    public void run() {
        //线程处理代码
    }
}
  1. 服务端处理客户端的消息

一旦连接被建立,服务端就可以发送和接收数据。

使用InputStream可以获取客户端发送过来的数据,使用OutputStream可以将服务端的数据传输到客户端。

InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();

4. 示例说明

以下是一个简单的ServerSocket聊天程序示例:

import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Server {
    public static List<Socket> clients = new ArrayList<>();

    public static void main(String[] args) {

        try {
            ServerSocket serverSocket = new ServerSocket(9999);
            System.out.println("Waiting for clients …");

            while (true) {
                Socket socket = serverSocket.accept();
                clients.add(socket);
                Thread thread = new Thread(new ServerThread(socket, clients));
                thread.start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

public class ServerThread implements Runnable {
    private Socket socket;
    private List<Socket> clients;
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public ServerThread(Socket socket, List<Socket> clients) {
        this.socket = socket;
        this.clients = clients;
    }

    @Override
    public void run() {
        try {
            System.out.println("Client connected:" + socket.getInetAddress() + ":" + socket.getPort());
            DataInputStream dis = new DataInputStream(socket.getInputStream());

            while (true) {
                String str = dis.readUTF();
                System.out.println("Received message from client:" + socket.getInetAddress() + ":" + socket.getPort() + " " + str);

                for (int i = 0; i < clients.size(); i++) {
                    Socket temp = clients.get(i);
                    if (temp == socket || temp.isClosed()) {
                        continue;
                    }

                    DataOutputStream dos = new DataOutputStream(temp.getOutputStream());
                    dos.writeUTF(sdf.format(new Date()) + " " + socket.getInetAddress() + ":" + socket.getPort() + " said:" + str);
                    dos.flush();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

上述示例中,首先会创建一个ServerSocket,然后会一直等待客户端的连接。每当有新客户端连接上来,就会为其创建一个独立的线程,并且将该线程加入一个静态的List中。

当有客户端发送消息时,线程会将该消息广播给所有其他的客户端。同时,线程还会记录下行为发生的时间,以及消息的来源。

结论

本文已经详细讲解了如何使用Java中的Socket编写一个简单的聊天程序的整个流程,以及提供了一个对应示例代码,希望对有需要的读者有所帮助。 需要注意的是,在真正的项目开发中,可能需要考虑更多的异常情况和边界条件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解基于java的Socket聊天程序——服务端(附demo) - Python技术站

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

相关文章

  • Servlet关于RequestDispatcher的原理详解

    《Servlet关于RequestDispatcher的原理详解》 什么是RequestDispatcher? RequestDispatcher是Servlet规范中的一种技术,用于在一个Web应用程序内部将请求转发到另一个Servlet或JSP页面,是一种实现Servlet之间跳转和调用的方法。 RequestDispatcher的工作原理 Reques…

    Java 2023年6月15日
    00
  • Spring Boot启动过程完全解析(一)

    下面是对《SpringBoot启动过程完全解析(一)》的详细讲解: 1. SpringBoot的启动过程 在SpringBoot启动过程中,主要涉及到以下几个步骤: 调用SpringApplication.run()方法启动应用程序 根据相应的配置加载ApplicationContext上下文 完成自动装配 启动嵌入式Web服务器 对于每一步的详细说明,请阅…

    Java 2023年5月15日
    00
  • 史上最全MyBatis面试题及答案

    史上最全MyBatis面试题及答案攻略 什么是MyBatis?它的作用是什么? MyBatis是一个持久层框架,用于简化Java应用程序中的数据库交互。它使用XML或注解来描述对象映射器,从而实现将Java对象映射为数据库表中的数据。MyBatis的主要作用是:简化数据库交互代码的编写,防止SQL注入攻击,提高代码的可维护性和可读性。 MyBatis中的Ma…

    Java 2023年5月20日
    00
  • nginx+tomcat实现负载均衡,使用redis session共享

    实现负载均衡可以利用反向代理服务器来实现,而Nginx就是一个出色的反向代理服务器,同时,通过Tomcat实现负载均衡的同时还需要使用Redis session共享来实现负载均衡下的session一致性。 下面就是实现“nginx+tomcat实现负载均衡,使用redis session共享”的完整攻略: 环境准备 安装Nginx、Tomcat和Redis;…

    Java 2023年5月19日
    00
  • Java I/O 操作及优化详细介绍

    Java I/O 操作及优化详细介绍 Java 中的 I/O 操作可以通过 InputStream、OutputStream、Reader、Writer 等类实现,在进行 I/O 操作的同时,我们需要注意一些优化策略。 1. InputStream 和 OutputStream 在 Java 中,I/O 操作使用 InputStream 和 OutputSt…

    Java 2023年5月23日
    00
  • java导出生成csv文件的方法

    下面我来讲解一下Java导出生成CSV文件的方法。 步骤一:引入CSV依赖 CSV是指Comma Separated Values,即逗号分隔值。在Java中,我们需要引入一个CSV操作的依赖包,这里我们以OpenCSV为例。可以通过以下方式引入依赖: <dependency> <groupId>com.opencsv</gro…

    Java 2023年5月26日
    00
  • Java异常处理机制try catch流程详解

    Java异常处理机制try catch流程详解 1. 异常处理机制概述 在Java程序中,当出现异常时,会有异常信息抛出,如果不加以处理,程序可能会出现崩溃等异常情况。因此我们需要加入异常处理机制来避免这些问题的出现。 Java异常处理机制是一种解决异常情况的方式,Java提供了try-catch-finally语句用于异常处理。 2. try-catch-…

    Java 2023年5月27日
    00
  • java static块和构造函数的实例详解

    Java中的static块和构造函数都是用来初始化类的成员变量的,但两者有着不同的特点和应用场景。下面详细讲解static块和构造函数的用法及其区别。 一、static块 1.1 定义 在Java中,static块是一个静态代码块,用来初始化静态成员变量。在类加载时,如果类中有static块,则首先会执行static块,然后才会执行其他代码块和构造函数。 1…

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