巧妙利用java实现在线聊天系统教程方法

这篇具有很好参考价值的文章主要介绍了巧妙利用java实现在线聊天系统教程方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、搭建服务器端

a)、创建ServerSocket对象绑定监听端口。
b)、通过accept()方法监听客户端的请求。
c)、建立连接后,通过输入输出流读取客户端发送的请求信息。
d)、通过输出流向客户端发送请求信息。
e)、关闭相关资源。

二、搭建客户器端

a)、创建Socket对象,指明需要连接的服务器的地址和端口。
b)、建立连接后,通过输出流向服务器发送请求信息。
c)、通过输入流获取服务器的响应信息。
d)、关闭响应资源

代码展示
服务器端代码:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;

/**

  • 版本三:转发给其他的客户端 1.保存每一个客户端的连接

*/
public class ChatSeverEdition3 {
// 服务器端是否启动
boolean started = false;
ServerSocket serverSocket = null;
ArrayList clients = new ArrayList();

public static void main(String[] args) {

    new ChatSeverEdition3().start();
}

public void start() {

    try {
        serverSocket = new ServerSocket(8888);
        started = true;
    } catch (BindException e) {
        // 多次启动服务器
        System.out.println("端口使用中。。。。");
        System.out.println("请关掉相关程序,并重新运行服务器!");
        System.exit(0);
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {

        while (started) {
            // 客户端是否连接
            Socket socket = serverSocket.accept();
            // main()方法是static方法,不能在其中new动态类Client
            Client client = new Client(socket);
            // 线程启动
            new Thread(client).start();
            // 将当前启动的客户端保存下来
            clients.add(client);
            System.out.println("new Client成功!");
            System.out.println("A Client connected!");


        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

/**
 * 
 * 
 *
 */
class Client implements Runnable {
    private Socket s;
    private DataInputStream dis = null;
    private boolean bConnected = false;
    private DataOutputStream dos;

    public Client(Socket s) {
        this.s = s;

        try {
            dis = new DataInputStream(s.getInputStream());
            dos = new DataOutputStream(s.getOutputStream());
            bConnected = true;
            System.out.println("有一个新的客户端程序在运行");
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 一个客户端连接成功以后,一直在执行该while部分的代码,其他客户端无法连接
        /**
         * 解决方法: 1.异步解决方法:一直监听接收,其他在另外的地方执行 2.使用单独的线程: 线程:接受客户端连接
         * 另外的单独的线程:处理通讯
         */

    }

    public void sendString(String str) {
        try {
            dos.writeUTF(str);
        } catch (IOException e) {
            clients.remove(this);
            System.out.println("对方退出了!!!我从List中去掉了!!!");
        }
    }

    public void run() {
        Client client = null;
        // 注意这部分的包围关系
        try {
            while (bConnected) {
                String string = dis.readUTF();
                System.out.println(string);
                for (int i = 0; i < clients.size(); i++) {
                    client = clients.get(i);
                    client.sendString(string);
                }
            }
        } catch (EOFException e) {
            System.out.println("Client closed!");
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(0);

        } finally {
            try {
                if (dis != null) {
                    dis.close();
                }
                if (s != null) {
                    s.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

}

}
客户端代码:

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

/**

  • 可以和ChatServer版本三配套使用
  • @author Administrator

*/
public class ChatClientEdition3 extends Frame {
TextField tfText = new TextField();
TextArea taContent = new TextArea();
Socket socket = null;
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
private boolean bConnected = false;

public static void main(String[] args) {

    new ChatClientEdition3().launchFrame();
}

// 加载窗口
public void launchFrame() {
    setLocation(400, 300);
    this.setSize(300, 300);
    this.setTitle("在线聊天时--Quiana");
    add(tfText, BorderLayout.SOUTH);
    add(taContent, BorderLayout.NORTH);
    pack();
    // 窗口关闭的时间监听
    this.addWindowListener(new WindowAdapter() {

        @Override
        public void windowClosing(WindowEvent e) {
            disconnect();
            System.exit(0);
        }

    });
    tfText.addActionListener(new TFListener());
    this.setVisible(true);
    connect();
    new Thread(new RecvThread()).start();
}

// 文字处理的时间监听
private class TFListener implements ActionListener {
    // 敲击回车时,文字的变化事件
    @Override
    public void actionPerformed(ActionEvent arg0) {
        String s = tfText.getText().trim(); // 去掉两端的空格
        tfText.setText("");
        try {

            dataOutputStream.writeUTF(s);
            dataOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

// 连接到服务器
public void connect() {
    try {
        // 连接到服务器
        socket = new Socket("127.0.0.1", 8888);
        bConnected = true;
        dataOutputStream = new DataOutputStream(socket.getOutputStream());
        dataInputStream = new DataInputStream(socket.getInputStream());
        System.out.println("连接到服务器!!!");
    } catch (BindException e) {
        e.printStackTrace();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

// 断开连接
public void disconnect() {
    try {
        dataOutputStream.close();
        System.out.println("dataOutputStream成功关闭");
        socket.close();
        System.out.println("客户端socket成功关闭");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private class RecvThread implements Runnable {

    public void run() {

        try {
            while (bConnected) {
                String string = dataInputStream.readUTF();
                if (taContent.getText().length() == 0) {
                    taContent.setText(string);
                } else {
                    taContent.setText(taContent.getText() + "\n" + string);
                }
            }
        } catch (SocketException e) {
            System.out.println("退出了,拜拜!");
        } catch (EOFException e) {
            System.out.println("退出了,拜拜!");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。文章来源地址https://www.toymoban.com/news/detail-482005.html

到了这里,关于巧妙利用java实现在线聊天系统教程方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot+Netty+Vue+Websocket实现在线推送/聊天系统

    ok,那么今天的话也是带来这个非常常用的一个技术,那就是咱们完成nutty的一个应用,今天的话,我会介绍地很详细,这样的话,拿到这个博文的代码就基本上可以按照自己的想法去构建自己的一个在线应用了。比如聊天,在线消息推送之类的。其实一开始我原来的想法做在

    2024年02月03日
    浏览(43)
  • 开源在线客服系统-客服系统历史消息记录功能-点击加载历史聊天记录-分页展示历史消息功能实现

    之前开发的开源在线客服系统gofly,访客端一直没有展示历史聊天记录,最近抽时间给加上了 实现的效果就是,访客刚进聊天界面,如果存在历史记录,按5条分页,默认查询加载5条聊天记录。 如果历史记录超过5条,顶部出现 “点击加载更多” 按钮,点击按钮就分页查询历

    2023年04月12日
    浏览(51)
  • 在线客服系统源码/在线对话聊天/多商户在线客服系统源码(可机器人自动聊天/支持app公众号网页H5)

    源码介绍 在线客服系统源码/在线对话聊天/多商户在线客服系统源码,它是一款基于Web的在线客服系统,适用于实现企业与客户之间的在线沟通以及咨询服务。该系统支持多商户、无限座席,可以为多个企业提供在线客服服务,不受座席数量的限制,用得起更方便了。 这个系

    2024年02月04日
    浏览(48)
  • 畅聊未来:低代码打造在线聊天系统

    前言 现代社交网络的普及使得在线聊天成为人们日常生活中不可或缺的一部分。然而,传统的开发方式往往复杂且耗时,因此寻找一种更快捷、灵活且可视化的方法来构建在线聊天系统变得尤为重要。本文将介绍如何利用低代码平台来快速搭建一个功能齐全的在线聊天系统。

    2024年02月20日
    浏览(32)
  • SpringBoot集成WebSocket实现在线聊天

    在项目过程中涉及到了在线聊天的业务,刚好有了解到WebSocket可以实现这一功能,因此便对其进行了一定的研究并做下笔记,在本文中主要借鉴了以下资源: WebSocket_百度百科 李士伟的小程序聊天工程 Springboot+Websocket中@Autowired注入service为null的解决方法 WebSocket是 HTML5规范 中

    2024年02月04日
    浏览(41)
  • WebSocket协议理解并实现在线聊天

    写在前面 WebSocket 简称 ws 本文通过介绍ws,然后一步步的使用ws协议进行前后端开发测试,最后使用 SpringBoot 和 vue 利用ws协议达实现一个在线聊天室的小demo(源码在文章末尾)。 看完此篇后将能够完成这样的小demo (需要会使用springboot和vue2以及element-ui) WebSocket是在 HTML5 开

    2024年02月04日
    浏览(35)
  • SpringBoot与webSocket实现在线聊天室——实现私聊+群聊+聊天记录保存

    引用参考:原文章地址:https://blog.csdn.net/qq_41463655/article/details/92410518 在此基础上实现对聊天记录的保存。 代码地址:链接:https://pan.baidu.com/s/1IJFZDa4S_DF08773sKJWeA 提取码:jkui 思路:新建一个实体类用于保存聊天记录,在消息发送时,设置对象的各个值然后保存到数据库中。

    2024年02月02日
    浏览(57)
  • WPF+ASP.NET SignalR实现简易在线聊天功能

    在实际业务中,当后台数据发生变化,客户端能够实时的收到通知,而不是由用户主动的进行页面刷新才能查看,这将是一个非常人性化的设计。有没有那么一种场景,后台数据明明已经发生变化了,前台却因为没有及时刷新,而导致页面显示的数据与实际存在差异,从而造

    2024年02月07日
    浏览(44)
  • C语言实现--基于UDP的多人在线聊天室

    目录 实现功能 实现思想 实现代码(部分及详解) 服务端部分代码 客户端部分代码 实现效果 项目中出现的问题和解决方法 项目整体代码展示 代码优化思路 服务端代码 客户端代码 服务端可以同时连接多个客户端; 新的客户端连接服务端时,可以在服务端显示自己的名字并

    2024年02月04日
    浏览(64)
  • 基于Unity客户端与服务端实现登录与注册以及多人在线聊天

    1.在Unity下,创建一个GameManager空对象,用于启动客户端连接以及实例化一个登录页面LoginView的Prefab,并将脚本LoginView挂载在上面。 2.创建一个Client类,用于客户端向服务端发起连接请求,并且发送给服务端消息以及接收服务端的响应 3.创建一个脚本LoginView挂载在LoginView对象上

    2024年04月16日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包