基于JAVA的聊天(ICQ)系统的设计于实现

一、绪论

ICQ是英文"I seek you "的简称,中文意思是我找你。ICQ最大的功能就是即时信息交流,只要记得对方的号码,上网时可以呼他,无论他在哪里,只要他上网打开ICQ,人们就可以随时交流。ICQ源于以色列特拉维夫的Mirabils公司。该公司成立于1996年7月,也就是在这个时候,互联网上最出名,下载使用人数最多的免费软件ICQ诞生了。可能是其不断增加的用户和广阔的前景以及广泛的应用前景和巨大的市场潜力,Mirabils的ICQ最终被美国在线AOL收购。由于ICQ的成功,推动了ICQ的本土化,就中文的ICQ而言,现在已经越来越多,比如著名的深圳腾迅公司推出的OICQ(现在由于版权问题,已改名为QQ2001),还有由TOM.COM推出的Tomq等,这些软件技术都很好,而且简单易用,成为中国网民最喜欢的通信软件。

但是这些公司都只提供软件的客户端程序免费下载,而不提供其服务器程序,因此对于未与互联网连接的私有网络,这些软件就用不上了。当然网上也有免费的类似ICQ的服务器提供下载,但是好多都不提供源程序,即使有,其说明也很简单,我很想知道它是怎么回事,所以我就试着做了。

二、设计

1.为什么选择JAVA?


Java是Sun Microsystem公司的James Gosling开发的编程语言。它以C++为基础,但是却是一个全新的软件开发语言。Java是一个简单,面象对象,分布式,解释性,强壮,安全,与系统无关,可移植,高性能,多线程和动态的语言-------这是 Sun给Java的定义。

Sun公司的口号就是"网络就是计算机",Java能使所有东西从桌面计算平稳的转变为基于网络的计算,它是专门为此而建立的,并显然是为了完成这个任务而来的。使用Java,我们可以相对轻松的一天编写一个有条理的网络程序。今天,Java的网络功能正在飞跃发展,不断有新的特性增加到这个有价值的基础上,JavaSoft实验室正在不断努力使Java更加完善。

2.数据库设计


系统可以采用任何一种流行的,Java支持的数据库,本系统采用了Microsoft公司的SQL Server2000作为后台数据库。通过对现在流行的一些Icq的参考,建立数据库,名为javaicq,数据库共建立两个表,一个是用户的基本信息,包括呢称,Jicq号码等。一个是用户的好友表,包括用户自己的号码和好友的号码。

(1)用户的基本信息表(表名icq)

序号 字段名 含义 数据类型 NULL

1 Icqno 用户的号码 int No

2 Nickname 用户的呢称 Char No

3 Password 用户的密码 Char No

4 Status 用户在线否 Bit No

5 Ip 用户的IP地址 Char Yes

6 Info 用户的资料 Varchar Yes

7 Pic 用户的头像号 Int Yes

8 Sex 用户性别 Char Yes

9 Email 用户的email Char Yes

10 Place 用户的籍贯 Char yes

其中Icqno字段为自动增加。(其他还可以添加诸如电话号码等字段作为更多选择)

(2)用户的好友表(表名friend)

序号 字段名 含义 数据类型 NULL

1 Icqno 用户的号码 Int No

2 Friend 好友的号码 Int No

3.系统模式及程序(具体程序参看源程序)


系统采用客户/服务器摸式(如图)

服务器程序代码如下:(部分)

import java.io.*;import java.net.*;import java.sql.*;import java.util.Vector;class ServerThread extends Thread{//继承线程private Socket socket;//定义套接口private BufferedReader in;//定义输入流private PrintWriter out;//定义输出流int no;//定义申请的jicq号码public ServerThread(Socket s) throws IOException {//线程构造函数socket=s;//取得传递参数in=new BufferedReader(new InputStreamReader(socket.getInputStream()));//创建输入流out=new PrintWriter(new BufferedWriter(new    OutputStreamWriter(socket.getOutputStream())),true);//创建输出流start();//启动线程}public void run(){//线程监听函数try{ while(true){String str=in.readLine();//取得输入字符串if(str.equals("end"))break;//如果是结束就关闭连接else if(str.equals("login")) {//如果是登录try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//连接数据库Connection c=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");String sql="select nickname,password from icq where icqno=?";//准备从数据库选择呢称和密码PreparedStatement prepare=c.prepareCall(sql);//设定数据库查寻条件String icqno=in.readLine();int g=Integer.parseInt(icqno);//取得输入的jicq号码System.out.println(icqno);String passwd=in.readLine().trim();//取得输入的密码System.out.println(passwd);prepare.clearParameters();prepare.setInt(1,g);//设定参数ResultSet r=prepare.executeQuery();//执行数据库查寻if(r.next()){//以下比较输入的号码于密码是否相同String pass=r.getString("password").trim();System.out.println(pass);if(passwd.regionMatches(0,pass,0,pass.length()))
{ out.println("ok");
//如果相同就告诉客户ok
//并且更新数据库用户为在线
//以及注册用户的ip 地址//*************register ipaddressString setip="update icq set ip=? where icqno=?";PreparedStatement prest=c.prepareCall(setip);prest.clearParameters();prest.setString(1,socket.getInetAddress().getHostAddress());prest.setInt(2,g);int set=prest.executeUpdate();System.out.println(set);//*************ipaddress//set status onlineString status="update icq set status=1 where icqno=?";PreparedStatement prest2=c.prepareCall(status);prest2.clearParameters();prest2.setInt(1,g);int set2=prest2.executeUpdate();System.out.println(set2);//set online
}
//否者告诉客户失败else out.println("false");r.close();c.close();}else{ out.println("false");System.out.println("false");r.close();c.close();}}catch (Exception e){e.printStackTrace();}socket.close();}//end login//登录结束//以下为处理客户的新建请求
else  if(str.equals("new")){try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//连接数据库Connection c2=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");
String newsql="insert into icq(nickname,password,email,info,place,pic) values(?,?,?,?,?,?)";
//准备接受用户的呢称,密码,email,个人资料,籍贯,头像等信息PreparedStatement prepare2=c2.prepareCall(newsql);String nickname=in.readLine().trim();String password=in.readLine().trim();String email=in.readLine().trim();String info=in.readLine().trim();String place=in.readLine().trim();int picindex=Integer.parseInt(in.readLine());prepare2.clearParameters();prepare2.setString(1,nickname);prepare2.setString(2,password);prepare2.setString(3,email);prepare2.setString(4,info);prepare2.setString(5,place);prepare2.setInt(6,picindex);int r3=prepare2.executeUpdate();//执行数据库添加
String sql2="select icqno from icq where nickname=?";
//以下告诉客户其注册的号码PreparedStatement prepare3=c2.prepareCall(sql2);prepare3.clearParameters();prepare3.setString(1,nickname);ResultSet r2=prepare3.executeQuery();while(r2.next()){//out.println(r2.getInt(1));no=r2.getInt(1);System.out.println(no);}out.println(no);out.println("ok");
c2.close();
//完毕}catch (Exception e){e.printStackTrace();out.println("false");}socket.close();}//end new//新建用户结束//以下处理用户查找好友else if(str.equals("find")){try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection c3=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");//以下连接数据库,并且返回其他用户的呢称,性别,籍贯,个人资料等信息String find="select nickname,sex,place,ip,email,info from icq";Statement st=c3.createStatement();ResultSet result=st.executeQuery(find);while(result.next()){out.println(result.getString("nickname"));out.println(result.getString("sex"));out.println(result.getString("place"));out.println(result.getString("ip"));out.println(result.getString("email"));out.println(result.getString("info"));}//while endout.println("over");GET ICQNOint d,x;
boolean y;
//以下返回用户的jicq号码,头像号,及是否在线ResultSet iset=st.executeQuery("select icqno,pic,status from icq");while(iset.next()){d=iset.getInt("icqno");out.println(d);x=iset.getInt("pic");//pic infoout.println(x);y=iset.getBoolean("status");if (y){out.println("1");}else {out.println("0");}//System.out.println(d);}// end send jicqnoiset.close();/icqno endc3.close();result.close();}catch (Exception e){e.printStackTrace();System.out.println("false");}//socket.close();}//end find//查找好友结束//以下处理用户登录时读取其好友资料else if(str.equals("friend")){try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection c4=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");//以下连接好友表,返回用户的好友名单String friend="select friend from friend where icqno=?";PreparedStatement prepare4=c4.prepareCall(friend);prepare4.clearParameters();int icqno=Integer.parseInt(in.readLine());System.out.println(icqno);prepare4.setInt(1,icqno);ResultSet r4=prepare4.executeQuery();Vector friendno=new Vector();//该矢量保存好友号码while(r4.next()){friendno.add(new Integer(r4.getInt(1)));}//read friend info//以下告诉客户其好友的呢称,号码,ip地址,状态,头像,个人资料等信息out.println(friendno.size());for(int i=0;i<friendno.size();i++){String friendinfo="select nickname,icqno,ip,status,pic,email,info from icq where  icqno=?";PreparedStatement prepare5=c4.prepareCall(friendinfo);prepare5.clearParameters();prepare5.setObject(1,friendno.get(i));ResultSet r5=prepare5.executeQuery();boolean status;while(r5.next()){out.println(r5.getString("nickname"));out.println(r5.getInt("icqno"));out.println(r5.getString("ip"));status=r5.getBoolean("status");if (status)out.println("1");else {out.println("0");}out.println(r5.getInt("pic"));out.println(r5.getString("email"));out.println(r5.getString("info"));} //whiler5.close();
}//for
//发送完毕out.println("over");System.out.println("over");c4.close();r4.close();}catch (Exception e){e.printStackTrace();System.out.println("false");}//socket.close();}//end friend//读取好友信息完毕//以下处理用户添加好友else if(str.equals("addfriend")){System.out.println("add");try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection c6=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");//连接数据库,根据接受的用户号码及好友号码向好友表添加记录int friendicqno=Integer.parseInt(in.readLine());System.out.println(friendicqno);int myicqno=Integer.parseInt(in.readLine());System.out.println(myicqno);String addfriend="insert into friend values(?,?)";PreparedStatement prepare6=c6.prepareCall(addfriend);prepare6.clearParameters();prepare6.setInt(1,myicqno);prepare6.setInt(2,friendicqno);int  r6=0;r6=prepare6.executeUpdate();if(r6==1) System.out.println("ok  addfrien");else  System.out.println("false addfriend");}catch (Exception e){e.printStackTrace();System.out.println("false");}//socket.close();System.out.println("over addfriend");}//end addfriend//用户添加好友结束//add new friend who add me//以下处理其他用户如果加我,我就加他else if(str.equals("addnewfriend")){System.out.println("add");try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection c6=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");//连接数据库,根据接受的用户号码及好友号码向好友表添加记录int friendicqno=Integer.parseInt(in.readLine());System.out.println(friendicqno);int myicqno=Integer.parseInt(in.readLine());System.out.println(myicqno);String addfriend="insert into friend values(?,?)";PreparedStatement prepare6=c6.prepareCall(addfriend);prepare6.clearParameters();prepare6.setInt(1,myicqno);prepare6.setInt(2,friendicqno);int  r6=0;r6=prepare6.executeUpdate();if(r6==1) System.out.println("ok  addfrien");else  System.out.println("false addfriend");String friendinfo="select nickname,icqno,ip,status,pic,email,info from icq where icqno=?";//如果成功,就向用户传递好友的基本信息,比如呢称等PreparedStatement prepare5=c6.prepareCall(friendinfo);prepare5.clearParameters();prepare5.setInt(1,friendicqno);ResultSet r5=prepare5.executeQuery();boolean status;while(r5.next()){System.out.println("dsf");out.println(r5.getString("nickname"));out.println(r5.getInt("icqno"));out.println(r5.getString("ip"));status=r5.getBoolean("status");if (status)out.println("1");else {out.println("0");}out.println(r5.getInt("pic"));out.println(r5.getString("email"));out.println(r5.getString("info"));} //whileout.println("over");r5.close();c6.close();}catch (Exception e){e.printStackTrace();System.out.println("false");}System.out.println("over addnewfriend");}//end addfriend//结束处理其他用户如果加我,我就加他//delete friend//以下执行用户删除好友else if(str.equals("delfriend")){System.out.println("del");try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection c7=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");//连接数据库,根据接受的用户号码及好友号码向好友表删除记录int friendicqno=Integer.parseInt(in.readLine());System.out.println(friendicqno);int myicqno=Integer.parseInt(in.readLine());System.out.println(myicqno);String addfriend="delete from friend where icqno=? and friend=?";PreparedStatement prepare7=c7.prepareCall(addfriend);prepare7.clearParameters();prepare7.setInt(1,myicqno);prepare7.setInt(2,friendicqno);int  r7=0;r7=prepare7.executeUpdate();if(r7==1) System.out.println("ok  delfrien");//成功else  System.out.println("false delfriend");//失败}catch (Exception e){e.printStackTrace();System.out.println("del false");}}//end delete friend//执行用户删除好友结束//以下处理用户退出程序else if(str.equals("logout")){try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection c8=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");//连接数据库,根据接受的用户号码,将其状态字段设为0,及ip地址设为空int myicqno=Integer.parseInt(in.readLine());System.out.println(myicqno);String status="update icq set status=0 , ip=' ' where icqno=?";PreparedStatement prest8=c8.prepareCall(status);prest8.clearParameters();prest8.setInt(1,myicqno);int r8=prest8.executeUpdate();if(r8==1) System.out.println("ok  logout");else  System.out.println("false logout");}catch (Exception e){e.printStackTrace();System.out.println("logout false");}}//logout end//处理用户退出程序结束//get who add me as friend//以下处理那些人加了我为好友,以便上线通知他们else if(str.equals("getwhoaddme")){System.out.println("getwhoaddme");try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection c9=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");//连接数据库,根据我的号码,从好友表中选择谁加了我int myicqno=Integer.parseInt(in.readLine());System.out.println(myicqno);String getwhoaddme="select icqno from friend where friend=?";PreparedStatement prepare6=c9.prepareCall(getwhoaddme);prepare6.clearParameters();prepare6.setInt(1,myicqno);ResultSet r6=prepare6.executeQuery();Vector who=new Vector();while(r6.next()){who.add(new Integer(r6.getInt(1)));}//end while//然后告诉这些好友的ip地址,然后发给用户以便告诉其他客户我上线了for(int i=0;i<who.size();i++){String whoinfo="select ip from icq where icqno=? and status=1";PreparedStatement prepare=c9.prepareCall(whoinfo);prepare.clearParameters();prepare.setObject(1,who.get(i));ResultSet r=prepare.executeQuery();while(r.next()){out.println(r.getString("ip"));} //whiler.close();}//forout.println("over");System.out.println("over");c9.close();r6.close();}catch (Exception e){e.printStackTrace();System.out.println("false");}}//end get who add me as friend//处理上线结束System.out.println("Echo ing :"+str);}  System.out.println("Close...");}catch(IOException e){}//捕或异常finally {try{socket.close();}catch(IOException e){}}}
}public class Server{//主服务器类public static void main(String args[])throws IOException{ServerSocket s=new ServerSocket(8080);//在8080端口创建套接口System.out.println("Server start.."+s);try{while(true){Socket socket=s.accept();//无限监听客户的请求System.out.println("Connectino accept:"+socket);try{new ServerThread(socket);//创建新线程}catch(IOException e){socket.close();}}}finally{s.close();}//捕或异常}}//服务器程序结束

全部论文与代码下载:https://download.csdn.net/download/aszhangwendi/88880818

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/503577.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

防抖和节流的实现

《防抖和节流》 防抖1. 概念介绍2. 函数实现3. 应用场景 节流1. 概念介绍2. 函数实现3. 应用场景 防抖 1. 概念介绍 在没有使用防抖函数之前&#xff1a;当我们需要搜索某些物体信息时会导致浏览器压力很大&#xff0c;性能很低。"防抖函数"的作用就是等到用户停止…

YOLOv9有效提点|加入BAM、CloFormer、Reversible Column Networks、Lskblock等几十种注意力机制(二)

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、本文介绍 本文只有代码及注意力模块简介&#xff0c;YOLOv9中的添加教程&#xff1a;可以看这篇文章。 YOLOv9有效提点|加入SE、CBAM、ECA、SimA…

前端学习第二天-html提升

达标要求 了解列表的分类 熟练掌握列表的用法 熟练掌握表格的结构构成 合并单元格 表单的组成 熟练掌握表单控件分类的使用 1.列表 1.1 无序列表 <ul>&#xff1a;定义无序列表&#xff0c;并且只能包含<li>子元素。 <li>&#xff1a;定义列表项&a…

DDS数据分发服务——提升汽车领域数据传输效率

1.引言 随着智能化技术的快速发展&#xff0c;汽车行业正经历着一场革命性的变革。如今的分布式系统变得越来越复杂且庞大&#xff0c;对网络通信基数要求在功能和性能层面越来越高。数据分发服务&#xff08;DDS&#xff09;作为一项先进的数据传输解决方案&#xff0c;在汽车…

Spring-web-Mvc

文章目录 目录 文章目录 前言 1 . 什么是Spring MVC? 1.1 MVC定义 1.2 主要作用 2. Spring MVC 接受响应数据 2.1 RequestMapping注解配置访问路径 2.2 请求 2.2.1 传递单个参数 2.2.2 传递多个参数 2.2.3 传递对象 2.2.4 后端参数重命名&#xff08;后端参数映射…

桥接生物信息学和化学信息学公开的方法数据库

&#x1f31e;欢迎来到AI生物医学的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年3月1日…

使用 Docker 部署 Fiora 在线聊天室平台

一、Fiora 介绍 Fiora 简介 Fiora 是一款开源免费的在线聊天系统。 GitHub&#xff1a;https://github.com/yinxin630/fiora Fiora 功能 注册账号并登录&#xff0c;可以长久保存你的数据加入现有群组或者创建自己的群组&#xff0c;来和大家交流和任意人私聊&#xff0c;并添…

大龙谈智能内容开通视频号啦

大家好&#xff0c;大龙谈只能内容开通视频号了&#xff0c;欢迎大家扫码关注&#xff1a;

day03-Vue-Element

一、Ajax 1 Ajax 介绍 1.1 Ajax 概述 概念&#xff1a;Asynchronous JavaScript And XML&#xff0c;异步 的 JavaScript 和 XML。 作用&#xff1a; 数据交换&#xff1a;通过 Ajax 可以给服务器发送请求&#xff0c;并获取服务器响应的数据。异步交互&#xff1a;可以在 不…

SpringBoot 整合WebService

文章目录 WebService1.简单介绍WebService1.1. 类型1.2. 架构1.3. 主要特点1.4. 使用场景1.5. Web服务标准和技术 2.案例-WebServiceDemo2.1.引入配置文件2.2.创建接口2.3.创建接口实现类2.4.创建WebService配置类2.5.测试 WebService Web服务&#xff08;Web Services&#xf…

自定义BeanNameGenerator生成规则

通过点进ComponentScan注解进入源码可以看到 追随BeanNameGenerator进入源码可以看到该类是个借口且只有一个方法 点击上面黑色箭头出现两个实现方法 点击第一个方法 进入determineBeanNameFromAnnotation方法中 通过上诉自定义一个生成beanName方法 先创建一个CustomeBeanN…

idea使用maven创建springboot项目

按照图片中的流程来&#xff0c;就可以创建springboot项目&#xff0c;我这个主要是想做一个JavaWeb项目 有用的话&#xff0c;点个小赞赞再走呀~