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日

相关文章

  • 基于slf4j日志MDC输出格式的问题

    针对”基于slf4j日志MDC输出格式的问题”,我会给出完整的攻略如下: 什么是MDC? 在程序日志输出中,MDC是最常用的工具之一,全称是Mapped Diagnostic Context,它的功能是为日志输出提供上下文信息,可以理解为是一种线程级别的context。通常情况下,我们可以使用MDC来输出一些和程序运行情况相关的信息,比如用户ID、IP地址等…

    Java 2023年5月26日
    00
  • Java中的面向对象编程是什么?

    Java中的面向对象编程(Object-Oriented Programming)是一种编程理念,它是基于对象的概念而建立的,通过将数据和函数绑定到一个对象上,以实现程序的封装、继承和多态三个特性。 封装 封装是面向对象编程的一种基本特性,它允许程序员将数据和函数绑定到一个对象中,并且可以对外隐藏对象的实现细节。在Java中,我们可以通过访问修饰符(publ…

    Java 2023年4月27日
    00
  • Java非侵入式API接口文档工具apigcc用法详解

    Java非侵入式API接口文档工具apigcc用法详解 概述 apigcc是一款非侵入式的API接口文档生成工具,可以帮助Java开发人员快速生成符合RESTful标准的API接口文档,同时支持多种API文档输出格式,包括HTML、Markdown、PDF等格式。 安装 apigcc可以通过npm安装,使用如下命令即可: npm install apigcc…

    Java 2023年5月20日
    00
  • 基于StringUtils工具类的常用方法介绍(必看篇)

    基于StringUtils工具类的常用方法介绍 StringUtils是Apache Commons Lang组件库中提供的一个字符串工具类,它提供了很多方便的字符串操作方法,大大简化了Java程序中字符串处理的难度。本篇攻略将逐一介绍StringUtils工具类的常用方法,分类讲解它们的使用方法。 1. 字符串判空 1.1 isBlank方法 isBlan…

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

    @Autowired是Spring Boot中的一个注解,它用于自动装配Bean。在使用Spring Boot开发应用程序时,@Autowired是非常重要的。本文将详细介绍@Autowired的作用和使用方法,并提供两个示例说明。 @Autowired的作用 @Autowired的作用是自动装配Bean。使用@Autowired注解的属性或构造函数参数将自…

    Java 2023年5月5日
    00
  • Java中如何使用Response重定向

    在JavaWeb中,可以使用Response对象的sendRedirect()方法进行重定向操作。该方法可以让服务器重定向到别的页面,实现页面跳转的功能。 下面是在Java中如何使用Response重定向的完整攻略: 1. 导入相关的包和类库 在使用重定向功能之前,需要先导入一些需要的包和类库。 import java.io.IOException; imp…

    Java 2023年5月26日
    00
  • 如何进行Java异步编程?

    首先,为了进行Java异步编程,我们需要了解以下概念: 回调函数(Callback):是一种异步编程的实现方式,即在某个任务完成后执行的函数。 Future模式:是一种异步编程设计模式,它允许我们在执行一个任务时,不用一直等待结果,而是可以先返回一个Future对象,稍后再获取真正的结果。 CompletableFuture:是Java 8新增的一种异步编程…

    Java 2023年5月11日
    00
  • spring boot之使用spring data jpa的自定义sql方式

    下面是使用Spring Data JPA的自定义SQL方式的完整攻略。 1. 添加依赖 首先需要在项目中添加Spring Data JPA的依赖。可以在项目的Maven或Gradle配置中添加以下依赖项: <dependency> <groupId>org.springframework.boot</groupId> &l…

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