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

相关文章

  • Ubuntu下配置Tomcat服务器以及设置自动启动的方法

    下面是针对Ubuntu系统配置Tomcat服务器的攻略,包含以下几个步骤: 1.安装Java环境 Tomcat是基于Java开发的,所以要先安装Java环境。我们可以使用以下命令安装默认的OpenJDK: sudo apt-get update sudo apt-get install default-jdk 2.下载Tomcat并解压缩 Tomcat的官方…

    Java 2023年5月19日
    00
  • Spring MVC学习笔记之json格式的输入和输出

    下面就为你讲解“Spring MVC学习笔记之json格式的输入和输出”的完整攻略。 什么是JSON格式? JSON是一种轻量级的数据交换格式,其全称为“JavaScript Object Notation”,它采用文本格式来表示数据对象。JSON格式可用于数据的序列化和反序列化,具有易读性、易编写和易于解析的特点,被广泛用于Web应用程序间的数据传输。 S…

    Java 2023年6月15日
    00
  • ibatis迁移到mybatis3的注意事项

    下面是ibatis迁移到mybatis3的注意事项的完整攻略: 1. 概览 iBATIS作为一个成熟的ORM框架,已经成为本质上与 MyBatis 这个极受欢迎的 ORM 框架的母版。iBATIS 的成功导致了 MyBatis 的产生,MyBatis 与 iBATIS 必然有很多相似之处,包括映射文件、参数映射、参数验证等等。iBATIS 迁移到 MyBat…

    Java 2023年5月20日
    00
  • JAVA代码块你了解吗

    当提到Java代码块时,一般指的是静态代码块和实例代码块。这两种代码块通常用于在类被实例化之前或初始化之前执行某些操作。下面我将详细讲解Java代码块的使用方法和注意事项,包括静态代码块和实例代码块的具体作用和范围、执行顺序以及示例说明。 Java代码块的作用和范围: 静态代码块:它用于在类被加载到内存中时执行初始化或一次性操作。静态代码块是用 static…

    Java 2023年5月30日
    00
  • SpringMVC4+MyBatis+SQL Server2014实现数据库读写分离

    下面是关于“SpringMVC4+MyBatis+SQL Server2014实现数据库读写分离”的完整攻略,包含两个示例说明。 SpringMVC4+MyBatis+SQL Server2014实现数据库读写分离 在本文中,我们将介绍如何使用SpringMVC4和MyBatis实现数据库读写分离,以提高系统的性能和可靠性。 步骤1:添加依赖 首先,我们需要…

    Java 2023年5月17日
    00
  • 解决问题:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources

    首先, “Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources” 这个错误意味着 Maven 在构建时无法成功执行 maven-resources-plugin 插件,通常是由于插件本身的错误或项目配置不当导致的。针对这个错误,可以采取以下…

    Java 2023年5月19日
    00
  • Java多线程程序中synchronized修饰方法的使用实例

    下面是Java多线程程序中synchronized修饰方法的使用实例的详细攻略。 什么是多线程和synchronized? 多线程是指在同一时间内,多个线程同时执行,每个线程负责执行其中一部分代码,以达到加速程序运行的目的。 synchronized是Java中实现线程同步的关键字,它可以用来修饰方法或对象。当一个方法或一个对象被synchronized关键…

    Java 2023年5月19日
    00
  • MyBatis 核心配置文件及映射文件详解

    来详细讲解一下“MyBatis 核心配置文件及映射文件详解”的攻略。 MyBatis 核心配置文件 MyBatis 核心配置文件是 MyBatis 使用的基本配置文件,用于配置数据库连接、事务管理等基本信息。下面是 MyBatis 核心配置文件的配置选项: 属性配置 MyBatis 核心配置文件的属性配置包括以下信息: environment(必须配置):设…

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