详解基于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日

相关文章

  • JS实现鼠标移上去显示图片或微信二维码

    要实现鼠标移上去显示图片或微信二维码,可以使用JavaScript中DOM元素的事件和属性,具体的步骤如下: 首先,在HTML代码中,我们需要定义一个目标元素,即需要触发鼠标移动事件的元素。可以给这个元素设置一个id属性,方便在JavaScript中获取它的引用。例如: <div id="target">鼠标移上去触发事件&l…

    Java 2023年5月23日
    00
  • Java反应式框架Reactor中的Mono和Flux

    Java反应式框架Reactor中的Mono和Flux是两种非常重要的响应式数据类型。Mono是一种表示单个结果和可能的错误信息的数据类型,而Flux则是一种可以包含多个结果且可能有多个错误信息的数据类型。在Reactor框架中,这两种数据类型是非常常用的,下面我们将详细讲解它们的使用方法。 Mono和Flux的创建 要创建Mono和Flux对象,最常见的方…

    Java 2023年5月19日
    00
  • 使用异步controller与jQuery实现卷帘式分页

    下面我来详细讲解如何使用异步controller与jQuery实现卷帘式分页的完整攻略。 什么是卷帘式分页? 卷帘式分页是一种网页分页的效果。就是当我们向下滑动网页的时候,在页面底部会自动加载新的内容,实现不间断的加载效果,类似于卷帘拉开的效果。这种效果可以让用户更加流畅地查看网页内容,提高用户体验。 使用异步controller实现卷帘式分页 异步cont…

    Java 2023年5月19日
    00
  • 微信小程序(十六)form组件详细介绍

    让我来为你详细讲解“微信小程序(十六)form组件详细介绍”的完整攻略。 什么是form组件 在小程序中,form组件是一种用于提交表单数据的组件。form组件可以包含input、textarea、button等表单元素。每个表单元素都有一个name属性和一个value属性,表单元素的数据可以在提交时一并提交到服务器端。 form组件的使用方法 form组件…

    Java 2023年5月23日
    00
  • Java多线程-线程的同步与锁的问题

    Java 多线程 – 线程的同步与锁的问题 Java 中,线程的同步与锁是多线程开发中一个极为重要的概念,也是高并发环境下解决数据同步的关键。线程的同步意味着多个线程之间共享数据时需要做到同步,避免数据错乱。锁是线程同步机制的基础,通过加锁可以使线程按照特定的次序串行执行,从而保证多线程访问共享数据时的安全性。 线程同步 当多个线程不同步访问共享数据时,就可…

    Java 2023年5月26日
    00
  • 详解hibernate自动创建表的配置

    下面是详解Hibernate自动创建表的配置的完整攻略。 概述 Hibernate是一种流行的面向对象关系映射(ORM)框架,可用于将Java对象与关系型数据库(如MySQL)之间进行映射。Hibernate不仅提供了用于执行CRUD(创建、读取、更新和删除)操作的API,还可以自动创建与Java实体类对应的数据库表。在本攻略中,我们将重点探讨Hiberna…

    Java 2023年5月20日
    00
  • 深入浅析java web log4j 配置及在web项目中配置Log4j的技巧

    深入浅析Java Web Log4j配置 什么是Log4j? Log4j 是一个基于Java的开源日志记录工具。它被设计为灵活且可扩展的,但也必须是高效的。为了实现这个目标,Log4j 架构被划分成三层 — API 层、内核层和附加组件。 Log4j的配置 在Java web项目中,我们可以通过配置文件来指定Log4j的应用。Log4j的配置文件是一个文本文…

    Java 2023年5月20日
    00
  • 快手挂小程序需要什么条件

    当你想在快手平台上挂载小程序时,需要以下条件: 1.小程序的认证 首先你必须有一个小程序,并且已经申请完成且审核通过了认证,可以进入微信公众平台 -> 开发 -> 认证管理 -> 小程序认证,完成认证。 2.具有快手小程序的开发权限 在进行快手小程序的挂载时,需要在快手官网申请成为快手小程序开发者,简单的流程可以是点击这个链接 快手小程序开…

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