即时聊天

实现多个用户之间的类似于QQ的聊天(仅文字信息)

package xiangmu;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;

public class QQServer {

    public static void main(String[] args) {
        //声明存放所有人的socket集合
                HashMap<String,Socket> hm=new HashMap<>();
        try {
            //8000端口监听
            ServerSocket ss=new ServerSocket(8000);
            System.out.println("服务器正在8000端口监听.......");
            while(true)
            {
               Socket s =ss.accept();
               MyService t = new MyService();
               //将HashMap的引用传入服务线程
               t.setHashMap(hm);
               t.setSocket(s);
               t.start();
            }
        }
         catch (Exception e) {
            e.printStackTrace();
        }

}
    }
package xiangmu;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.HashMap;

public class MyService extends Thread {

    private Socket  s;
    private HashMap<String,Socket> hm;
    public void setSocket(Socket value)
    {
        s = value;
    }
    public void setHashMap(HashMap<String, Socket> hm) {
        this.hm=hm;
    }
     @Override
    public void run() {
          try {
                // 接收用户名和密码
              InputStream is  = s.getInputStream();
              InputStreamReader isr = new InputStreamReader(is);
              BufferedReader br = new BufferedReader(isr);
              String  uandp = br.readLine();
              //检查
              //System.out.println(uandp);
              //拆分用户名和密码
              String  u = uandp.split("%")[0];
              String  p = uandp.split("%")[1];
              OutputStream os = s.getOutputStream();
              OutputStreamWriter osw = new OutputStreamWriter(os);
              PrintWriter pw = new PrintWriter(osw,true);
              //文件验证
              File f= new File("user.txt");
              FileReader fr = new FileReader(f);
              BufferedReader br1 = new BufferedReader(fr);
              boolean  b = false;
              while(br1.ready())
              {
                  String userpass = br1.readLine();
                  String user = userpass.split("%")[0];
                  String pass = userpass.split("%")[1];
                  if (u.equals(user)  && p.equals(pass))
                  {
                      b = true;
                      break;
                  }
              }

              if (b)
              {
                  //发送正确信息到客户端
                  pw.println("ok");
              //将本人的名字发送给其他用户
                  for(Socket ts:hm.values())
                  {
                      OutputStream tos = ts.getOutputStream();
                        OutputStreamWriter tosw = new OutputStreamWriter(tos);
                        PrintWriter tpw = new PrintWriter(tosw,true);
                        tpw.println("add%"+u);
                  }
                  //将其他人的名字发送给自己
                  for(String tu:hm.keySet())
                  {
                      pw.println("add%"+tu);
                  }
                  //将本人的用户名存入到HashMap
                  hm.put(u, s);

                  //不断接收客户端发送过来的信息
                  while(true)
                  {
                  String message = br.readLine();
                  if(message.equals("{exit}"))
                      //将该用户从HashMap中删除
                  {
                      hm.remove(u);
                      //通知所有人,本用户退出
                      for(Socket ts:hm.values())
                      {
                          OutputStream tos = s.getOutputStream();
                            OutputStreamWriter tosw = new OutputStreamWriter(tos);
                            PrintWriter tpw = new PrintWriter(tosw,true);
                            tpw.print("exit%"+u);

                      }
                      return;
                  }
                  System.out.println(message);
                  }
              } else{
                  //发送错误的信息到客户端
                  pw.println("error");
              }
                  }
        catch (Exception e) {

        }
                  }
    }

在MyService中接收并发送验证信息,发送到QQ,界面

这是登录界面,如果输入错误账户或者密码,会弹出用户密码错误窗口,在这里使用了这个语句

JOptionPane.showMessageDialog(this, "用户名密码错误");

登录正确后

登录到界面,多账号登录会在分组自动上线显示账号

点击打开聊天窗口你,实现互发信息,显示在显示面板

下一步期望:

1、可以现在用户之间的文件传输

2、能够发送简单的表情

3、界面优化

时间: 2024-10-10 03:23:22

即时聊天的相关文章

php+ajax长轮询实现web即时聊天

web im的实现方式有很多种: 1.普通轮询,原理通过js定时重复发送ajax请求服务端,获取数据后显示. 2.长轮询,ajax请求服务端,服务端有数据会立即返回,服务端无数据时,会一直等待,直到有数据了才立即范围. 3.socket长连接. 特征分析: 方法1:实现起来最容易,定时重复请求服务端会产生无意义的http连接,消耗服务端资源,实时性较差. 方法2:实现起来较容易,会减少无效的ajax请求产生的http连接,能即时返回数据,但服务端会一直挂着,会消耗一定的资源,处理并发能力不强,比

高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框

上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输入时显示一个提示字符串.由于Background对ComboBox无效,所以直接通过Background来实现是不行了.需要重新写ComboBox的模板,也就是Template,自定义一个模板来实现这个结果.又看了一下QQ的下拉框,这玩意不自定义也难以实现,所以就干脆自定义了. 先上代码,先是Com

nodejs即时聊天

一直想做一个即时聊天的应用,前几天看到了socket.io,感觉还不错,自己略加修改,感觉挺不错的.官网上给的例子很简单,下面改进了一点,实现了历史消息的推送. demo地址:chat.androiddevelop.cn 其中服务器端代码: var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var history = new Ar

ios开发xmpp仿微信即时聊天工具

最近在做一个项目,需要一个即时聊天工具,先打算有第三方环信(http://www.easemob.com),但是最终老板不允许,要自己开发用自己的服务器,哎!如果有需要的可以去看看这个环信,真的不错.进入今天的主题,其实也是大神们开发的,我在这只是把一些细节理一下让大家你能少走一点弯路,需要的资料和源码这里面都有http://pan.baidu.com/s/1nt5esnn. 详细的介绍看这http://blog.csdn.net/kangx6/article/details/7740135,看

高仿QQ即时聊天软件开发系列之二登录窗口界面

继上一篇高仿QQ即时聊天软件开发系列之一开端之后,开始做登录窗口 废话不多说,先看效果,只有界面 可能还有一些细节地方没有做,例如那个LOGO嘛,不要在意这些细节 GIF虽短,可是这做起来真难,好吧因为我没玩过WPF所以难,因为感觉做出来之后也就那样 整体布局 整体是上下分,下面是左中右分 1 <Grid> 2 <Grid.RowDefinitions> 3 <RowDefinition Height="27"><!--用于放窗口右上角关闭.最

ajax长轮询实现即时聊天室

前段js: //处理ajax长轮询 $(function(){ ask_order(); function ask_order(){ var ask_action = "{:U('index/order_commet',array('time'=>10,'desk_id'=>$desk_id))}"; $.ajax({                    type:"GET",                    dataType:"jso

iOS通过SocketRocket实现websocket的即时聊天

之前公司的即时聊天用的是常轮循,一直都觉得很不科学,最近后台说配置好了socket服务器,我高兴地准备用asyncsocket,但是告诉我要用websocket,基于HTML5的,HTML5中提出了一种新的双向通信协议--WebSocket,本文尝试采用这种技术来实现以上的实时聊天功能. 在搜索了很多资料后,用square大神的SocketRocket进行实现,会比较简单,同时URL和端口,发送消息参数需要和后台约定好. 首先pod导入SocketRocket platform :ios, '7

Dollars即时聊天客户端应用源码

这个源码项目是一款Dollars即时聊天客户端应用源码,源码也比较简单的,希望这个案例能够帮到大家的学习和使用. 源码下载: http://code.662p.com/view/6725.html     An Instant Message Client by XMPP on iPhone使用XMPP实现的iPhone上的聊天工具.只完成了一小部分功能. 登录和注册; 获取联系人列表; 添加好友; 接受好友; 与好友聊天; 获取多人聊天房间列表; 加入房间; 房间内多人聊天; 修改个人状态;目

搜索dwr做即时聊天的时候看到的问题

我用dwr做了个网页版即时聊天,当用户a和b聊天时没问题a和b各打开一个窗口a窗口,b窗口进行聊天,问题是当第三个用户c也和b聊天时,按照平常的聊天软件比如qq,b用户会再打开个和c聊天的窗口b2,但是一个用户id只能绑定一个scriptsession,b用户再打开个又绑定了一个,此问题怎么解决 做的时候看看怎么解决.

tomcat websocket 实现网页在线即时聊天

背景介绍 近一个月完成了公司的一个项目,负责即时聊天部分 寻找了一下,决定使用websocket,要问原因的话,因为tomcat 自带相关消息收发的API,用起来方便 闲话少叙,进入实现步骤 使用工具  java 1.6      tomcat 7.0.27以上版本(以下版本不支持websocket),本人使用的是 7.0.42版本 先概括说一下:(看着迷糊没关系,下面有提供完整源码,可以下载后运行 ,结合效果自行分析) 先写一个,消息处理类,继承 tomcat的catalina.jar的Mes