java学习之利用TCP实现的简单聊天示例代码

下面是关于“java学习之利用TCP实现的简单聊天示例代码”的完整攻略。

什么是TCP?

TCP,即传输控制协议,是一种在网络中传输的协议。它能够保证数据的完整性、顺序性和传输可靠性。在网络通信中,TCP是最常见、最重要的传输协议之一。

利用TCP实现的简单聊天示例代码

下面,我将提供一段使用Java编写的利用TCP实现的简单聊天示例代码,可以让你更好地理解TCP的相关知识。

代码实现

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

public class ChatClient {
    private Socket socket = null;
    private BufferedReader console = null;
    private DataOutputStream dos = null;
    private DataInputStream dis = null;
    private boolean flag = true;

    public ChatClient() {
        try {
            console = new BufferedReader(new InputStreamReader(System.in));
            socket = new Socket("localhost", 9999);
            dos = new DataOutputStream(socket.getOutputStream());
            dis = new DataInputStream(socket.getInputStream());
            System.out.print("请输入用户名: ");
            String name = console.readLine();
            send(name);
            System.out.println("连接成功,可以开始聊天!");
        } catch (IOException e) {
            flag = false;
            closeAll();
            System.out.println("服务器连接异常。");
        }
    }

    private void send(String message) {
        try {
            dos.writeUTF(message);
            dos.flush();
        } catch (IOException e) {
            flag = false;
            closeAll();
            System.out.println("发送信息异常。");
        }
    }

    private void receive() {
        try {
            String message = dis.readUTF();
            System.out.println(message);
        } catch (IOException e) {
            flag = false;
            closeAll();
            System.out.println("接受信息异常。");
        }
    }

    public void start() {
        while (flag) {
            try {
                String message = console.readLine();
                send(message);
                if (message.equals("bye")) {
                    flag = false;
                }
            } catch (IOException e) {
                flag = false;
                closeAll();
                System.out.println("发送信息异常。");
            }
            receive();
        }
    }

    private void closeAll() {
        try {
            if (console != null) console.close();
            if (dos != null) dos.close();
            if (dis != null) dis.close();
            if (socket != null) socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ChatClient client = new ChatClient();
        client.start();
    }
}

代码说明

通过上述Java代码,你可以创建一个用于简单聊天的客户端,该客户端基于TCP协议实现,支持输入用户名进行连接,和发送消息获取服务器响应聊天,具体功能如下:

  • 在连接服务器时,需要输入用户名,用于进行身份验证。
  • 发送消息后,会等待服务器响应后再显示聊天内容。
  • 输入bye可退出。

示例一

首先,在命令提示符(cmd)下,进入服务器端的所在文件目录,并输入以下命令启动服务器端:

>java ChatServer

此时,服务端会监听端口9999,并处于等待状态。接下来,在另一个命令提示符中,进入客户端所在目录,并输入以下命令启动客户端:

>java ChatClient

客户端向服务器发送连接请求,并提示用户输入用户名,用户输入用户名后,即可进行聊天。

示例二

接下来,我们可以通过改写程序代码实现多人聊天室功能。

首先,将ChatClient改为MultiChatClient,并创建一个客户端列表:

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

public class MultiChatClient {

    private Socket socket = null;
    private BufferedReader console = null;
    private DataOutputStream dos = null;
    private DataInputStream dis = null;
    private boolean flag = true;
    private List<Client> clients = new ArrayList<Client>();

    public MultiChatClient() {
        try {
            console = new BufferedReader(new InputStreamReader(System.in));
            socket = new Socket("localhost", 9999);
            dos = new DataOutputStream(socket.getOutputStream());
            dis = new DataInputStream(socket.getInputStream());
            System.out.print("请输入用户名: ");
            String name = console.readLine();
            send(name);
            System.out.println("连接成功,可以开始聊天!");
            new Thread(new Receive()).start();
        } catch (IOException e) {
            flag = false;
            closeAll();
            System.out.println("服务器连接异常。");
        }
    }

    public void start() {
        while (flag) {
            try {
                String message = console.readLine();
                send(message);
                if (message.equals("bye")) {
                    flag = false;
                }
            } catch (IOException e) {
                flag = false;
                closeAll();
                System.out.println("发送信息异常。");
            }
        }
    }

    public void send(String message) {
        try {
            dos.writeUTF(message);
            dos.flush();
        } catch (IOException e) {
            flag = false;
            closeAll();
            System.out.println("发送信息异常。");
        }
    }

    private void closeAll() {
        try {
            if (console != null) console.close();
            if (dos != null) dos.close();
            if (dis != null) dis.close();
            if (socket != null) socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        MultiChatClient client = new MultiChatClient();
        client.start();
    }

    class Receive implements Runnable {
        public void run() {
            try {
                while (flag) {
                    String message = dis.readUTF();
                    System.out.println(message);
                }
            } catch (IOException e) {
                flag = false;
                closeAll();
                System.out.println("接收信息异常。");
            }
        }
    }

    class Client {
        private String name;
        private DataOutputStream dos;

        public Client(String name, DataOutputStream dos) {
            this.name = name;
            this.dos = dos;
        }

        public String getName() {
            return name;
        }

        public DataOutputStream getDos() {
            return dos;
        }
    }
}

然后,更新ChatServer程序,以便监听多个客户端,并为每个客户端分配一个对应的线程:

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

public class ChatServer {
    private boolean flag = true;
    private ServerSocket server = null;

    // 客户端对象列表
    private List<Client> clients = new ArrayList<Client>();

    public ChatServer() {
        try {
            server = new ServerSocket(9999);
            System.out.println("服务器启动成功。");
        } catch (IOException e) {
            flag = false;
            System.out.println("服务器启动异常。");
        }
    }

    // 运行服务器程序
    public void start() {
        while (flag) {
            try {
                Socket socket = server.accept();
                DataInputStream dis = new DataInputStream(socket.getInputStream());
                String name = dis.readUTF();

                // 将新客户端加入客户端对象列表中
                Client client = new Client(name,socket);
                clients.add(client);
                System.out.println("新客户端[" + name + "]连接成功。");

                // 为新客户端分配线程,用于接收信息
                new Thread(new Receive(client)).start();
                send("新客户端[" + name + "]加入聊天室。",client);
            } catch (IOException e) {
                flag = false;
                System.out.println("接收信息异常。");
            }
        }
    }

    // 关闭服务器程序
    public void close() {
        try {
            if (server != null) {
                server.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 广播消息
    private void send(String message) {
        for (int i = 0; i < clients.size(); i++) {
            Client c = clients.get(i);
            try {
                DataOutputStream dos = c.getDos();
                dos.writeUTF(message);
                dos.flush();
            } catch (IOException e) {
                flag = false;
                System.out.println("发送信息异常。");
                clients.remove(c);
                i--;
            }
        }
    }

    // 向指定客户端发送消息
    private void send(String message, Client client) {
        try {
            DataOutputStream dos = client.getDos();
            dos.writeUTF(message);
            dos.flush();
        } catch (IOException e) {
            flag = false;
            System.out.println("发送信息异常。");
        }
    }

    class Receive implements Runnable {
        private Client client;

        public Receive(Client client) {
            this.client = client;
        }

        public void run() {
            try {
                DataInputStream dis = new DataInputStream(client.getSocket().getInputStream());
                while (flag) {
                    String message = dis.readUTF();
                    System.out.println(client.getName() + ": " + message);
                    send(client.getName() + ": " + message,client);
                    if (message.equals("bye")) {
                        flag = false;
                    }
                }
                dis.close();
                if (client != null) {
                    clients.remove(client);
                    System.out.println("[Client " + client.getName() + "]已断开连接。");
                    send("[Client " + client.getName() + "]已退出聊天室。");
                }
            } catch (IOException e) {
                flag = false;
                clients.remove(client);
                System.out.println("接收消息异常。");
                send("[Client " + client.getName() + "]已退出聊天室。");
            }
        }
    }

    class Client {
        private String name;
        private Socket socket;
        private DataOutputStream dos;

        public Client(String name, Socket socket) {
            this.name = name;
            this.socket = socket;
            try {
                dos = new DataOutputStream(socket.getOutputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public String getName() {
            return name;
        }

        public Socket getSocket() {
            return socket;
        }

        public DataOutputStream getDos() {
            return dos;
        }
    }

    public static void main(String[] args) {
        ChatServer server = new ChatServer();
        server.start();
    }

}

这样,我们就可以通过一定的改写,将上述简单聊天示例代码改为多人聊天室,实现了多人聊天。

以上就是本篇的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java学习之利用TCP实现的简单聊天示例代码 - Python技术站

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

相关文章

  • spring对JDBC和orm的支持实例详解

    Spring对JDBC和ORM的支持实例详解 Spring框架是一个非常流行的应用程序开发框架,它提供了许多不同的特性和功能来帮助开发者构建高质量的应用程序。其中,Spring对JDBC和ORM的支持特性是非常重要的,今天我们将对此进行详细讲解。 JDBC支持 JDBC是Java Database Connectivity的缩写,是Java平台上的一种用于访…

    Java 2023年5月20日
    00
  • Sprint Boot @ConditionalOnProperty使用方法详解

    @ConditionalOnProperty是Spring Boot中的一个注解,它用于根据配置属性的值来决定是否启用或禁用某个组件。在使用Spring Boot开发应用程序时,@ConditionalOnProperty是非常有用的。本文将详细介绍@ConditionalOnProperty的作用和使用方法,并提供两个示例说明。 @ConditionalO…

    Java 2023年5月5日
    00
  • 通过Java压缩JavaScript代码实例分享

    关于通过Java压缩JavaScript代码,建议可以遵循以下攻略: 第一步:下载并安装压缩工具terser terser是一个JavaScript压缩工具,可以通过NPM来下载和安装。首先需要安装Node.js,然后运行以下命令: npm install terser -g 第二步:编写Java代码调用terser进行压缩 编写Java代码调用terser…

    Java 2023年5月23日
    00
  • Java连接mysql数据库并进行内容查询的方法

    当你需要使用Java语言连接MySQL数据库并进行内容查询的时候,需要遵循以下几个步骤: 导入相关的Java包和MySQL驱动程序。可以通过在代码中使用import语句导入相关的Java包,如java.sql.*,同时也需要将MySQL驱动程序导入项目中。可以将MySQL驱动程序放在项目的lib目录下,在项目的构建路径中加入该库。 建立与MySQL数据库的连…

    Java 2023年5月20日
    00
  • SpringMVC JSON数据交互实现过程解析

    SpringMVC JSON数据交互实现过程解析 在 SpringMVC 中,我们可以使用 JSON 数据格式来进行数据交互。本文将详细讲解 SpringMVC JSON 数据交互实现过程的原理和步骤,包括如何使用 @RequestBody 注解来接收 JSON 数据、如何使用 MappingJackson2HttpMessageConverter 来将 J…

    Java 2023年5月18日
    00
  • JAVA用递归实现全排列算法的示例代码

    全排列算法是一个经典的、递归思想的算法,它将一组数据按照一定顺序排列,使得每个数据都和其他数据组成一组不同的排列。在JAVA中,我们可以利用递归的思想来实现全排列算法。以下是针对该问题的完整攻略: 1. 全排列算法的基本原理: 全排列算法的基本原理是:对于一个长度为n的序列,全排列可分解为两部分:固定第一个元素,对剩余的n-1个元素进行全排列;再将每一个排列…

    Java 2023年5月26日
    00
  • Spring Security 核心过滤器链讲解

    Spring Security 是基于 Spring 框架的一个安全框架,可用于在 Web 应用程序中添加身份验证和授权的安全性。在 Spring Security 中,过滤器链起着至关重要的作用。本文将从以下几个方面详细讲解 Spring Security 核心过滤器链的完整攻略: Spring Security 核心过滤器链简介 Spring Secur…

    Java 2023年6月3日
    00
  • Java 对 Properties 文件的操作详解及简单实例

    Java 对 Properties 文件的操作详解及简单实例 在Java中,Properties文件是一种常见的配置文件格式,通常用于编写和读取应用程序的配置信息和设置属性。Properties文件是一种文本文件,内容以”key=value”的形式存储,可以使用Java代码来读取和写入。 读取 Properties 文件 为了读取Properties文件,需…

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