×

java聊天室

java聊天室(java聊天室界面如何做)

admin admin 发表于2023-10-27 01:59:01 浏览35 评论0

抢沙发发表评论

本文目录

java聊天室界面如何做

JAVA聊天室要用到:Swing图形用户界面。JAVA中数据库的操作,以及JAVA中网络的连接当把这些知识学好,做一个聊天室应该是不成问题的。Swing图形用户界面:实现窗口的显示。数据库的操作实现用户登录,聊天记录存储等功能。网络连接实现不同客户端聊天。==

我做java的简易聊天室,已经可以群聊和私聊,如何把创建房间加进去,且只能同一个房间里才能群聊和私聊

我说下思路:1、客户端创建房间时给每个房间分配惟一的一个房间ID,房间是公开的,每个连接的客户端都可以看到,房间属性,比如密码,比如黑名单,房间保存在Server内存当中,如果你使用了集群,建议存储到分布式缓存当中(Redis是最好的选择,其次是memcached),当创建完成后,将房间信息发送给所有客户端。新客户端连接进来时,客户端要主动从服务端拉取房间信息。建议采用服务端主动通知(房间增减,服务端主动通知给所有客户端)和客户端定时轮询(客户端起个定时任务,每隔一定时间主动向服务端拉取房间列表)的方式来保证房间列表的动态更新。2、当客户端选择加入房间时,如果设置有加入条件,比如密码,那就提示客户端输入,如果是其他条件就判断加入客户端是否符合这个条件。服务端保存房间同客户端的关联关系(可以设计成一对多,也就是一个客户端只能在一个房间聊天,也可以设计成多对多,一个客户端可以同时加入多个房间聊天,主要看设计),并将这个消息通知给这个房间所有的客户端列表“欢迎***进入房间”(消息的发送者为系统,房间ID这个房间的ID,接收人无,表示是这个房间的公开消息,消息内容即:欢迎***进入房间。)3、把聊天内容当成消息的话,那消息应该有这样的属性,发送人,房间ID(如果没有房间ID就当成系统公告消息,在所有房间显示),接收人(如果没有指定接收人,则是公开消息,如果有接收人,就是私聊消息,只能在同一个房间私聊,那在发消息的时候要判断下接收客户端的是否在这个房间列表当中)。4、再来说消息路由设置,当客户端发送消息时,根据房间ID,找到这个这个房间内所有的客户端列表,如果没有指定接收人,那消息就推送给这个房间关联的所有客户端,如果指定有接收人,接收人不在这个房间,直接提示“***已经离开”,如果还在就把消息推送给这个指定的客户端。5、房间的管理:踢人,把这个客户端从房间同客户端关联关系解除,并在房间显示消息“***被踢出房间”等等

java语音聊天室怎样实现啊

实现java语音聊天室的方法很简单,要么自己从零研发,要么直接使用别人的成品,意思是找网上的第三方,他们自己有研发产品的。建议考虑ZEGO即构科技,他们的语聊房SDK很好用的,提供低延迟和低成本的方案供选择,在保障语音质量的前提下,码率最低可到8kbps,可以试试。

java的一个简单聊天室的系统结构,大概的跟我说一下

定义要求:⑴完善的支持中文。由于Java编译器版本及运行环境的差异等原因,在Java语言的中文处理中常出现乱码等现象,表现在中文显示与网络传输不正常、中文不能输入等方面。在这个聊天室系统中我们将彻底解决中文的兼容性问题。⑵具有健壮性。即聊天室系统能够处理各种异常,能够识别和控制客户端的各种行为,能够返回清理不正常退出后所分配的系统资源,能够踢出超时连接用户以减轻服务器负载等。虽然Java语言本身能够自动收集处理无用的对象,但我们仍然需要作一定的清理工作。⑶广泛的适应性。因为我们不能要求聊天用户必须使用某种浏览器或操作系统,因此所编写的Java程序,尤其是Applet,必须能在各种平台的各个版本的浏览器上都能正常运行。考虑到网络用户的使用情况,我们定的标准是能适应以下版本的浏览器:Netscape 3.x,Netscape Communicator 4.x,Internet Explorer 3.x、4.x、5.x中英文版。设计实现:基于Java的Web聊天室系统包括聊天服务器和客户端两部分。聊天服务器是一个Java Application,与Web服务器程序运行在同一机器上。客户端部分即是一个含Java Applet的HTML页面,它由Web服务器传送给客户端浏览器,交由浏览器的Java虚拟机(VM)解释执行。该Applet初始化后与聊天服务器进行连接,聊天服务器对于每个连接请求产生一个连接线程(Connection Thread),来维护和管理与该客户端的会话。客户端的发言被传送到服务器端后由其向其他客户进行广播(Broadcast),达到相互聊天的目的。 在聊天服务器中,我们使用哈希表(Hashtable)来存储所有的连接线程。主线程为ChatServer,对于每个新的客户连接请求产生一个Connection线程。同时我们还运行了一个检查线程CheckActiveTimer,它相当于一个定时器,每隔一定时间就扫描所有的客户连接线程(即扫描Hashtable),检查每个客户连接是否超时(例如很长时间没有发言或者死机),并给出警告或直接踢出(Kick)用户。

JAVA简单C/S聊天室程序~~~

package JavaNet;import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;import javax.swing.DefaultComboBoxModel;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JSplitPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class ClientOneToOne_ClientFrame extends JFrame { private JTextField tf_newUser; private JList user_list; private JTextArea ta_info; private JTextField tf_send; PrintWriter out;// 声明输出流对象 private boolean loginFlag = false;// 为true时表示已经登录,为false时表示未登录 /** * Launch the application * * @param args */ public static void main(String args) { EventQueue.invokeLater(new Runnable() { public void run() { try { ClientOneToOne_ClientFrame frame = new ClientOneToOne_ClientFrame(); frame.setVisible(true); frame.createClientSocket();// 调用方法创建套接字对象 } catch (Exception e) { e.printStackTrace(); } } }); } public void createClientSocket() { try { Socket socket = new Socket(“127.0.0.1“, 1978);// 创建套接字对象 out = new PrintWriter(socket.getOutputStream(), true);// 创建输出流对象 new ClientThread(socket).start();// 创建并启动线程对象 } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } class ClientThread extends Thread { Socket socket; public ClientThread(Socket socket) { this.socket = socket; } public void run() { try { BufferedReader in = new BufferedReader(new InputStreamReader( socket.getInputStream()));// 创建输入流对象 DefaultComboBoxModel model = (DefaultComboBoxModel) user_list .getModel();// 获得列表框的模型 while (true) { String info = in.readLine().trim();// 读取信息 if (!info.startsWith(“MSG:“)) { boolean itemFlag = false;// 标记是否为列表框添加列表项,为true不添加,为false添加 for (int i = 0; i 《 model.getSize(); i++) { if (info.equals((String) model.getElementAt(i))) { itemFlag = true; } } if (!itemFlag) { model.addElement(info);// 添加列表项 } else { itemFlag = false; } } else { ta_info.append(info + “\n“);// 在文本域中显示信息 if (info.equals(“88“)) { break;// 结束线程 } } } } catch (IOException e) { e.printStackTrace(); } } } private void send() { if (!loginFlag) { JOptionPane.showMessageDialog(null, “请先登录。“); return; } String sendUserName = tf_newUser.getText().trim(); String info = tf_send.getText();// 获得输入的信息 if (info.equals(““)) { return;// 如果没输入信息则返回,即不发送 } String receiveUserName = (String) user_list.getSelectedValue();// 获得接收信息的用户 String msg = sendUserName + “:发送给:“ + receiveUserName + “:的信息是: “ + info;// 定义发送的信息 if (info.equals(“88“)) { System.exit(0);// 如果没输入信息是88,则退出 } out.println(msg);// 发送信息 out.flush();// 刷新输出缓冲区 tf_send.setText(null);// 清空文本框 } /** * Create the frame */ public ClientOneToOne_ClientFrame() { super(); setTitle(“客户端一对一通信——客户端程序“); setBounds(100, 100, 385, 288); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JPanel panel = new JPanel(); getContentPane().add(panel, BorderLayout.SOUTH); final JLabel label = new JLabel(); label.setText(“输入聊天内容:“); panel.add(label); tf_send = new JTextField(); tf_send.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { send();// 调用方法发送信息 } }); tf_send.setPreferredSize(new Dimension(180, 25)); panel.add(tf_send); final JButton button = new JButton(); button.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { send();// 调用方法发送信息 } }); button.setText(“发 送“); panel.add(button); final JSplitPane splitPane = new JSplitPane(); splitPane.setDividerLocation(100); getContentPane().add(splitPane, BorderLayout.CENTER); final JScrollPane scrollPane = new JScrollPane(); splitPane.setRightComponent(scrollPane); ta_info = new JTextArea(); scrollPane.setViewportView(ta_info); final JScrollPane scrollPane_1 = new JScrollPane(); splitPane.setLeftComponent(scrollPane_1); user_list = new JList(); user_list.setModel(new DefaultComboBoxModel(new String { ““ })); scrollPane_1.setViewportView(user_list); final JPanel panel_1 = new JPanel(); getContentPane().add(panel_1, BorderLayout.NORTH); final JLabel label_1 = new JLabel(); label_1.setText(“输入用户名称:“); panel_1.add(label_1); tf_newUser = new JTextField(); tf_newUser.setPreferredSize(new Dimension(180, 25)); panel_1.add(tf_newUser); final JButton button_1 = new JButton(); button_1.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { if (loginFlag) { JOptionPane.showMessageDialog(null, “在同一窗口只能登录一次。“); return; } String userName = tf_newUser.getText().trim();// 获得登录用户名 out.println(“用户:“ + userName);// 发送登录用户的名称 out.flush();// 刷新输出缓冲区 tf_newUser.setEnabled(false); loginFlag = true; } }); button_1.setText(“登 录“); panel_1.add(button_1); }}package JavaNet;import java.awt.BorderLayout;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.util.Hashtable;import java.util.Iterator;import java.util.Set;import javax.swing.JFrame;import javax.swing.JScrollPane;import javax.swing.JTextArea;public class ClientOneToOne_ServerFrame extends JFrame { private JTextArea ta_info; private ServerSocket server; // 声明ServerSocket对象 private Socket socket; // 声明Socket对象socket private Hashtable《String, Socket》 map = new Hashtable《String, Socket》();// 用于存储连接到服务器的用户和客户端套接字对象 public void createSocket() { try { server = new ServerSocket(1978); while (true) { ta_info.append(“等待新客户连接......\n“); socket = server.accept();// 创建套接字对象 ta_info.append(“客户端连接成功。“ + socket + “\n“); new ServerThread(socket).start();// 创建并启动线程对象 } } catch (IOException e) { e.printStackTrace(); } } class ServerThread extends Thread { Socket socket; public ServerThread(Socket socket) { this.socket = socket; } public void run() { try { BufferedReader in = new BufferedReader(new InputStreamReader( socket.getInputStream()));// 创建输入流对象 while (true) { String info = in.readLine();// 读取信息 String key = ““; if (info.startsWith(“用户:“)) {// 添加登录用户到客户端列表 key = info.substring(3, info.length());// 获得用户名并作为键使用 map.put(key, socket);// 添加键值对 Set《String》 set = map.keySet();// 获得集合中所有键的Set视图 Iterator《String》 keyIt = set.iterator();// 获得所有键的迭代器 while (keyIt.hasNext()) { String receiveKey = keyIt.next();// 获得表示接收信息的键 Socket s = map.get(receiveKey);// 获得与该键对应的套接字对象 PrintWriter out = new PrintWriter(s .getOutputStream(), true);// 创建输出流对象 Iterator《String》 keyIt1 = set.iterator();// 获得所有键的迭代器 while (keyIt1.hasNext()) { String receiveKey1 = keyIt1.next();// 获得键,用于向客户端添加用户列表 out.println(receiveKey1);// 发送信息 out.flush();// 刷新输出缓冲区 } } } else {// 转发接收的消息 key = info.substring(info.indexOf(“:发送给:“) + 5, info .indexOf(“:的信息是:“));// 获得接收方的key值,即接收方的用户名 String sendUser = info.substring(0, info .indexOf(“:发送给:“));// 获得发送方的key值,即发送方的用户名 Set《String》 set = map.keySet();// 获得集合中所有键的Set视图 Iterator《String》 keyIt = set.iterator();// 获得所有键的迭代器 while (keyIt.hasNext()) { String receiveKey = keyIt.next();// 获得表示接收信息的键 if (key.equals(receiveKey) && !sendUser.equals(receiveKey)) {// 如果是发送方,但不是用户本身 Socket s = map.get(receiveKey);// 获得与该键对应的套接字对象 PrintWriter out = new PrintWriter(s .getOutputStream(), true);// 创建输出流对象 out.println(“MSG:“+info);// 发送信息 out.flush();// 刷新输出缓冲区 } } } } } catch (IOException e) { ta_info.append(socket + “已经退出。\n“); } } } /** * Launch the application * * @param args */ public static void main(String args) { ClientOneToOne_ServerFrame frame = new ClientOneToOne_ServerFrame(); frame.setVisible(true); frame.createSocket(); } /** * Create the frame */ public ClientOneToOne_ServerFrame() { super(); setTitle(“客户端一对一通信——服务器端程序“); setBounds(100, 100, 385, 266); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JScrollPane scrollPane = new JScrollPane(); getContentPane().add(scrollPane, BorderLayout.CENTER); ta_info = new JTextArea(); scrollPane.setViewportView(ta_info); }}

怎么用java做局域网的聊天工具(聊天室)

呵呵,楼主您好!要用Java做聊天室说简单也不简单,但是说难呢也不难.说简单点,就是会话跟踪技术(我个人这样理解).要做聊天室,您需要使用到的工具: tomcat 服务器(因为是免费的,其他也可以哦,呵呵).Myeclipse(sun公司提供的编写Java程序的工具,别说你不知道哈,哪样的话我就晕倒了哦,呵呵)页面框架的设计:index.jsp(聊天室主页面)index_top.jsp(聊天室的顶部页面) usersonline.jsp(在线人数的统计及显示页面) sendMessage.jsp(发送信息的页面)showMessage.jsp(显示聊天信息的页面)register.jsp(用户注册的页面)login.jsp(用户登录页面)当然,这是最简单的设计方式咯.您也可以设计得更好点.页面介绍与功能:index.jsp 主要是聊天室的主页面.由上中下3个框架组成,中间部分在分为左右2个框架.实际上index.jsp就是一个由于5个框架组成的页面顶部框架:放index_top.jsp页面.可以设计自己聊天室的特色(比如说:logo)中间部分的左边框架:showMessage.jsp 显示聊天的信息中间部分的右边框架:usersonline.jsp(在线人数的统计及显示页面)底部框架:sendMessage.jsp 这个发送信息的jsp页面.不多说吧聊天室的框架的设计大楷就是这样子咯实现聊天:1.编写一个servlet,用户处理的信息(包括验证用户是否登录和聊天信息)。2.用户发送信息之后,将发送的信息存放到Application中(群聊)(放在session中就是私聊)3.显示信息的页面每个XX秒中获取session或者Application中的数据显示出来就OK了更多的东西还是需要您学习Ajax之后再做,会有不一样的效果哦。祝您成功哟.呵呵