聊天室程序
网络课设

课程设计Ⅲ设计说明书用VC++6.0的Sockets API实现一个聊天室程序学生姓名高虹学号1118042026班级专升本1101成绩指导教师薛燕红数学与计算机科学学院2012年1月11日课程设计Ⅲ课程设计评阅书课程设计任务书2011 —2012学年第1 学期专业:计算机科学与技术学号:1118042026 姓名:高虹课程设计名称:计算机网络课程设计设计题目:用VC++6.0的Sockets API 实现一个聊天室程序完成期限:自2012 年 1 月 3 日至2012 年 1 月14 日共 2 周设计依据、要求及主要内容(可另加附页):一、课题背景:随着计算机信息技术的飞速发展,互联网与人类社会的工作、生活越来越紧密相关,它已经成为人类获取、交流信息的重要途径和手段。
网络编程已经成为软件开发的一个重要的研究领域。
本文利用Sockets API编写一个C/S通信网络应用程序,以实现聊天室的基本功能。
1.VC++网络编程及Windows Sockets API简介VC++对网络编程的支持有socket支持,WinInet支持,MAPI和ISAPI支持等。
其中,Windows Sockets API是TCP/IP网络环境里,也是Internet上进行开发最为通用的API。
最早美国加州大学Berkeley分校在UNIX下为TCP/IP协议开发了一个API,这个API就是著名的Berkeley Socket接口(套接字)。
在桌面操作系统进入Windows时代后,仍然继承了Socket方法。
在TCP/IP网络通信环境下,Socket数据传输是一种特殊的I/O,它也相当于一种文件描述符,具有一个类似于打开文件的函数调用-socket()。
可以这样理解:Socket实际上是一个通信端点,通过它,用户的Socket程序可以通过网络和其他的Socket应用程序通信。
Socket存在于一个"通信域"(为描述一般的线程如何通过Socket进行通信而引入的一种抽象概念)里,并且与另一个域的Socket交换数据。
用VB实现聊天讨论室和点对点会话

用VB实现聊天讨论室和点对点会话【摘要】本文将介绍如何使用VB实现聊天讨论室和点对点会话功能。
我们会详细讨论如何实现聊天室功能,包括如何创建聊天室、发送消息和接收消息等。
接下来,我们会介绍如何实现点对点会话功能,即两个用户之间的私密聊天。
然后,本文会讨论程序的设计和实现细节,包括用户界面设计和网络通信实现。
我们会总结本文的内容,并展望未来发展方向。
通过本文的学习,读者将了解如何利用VB语言来实现聊天功能,并可以根据本文中的实现方式进行相应的开发和应用。
【关键词】- VB- 聊天讨论室- 点对点会话- 程序设计- 用户界面设计- 网络通信实现- 总结- 未来发展展望1. 引言1.1 背景介绍聊天室和点对点会话是网络通信中常见的功能,可以让用户实现即时的文字交流和沟通。
随着互联网的普及和发展,人们越来越需要方便快捷的沟通工具来进行交流和交友。
开发一个基于VB的聊天讨论室和点对点会话程序是非常有必要的。
通过这样的程序,用户可以实时发送和接收消息,与他人进行交流,分享信息和想法。
实现聊天讨论室和点对点会话功能不仅可以满足用户的实时通讯需求,还可以帮助开发者提升编程能力和实践技能。
随着技术的不断进步,这样的程序也有着广阔的发展前景和应用场景。
2. 正文2.1 实现聊天讨论室功能我们需要建立一个服务器来作为聊天讨论室的中心。
这个服务器负责接受用户的连接请求,管理用户之间的消息交流。
当用户登录到聊天讨论室时,服务器需要将用户的消息发送给其他在线用户。
服务器还需要保存所有用户的聊天记录,以便用户可以查看历史消息。
我们需要实现用户之间的消息发送和接收功能。
用户可以通过客户端软件向服务器发送消息,在服务器上经过处理后再转发给目标用户。
用户可以选择在聊天室中发言,也可以私聊某个特定的用户。
这样就实现了用户之间的即时通讯功能。
为了提高聊天讨论室的用户体验,我们可以加入一些额外的功能,如消息提醒、表情符号、文件传输等。
这些功能可以让用户更加方便地进行交流,增强用户的参与感和互动性。
linux下聊天室课程设计

linux下聊天室课程设计一、课程目标知识目标:1. 掌握Linux操作系统的基本命令和操作方法;2. 了解网络编程的基本概念,掌握套接字编程的基础知识;3. 学会使用Linux下的C语言编写简单的聊天室程序。
技能目标:1. 能够熟练运用Linux命令行操作,进行基本的文件管理和网络配置;2. 能够运用所学网络编程知识,独立设计并实现一个简单的聊天室程序;3. 提高问题解决能力,能够分析和解决聊天室程序中遇到的问题。
情感态度价值观目标:1. 培养学生对Linux操作系统的兴趣和热情,激发探索操作系统的欲望;2. 培养学生团队协作意识,学会与他人共同解决问题;3. 增强学生的网络安全意识,养成安全使用网络的良好习惯。
分析课程性质、学生特点和教学要求:1. 课程性质:本课程属于信息技术学科,以实践操作为主,理论讲解为辅;2. 学生特点:学生处于高年级阶段,已具备一定的编程基础和计算机操作能力;3. 教学要求:注重理论与实践相结合,培养学生的动手能力和实际操作能力。
二、教学内容1. Linux操作系统基本命令与操作:文件管理、目录操作、文本编辑等;教材章节:第一章 Linux操作系统基础;进度安排:2课时。
2. 网络编程基本概念:TCP/IP协议、套接字编程等;教材章节:第二章 网络编程基础;进度安排:3课时。
3. C语言网络编程:socket函数、bind函数、listen函数、accept函数、send函数、recv函数等;教材章节:第三章 C语言网络编程;进度安排:4课时。
4. 聊天室程序设计:客户端与服务器端程序设计,多线程实现;教材章节:第四章 聊天室程序设计;进度安排:5课时。
5. 聊天室程序调试与优化:程序调试技巧,性能优化方法;教材章节:第五章 聊天室程序调试与优化;进度安排:2课时。
6. 课程总结与拓展:总结所学知识,探讨聊天室程序在实际应用中的改进与拓展;教材章节:第六章 课程总结与拓展;进度安排:1课时。
SimpleChat程序(一对多聊天源代码 java)

package com.wyh.chatRoom;import java.awt.BorderLayout;import java.awt.Color;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 .InetAddress;import .ServerSocket;import .Socket;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTabbedPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.JToolBar;public class wyhChatRoom extends JFrame implements ActionListener{ private String name; //服务器聊天室的图形用户界面private JComboBox combox; //网名private JTextField text; //输入IP地址或域名的组合框private JTabbedPane tab; //选项卡窗格,每页与一个Socket通信public wyhChatRoom(int port ,String name) throws IOException{super("聊天室"+name+" "+InetAddress.getLocalHost()+"端口:"+port);this.setBounds(320, 240, 440, 240);this.setDefaultCloseOperation(EXIT_ON_CLOSE);JToolBar toolbar=new JToolBar(); //工具栏this.getContentPane().add(toolbar,"North");toolbar.add(new JLabel("主机"));combox=new JComboBox();combox.addItem("127.0.0.1");toolbar.add(combox);combox.setEditable(true);toolbar.add(new JLabel("端口"));text=new JTextField("1251");toolbar.add(text);JButton button_connect=new JButton("连接");button_connect.addActionListener(this);toolbar.add(button_connect);tab=new JTabbedPane(); //选项卡窗口this.setBackground(Color.blue);this.getContentPane().add(tab);this.setVisible(true);=name;while(true){Socket client=new ServerSocket(port).accept();//等待接受客户端的连接申请tab.addTab(name, new TabPageJPanel(client));//tab添加页,页中添加内部类面板tab.setSelectedIndex(tab.getTabCount()-1);//tab指定新页为选择状态port++;}}public void actionPerformed(ActionEvent e){if(e.getActionCommand()=="连接"){String host=(String)combox.getSelectedItem();int port=Integer.parseInt(text.getText());try{tab.addTab(name, new TabPageJPanel(new Socket(host,port)));//连接成功tab添加页tab.setSelectedIndex(tab.getTabCount()-1);//tab指定新页为选中状态}catch(IOException e1){e1.printStackTrace();}}}//面板内部类,每个对象表示选项卡窗格的一页,包含一个Socket和一个线程private class TabPageJPanel extends JPanel implements Runnable,ActionListener{Socket socket;Thread thread;JTextArea text_receiver;//显示对话内容的文本区JTextField text_sender; //输入发送内容的文本行JButton buttons[]; //发送‘离线’删除页按钮PrintWriter cout; //字符输出流对象int index;TabPageJPanel(Socket socket) {super(new BorderLayout());this.text_receiver=new JTextArea();this.text_receiver.setEditable(false);this.add(new JScrollPane(this.text_receiver));JPanel panel=new JPanel();this.add(panel,"South");this.text_sender=new JTextField(16);panel.add(this.text_sender);this.text_sender.addActionListener(this);String strs[]={"发送","离线","删除页"};buttons =new JButton[strs.length];for (int i = 0; i < buttons.length; i++) {buttons[i]=new JButton(strs[i]);panel.add(buttons[i]);buttons[i].addActionListener(this);}buttons[2].setEnabled(false);this.socket=socket;this.thread=new Thread(this);this.thread.start();}@Overridepublic void run() {try {this.cout =new PrintWriter(socket.getOutputStream(),true);this.cout.println(name);//发送自己网名给对方BufferedReader cin=new BufferedReader(new InputStreamReader(socket.getInputStream()));String name=cin.readLine(); //接收对方网名index=tab.getSelectedIndex();tab.setTitleAt(index, name);String aline=cin.readLine();while(aline!=null && !aline.equals("bye")){tab.setSelectedIndex(index);text_receiver.append(aline+"\r\n");Thread.sleep(1000);aline=cin.readLine();}cin.close();cout.close();socket.close();buttons[0].setEnabled(false);//接收方的发送按钮无效buttons[1].setEnabled(false);//接收方的离线按钮无效buttons[2].setEnabled(false);//接收方的删除按钮无效} catch (Exception e) {e.printStackTrace();}}@Overridepublic void actionPerformed(ActionEvent e) {if(e.getActionCommand()=="发送"){this.cout.println(name+"说:"+text_sender.getText());text_receiver.append("我说:"+text_sender.getText()+"\n");text_sender.setText("");}if(e.getActionCommand()=="离线"){text_receiver.append("我离线\n");this.cout.println(name+"离线\n"+"bye");buttons[0].setEnabled(false);buttons[1].setEnabled(false);buttons[2].setEnabled(false);}}}public static void main(String[] args) throws IOException {new wyhChatRoom(2001, "航哥哥");//启动服务端,约定端口,指定网名}}。
20款网页聊天工具比下载一个聊天程序简单多了

20款网页聊天工具,比下载一个聊天程序简单多了!因为要做一个网上聊天室,网上搜罗了一下,有些是网站程序,这些只要输如以下代码甚至只要一个不存在的网址即可!Meebo 称得上网页聊天的元老,有几十种国家语言版本,能很好的支持中文。
支持AIM、Yahoo!、MSN、Google Talk、ICQ以及Jabber。
用户可自定义Widget的标题和联系人名称,大小和颜色。
网址:/ ebuddy 2003年就推出了网页式聊天。
支持的IM包括MSN、AIM、Yahoo、GTalk、ICQ 以及Myspace。
另外,如果你的手机设备支持xHTML或者WAP ,就可以利用eBuddy的移动版本进行聊天了。
如手机访问就可通过ebuddy登陆msn 了。
网址:/ radiusIM 基于Ajax技术构建的在线web聊天服务,试用感觉不是很稳定,速度也比较慢.。
支持的IM: Yahoo, AIM, MSN 以及GTalk。
radiusIM会自动检测你的地址位置,并在radiusIM中置入Google Map标识这个位置。
通过拖拉Google Map,你能发现在地图中标注出来的各地会员。
如果你想去某个城市旅游,通过radiusIM的地图找位会员先了解情况倒是不错的方法。
网址:/ 会将读者的聊天信息发送到博客作者或者网站管理员的即时通信软件。
几乎支持所有网站程序(例如WordPress、blogger、Facebook等)以及多国家和地区语言,支持ichat、adium、Jabber与Google Talk等即时聊天软件,并且具有很好的可定制性。
博客作者或者网站管理员最多可同时与5名读者交流。
值得一提的是,会在用户第一次打开聊天窗口时就和服务器建立Session和Cookie,以确保用户在关闭浏览器以后下次再次访问该站点时仍然能够收到站长回复的消息。
详细介绍网址:/ Toksta 是一款包括文字、语音及视频的网页聊天工具。
网络程序设计考试大作业

ﻩﻩﻩﻩnewThread(hs)、start();
ﻩﻩﻩ}
ﻩ}catch(IOExceptione){
ﻩSystem、out、println(”客户连接服务器失败”);
ﻩ}
ﻩ}
}
ﻩ//内部类处理一个Socket,接收一个Client发送过来得消息,并且服务器原封不动得返回给所有客户端,客户端对消息进行过滤
ﻩﻩSocketclient=clientConnection、get(i);
ﻩﻩOutputStreamos=client、getOutputStream();
ﻩPrintStreamps=newPrintStream(os);
ﻩﻩﻩﻩps、println(s);
ﻩﻩﻩﻩ}
ﻩﻩ}while(flag);
网络程序设计考试大作业
题目:聊天室程序
班级:
学号:
姓名:
成绩:
网络程序设计考试大作业ﻩ1
二。 程序设计思想及程序设计流程框图ﻩ3
三.主要代码及代码运行结果ﻩ4
1、启动服务器ﻩ4
2、登录ﻩ6
3、注册ﻩ10
4、 登录与注册判定ﻩ12
5、进入聊天界面ﻩ13
6、私聊页面17
一
背景:根据现在最流行得聊天工具QQ,模仿一部分主要功能来完成.
ﻩﻩﻩInputStreamis=client、getInputStream();
ﻩInputStreamReaderisr=newInputStreamReader(is);
ﻩBufferedReaderbr=newBufferedReader(isr);
ﻩﻩSystem、out、println(”第"+clientNum+”个客户端连接进入服务器");
Java课程设计聊天室(含代码)

Java程序课程设计任务书JAVA聊天室的系统的设计与开发1.主要内容:用JAVA实现基于C/S模式的聊天室系统。
聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的信息,客户端需要登陆到服务器端才可以实现正常的聊天功能。
2.具体要求(包括技术要求等):系统的功能要求:A.服务器端主要功能如下:1.在特定端口上进行侦听,等待客户端连接。
2.用户可以配置服务器端的侦听端口,默认端口为8888。
3.向已经连接到服务器端的用户发送系统消息。
4.统计在线人数。
5.当停止服务时,断开所有的用户连接。
B.客户端的主要功能如下:1.连接到已经开启聊天服务的服务器端。
2.用户可以配置要连接的服务器端的IP地址和端口号。
3.用户可以配置连接后显示的用户名。
4.当服务器端开启的话,用户可以随时登录和注销。
5.用户可以向所有人或某一个人发送消息。
学习并掌握一下技术:Java JavaBean 等熟练使用一下开发工具:Eclipse, JCreator 等实现系统上诉的功能。
3.进度安排:12月28日 ~ 12月29日:课程设计选题,查找参考资料12月30日 ~ 1月1日:完成系统设计1月2日 ~ 1月5日:完成程序代码的编写1月6日:系统测试与完善1月7日:完成课程设计报告,准备答辩4.主要参考文献:[1].张广彬孟红蕊张永宝.Java课程设计(案例精编)[M].清华大学出版社.2007年版摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。
基于Java网络编程的强大功能,本次毕业设计使用Java编写一个聊天系统。
一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式通过Java提供的Soket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能用多线程可完成多点对多点的聊天,数据库管理系统用SQL Server2000完成并通过JDBC-ODBC桥访问数据库。
网络程序设计考试大作业

网络程序设计考试大作业题目: 聊天室程序班级:学号:姓名:成绩:网络程序设计考试大作业 (1)一. 所使用的背景知识、主要函数的描述 (3)二. 程序设计思想及程序设计流程框图 (3)三. 主要代码及代码运行结果 (4)1.启动服务器 (4)2.登录 (6)3.注册 (10)4.登录和注册判定 (12)5.进入聊天界面 (13)6.私聊页面17一. 所使用的背景知识、主要函数的描述背景:根据现在最流行的聊天工具QQ, 模仿一部分主要功能来完成。
主要函数:public class Server;服务器的创建。
public class Client;客户端的创建。
public class UserInformation;用户信息的保存和验证。
二. 程序设计思想及程序设计流程框图设计思想:利用socket与server socket在客户端与客户端之间的通信, InputStream InputStreamReader输入输出流进行信息的发送与接收。
程序设计流程:主页面: 输入账号与密码, 点击登录或者注册进入下一页面。
登录:判定是否正确, 正确则进去聊天界面。
注册: 进去注册界面, 成功则返回主页面。
进入聊天室: 能发送信息让在线的所有人看到。
私聊界面:能与一个人单独聊天, 信息只能被双方看到。
三. 主要代码及代码运行结果1.启动服务器代码:public class Server {ServerSocket server ;static int clientNum = 0;// 存放与服务器连接上的对应的Socket, 作用是保存服务器与客户端之间的流, 便于服务器给每个客户端进行回发消息List<Socket> clientConnection = new ArrayList<Socket>();public Server() {try {server = new ServerSocket(9999);System.out .println("服务器已经启动");} catch (IOException e ) {e .printStackTrace();System.out .println("服务器启动失败");}}// 内部类, 监听客户端是否有连接到服务器, 并将此客户端的Socket传递给HandleSocket进行处理, 同时将client存放到List中, 即clientConnection中class SocketListener implements Runnable {public void run() {Socket client;try {while (true) {client = server.accept();// 连接上一个就压入List中, 即clientConnection中clientConnection.add(client);HandleSocket hs = new HandleSocket(client);// 连接上就让HandleSocket去处理new Thread(hs).start();}} catch (IOException e) {System.out.println("客户连接服务器失败");}}}// 内部类处理一个Socket,接收一个Client发送过来的消息, 并且服务器原封不动的返回给所有客户端, 客户端对消息进行过滤class HandleSocket implements Runnable {Socket client;HandleSocket(Socket client) {this.client = client;}public void run() {try {clientNum++;// 启用输入流InputStream is = client.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);System.out.println("第" + clientNum + "个客户端连接进入服务器");boolean flag = true;String s;do {// 对用户发来的消息进行群发给客户端s = br.readLine();System.out.println("接受到一个客户端消息: " + s);for (int i = 0; i < clientConnection.size(); i++) {Socket client = clientConnection.get(i);OutputStream os = client.getOutputStream();PrintStream ps = new PrintStream(os);ps.println(s);}} while (flag);client.close();} catch (IOException e) {System.out.println("有一个客户断开与服务器的连接");}}}界面:2.登录代码:package com.qq.main;import java.awt.Color;import java.awt.Dimension;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPasswordField;import javax.swing.JTextField;import com.qq.regist.Regist;import erInformation;/*** 主界面*/public class Main extends JFrame {//组件的内容private JLabel userId;private JLabel userPassword;private JTextField inputId;private JPasswordField inputPassword;private JButton btLogin;private JButton btRegist;Main() {userId = new JLabel("帐号");userPassword = new JLabel("密码");inputId = new JTextField(6);inputPassword = new JPasswordField();btLogin = new JButton("登陆");btRegist = new JButton("注册");// 设置窗体属性Toolkit tk = Toolkit.getDefaultToolkit();Dimension screenSize = tk.getScreenSize();//得到当前屏幕的长和宽int x = (int) screenSize.getWidth();int y = (int) screenSize.getHeight();this.setBounds((x - 240) / 2, (y - 600) / 2, 240, 600);//窗口显示的大小 , 位置this.setResizable(false);//窗口大小不能改变this.setLayout(null);//默认的格式this.setBackground(Color.BLACK);// 窗口的颜色this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出程序// 设置JLabel属性userId.setBounds(30, 160, 40, 20);userPassword.setBounds(30, 200, 40, 20);// 设置文本域属性inputId.setBounds(90, 160, 100, 20);inputPassword.setBounds(90, 200, 100, 20);inputPassword.setEchoChar('*');//用*显示代替你输入的密码// 设置JButton属性btLogin.setBounds(50, 240, 60, 20);btRegist.setBounds(120, 240, 60, 20);// 注册“登陆”按钮监听器btLogin.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {UserInformation user = new UserInformation();String userName = inputId.getText();String userPassword = new String(inputPassword.getPassword());if (userName.equals("")) {JOptionPane.showMessageDialog(null, "用户名不能为空");} else if ("".equals(userPassword)) {JOptionPane.showMessageDialog(null, "密码不能为空");} else if (user.isExist(userName)&& erInfomation.getProperty(userName).equals(userPassword)) {new AllTalkFrame(userName).setVisible(true);// 判断成功后new一个群聊窗口Main.this.dispose();} else {JOptionPane.showMessageDialog(null, "此用户名不存在或者密码不正确");}}});// 注册“注册”按钮监听器btRegist.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {new Regist();//注册页面}});this.add(userId);this.add(userPassword);this.add(inputId);this.add(inputPassword);this.add(btLogin);this.add(btRegist);this.setVisible(true);}public static void main(String[] args) {new Main();}}界面:3.注册代码:// 注册“提交”按钮的监听器btSubmit.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String userName = inputId.getText();String userPassword = newString(inputPassword.getPassword());String userPasswordConfirm= new String(inputPasswordConfirm.getPassword());System.out.println("您点击了提交按钮");if (userName.equals("")) {JOptionPane.showMessageDialog(null, "用户名不能为空");} else if ("".equals(userPassword)|| "".equals(userPasswordConfirm)) {JOptionPane.showMessageDialog(null, "密码和密码重复都不能为空");} else if (!userPassword.equals(userPasswordConfirm)) {JOptionPane.showMessageDialog(null, "密码和密码重复不一致");} else {UserInformation user = new UserInformation();if (user.isExist(userName)) {JOptionPane.showMessageDialog(null, "此用户名已存在");} else {JOptionPane.showMessageDialog(null, "注册成功");user.insert(userName,userPassword);//UserInformation类Regist.this.dispose();}}}});// 注册“取消”按钮的监听器btCancel.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.out.println("您点击了取消按钮");Regist.this.dispose();}});界面:4.登录和注册判定代码://注册一个用户public void insert(String userName, String userPassword) { try {userInfomation = new Properties();InputStream is;OutputStream os;is = new ("c:/userInfo.properties");os = new ("c:/userInfo.properties", true);userInfomation.load(is);// 将用户名和密码存储到内存中userInfomation.setProperty(userName, userPassword);// 将用户名和密码保存到文件中userInfomation.store(os, null);} catch ( e1) {System.out.println("文件userInfo.properties没有找到 ");} catch (IOException e) {System.out.println("写 userInfo.properties 出错");}}//判断此用户名是否存在public boolean isExist(String userName) {try {userInfomation = new Properties();InputStream is;is = new ("c:/userInfo.properties");userInfomation.load(is);if (userInfomation.containsKey(userName)) {return true;}} catch ( e1) {System.out.println("文件userInfo.properties没有找到 ");} catch (IOException e) {System.out.println("写 userInfo.properties 出错");}return false;}5.进入聊天界面代码:class showOldMessageThread implements Runnable {public void run() {boolean flag = true;while (flag) {try {// 接收群聊服务器端回发过来的消息String serverOutput = client.br.readLine() + "\r\n";if (!serverOutput.startsWith("私聊")&& !serverOutput.startsWith("*")&& !(serverOutput.substring(serverOutput.indexOf(": ") + 1).equals("\r\n"))) {String s1 = serverOutput.replace('说', ' ');String s = s1.replaceAll("�", "\r\n ");oldMessageTextArea.append(s);}// 添加客户端的用户在线列表if (!serverOutput.startsWith("*")&& !serverOutput.startsWith("私聊")&& (serverOutput.indexOf("说") != -1)) {String listName = serverOutput.substring(0,serverOutput.indexOf('说'));// 如果JList中有相同名字的用户, 则不添加, 否则添加if (!users.contains(listName)) {System.out.println("用户" + listName + "上线了");users.add(listName);userList.setListData(users);}}// 判断服务器回发过来的消息是不是以"私聊"开头的, 是的话就提取出这两个用户名if (serverOutput.startsWith("私聊")) {String siliaoName1 = serverOutput.substring(serverOutput.indexOf("*") + 1, serverOutput.indexOf("和"));String siliaoName2 = serverOutput.substring(serverOutput.indexOf("和") + 1, serverOutput.indexOf("\r"));String siliaoBenshen = "";String siliaoDuixiangName = "";if (siliaoName1.equals(clientName)) {siliaoBenshen = siliaoName1;siliaoDuixiangName = siliaoName2;} else {siliaoBenshen = siliaoName2;siliaoDuixiangName = siliaoName1;}// 判断这两个名字中是否有与自己同名的, 有的话就弹出个私聊窗口if (siliaoName1.equals(clientName)|| siliaoName2.equals(clientName)) {new PointToPointTalkFrame(siliaoBenshen + "和"+ siliaoDuixiangName).setVisible(true);}}} catch (IOException e1) {System.out.println("读取服务器端消息出错");}}}}// 注册JList的点击事件, 进入私聊界面userList.addMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent e) {if (e.getClickCount() == 2) {if (erList.getSelectedValue().toString().equals(clientName)) {JOptionPane.showMessageDialog(null, "不能和自己聊天");} else {String PToPMemberName = "私聊"+ "*"+ clientName+ "和"+erList.getSelectedValue().toString();client.ps.println(PToPMemberName);}}}});界面:6.私聊页面代码:// 线程: 只要服务器端有消息, 就将消息显示到oldMessageTextAreaclass showOldMessageThread implements Runnable {public void run() {boolean flag = true;while (flag) {try {// 接收服务器端回发过来的消息String serverOutput = client.br.readLine() + "\r\n";System.out.println("私聊服务器发过来的消息: " + serverOutput);// 将消息中的两个用户名提取出来String s1 = "";if (serverOutput.startsWith("私聊")) {String[] s;if (serverOutput.startsWith("私聊*")) {s = serverOutput.substring(3,serverOutput.indexOf("\r")).split("和");} else {s = serverOutput.substring(2,serverOutput.indexOf("说")).split("和");}for (int i = 0; i < s.length; i++) {s1 = s1 + s[i];}}// 将标题中的两个用户名提取出来,有两种顺序String[] title = clientName.split("和");String s2 = "";for (int i = 0; i < title.length; i++) {s2 = s2 + title[i];}String s3 = "";for (int i = title.length - 1; i >= 0; i--) {s3 = s3 + title[i];}// 判断服务器端返回消息中的两个用户名等于客户端的两个用户名(忽略顺序), 则将消息显示出来(也就是显示在私聊窗口上)if (s1.equals(s2) || s1.equals(s3)) {String ss1 = serverOutput.substring(2, serverOutput.indexOf("和"));String ss2 = serverOutput.substring(serverOutput.indexOf(": "));// 将私聊客户端返回来的一行字符串按"�"进行拆分成多行, 显示在私聊的oldMessageArea中if (ss2.indexOf("�") != -1) {ss2 = ss2.replaceAll("�", "\r\n ");}oldMessageTextArea.append(ss1 + ss2);}} catch (IOException e1) {System.out.println("读取服务器端消息出错");}}}}界面:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录1 引言 (1)1.1项目背景 (1)1.2国内外研究现状 (2)1.3主要思路 (2)2 需求分析 (4)2.1设计目标 (4)2.2开发环境 (4)2.3功能要求 (4)2.4实现效果 (5)2.5网络聊天室系统E-R图 (6)3 系统概要设计 (7)3.1需求规定 (7)3.2系统层次结构 (7)3.3系统数据结构设计 (8)3.4系统流程图 (9)4 详细设计及编码方式 (11)4.1登录功能模块设计 (11)4.2注册功能模块设计 (13)4.3房间选择功能模块设计 (14)4.4聊天室主界面设计 (16)4.4.1聊天室整体框架设计 (16)4.4.2导航区设计 (18)4.4.3显示在线区用户设计 (19)4.4.4显示聊天信息区设计 (20)4.4.5发送信息区设计 (21)4.5修改密码功能模块设计 (23)4.6选择头像功能模块设计 (25)4.7用户管理功能模块设计 (26)5 系统测试 (29)5.1系统测试目标 (29)5.2系统测试内容 (29)5.3系统测试结论 (30)6 结论 (31)参考文献 (32)致谢 (33)1引言1.1项目背景21世纪的一些重要特征就是数字化、网络化和信息化,它是一个以网络为核心的信息时代。
要实现这些就要依靠完善的网络,因此网络现在已经成为信息社会的命脉和发展知识经济的重要基础。
网络对社会生活的方方面面已经产生了不可估量的影响[1]。
截止2010年6月底,我国网民规模达4.2亿,互联网普及率持续上升增至31.8%,这其中手机网民增长明显,半年内新增4334万,达到2.77亿人[2]。
我国网民的互联网应用表现出商务化程度迅速提高、娱乐化倾向继续保持、沟通和信息工具价值加深的特点。
社交网站、即时通信使用率增长较快,半年用户增长19.6%和11.7%[3]。
由于交通的发达,现代人会经常地流动,因此面对面的亲身交流往往不可企及。
而网络恰好就为这些希望能够经常交流的人们提供了加强联系、增进交流的平台。
社交网络源自网络社交,网络社交的起点是电子邮件。
早期的电子邮件解决了远程邮件传输的问题,至今它也是互联网上最普及的应用,而后BBS把网络社交推进了一步。
即时通信的出现更像是前面两个社交工具的升级版本,提高了即时效果和同时交流能力[4]。
社科院2005年调查关注了人们使用这些网络交流工具的情况,调查表明,人们最常用的网络交流工具为电子邮件,其次是ICQ和聊天[5]。
聊天室作为因特网应用工具之一,在社会上起着越来越重要的作用。
70年代末,有一种冒险游戏,在这个游戏中,就有一些对话,它帮助了互联网中聊天室的诞生。
也就是IRC。
IRC是芬兰人Jarkko Oikarnen于1988年首创的一种在网络中进行聊天的协议。
直到今天,大部分聊天室都会以IRC为基础。
网络聊天室刚开始的时候是以文本聊天为主,后来出现了语音聊天,到了今天,视频、语音、文字都很好的融入到了聊天工具当中。
网络聊天之所以不同于现实聊天,是因为网络聊天是在虚拟的环境中完成的,从某种意义上讲,网络聊天是现实聊天的延伸。
虚拟的网络聊天客服了现实聊天中的空间限制,是的聊天的空间大大的扩展了。
网络聊天因其技术的发展实现了空间的无限扩展,形成了只要有互联网,不同地方的人们就可以聊天的状况,使得现实生活的交往范围大大扩展了。
随着互联网技术的不断发展,衍生出各种形式的非文字类的交互式媒体元素,如FLASH、流媒体、互动白板等。
这些元素在2004年后逐步被整合到了具有实时互动性概念的网络聊天室应用。
而此时,聊天室的概念也逐步转向所谓“富媒体交互服务房间” [6]。
随着互联网人数的不断增多,聊天室还会有更大的发展。
1.2国内外研究现状在国内许多网站开设了聊天室,比如“新浪网”聊天室、“263在线”、“网易”聊天室等。
而人气最旺的,莫过于有“全球最大中文聊天社区”之称的“新浪网”聊天室。
该网站为不同年龄、不同职业、不同地区、不同爱好的网友量身定制了数百个不同主题的房间[7]。
在国外,也出现了很多的聊天室,比如Omegle、Facebook、MSN、MySpace等。
在这些聊天室中,Omegle聊天室比较特别,这是一个针对陌生人交流的Web产品,这个网站与众不同之处就在于能够随机的向每位用户推送一个陌生人与之进行交流。
在这里,你不会知道对方的任何信息,所有的信息被红色的“Stranger”一词代替,因此会给人一种全新的感觉[8]。
网络聊天室带来了很多便利,但也出现了一些问题。
以在线聊天这种方式出现的网络人际沟通,数量及其巨大,参与对话的人数众多,但与现实不同的是,良好沟通并不多见,通常一个人以他人的顺利交流是以数倍于此甚至更多的沟通失败为代价的[9]。
同时,由于网上聊天室中,没有规范,没有固定感;人们来去自由,甚至仅仅只有相互的问候,它只是一种表达情感的介质,而且人们往往在表达是不考虑后果[10]。
所以在网络聊天中出现了很多不良的信息,对于青少年的健康成长是很不利的[11]。
但是随着技术的不断提高,这些必定会被改进。
1.3主要思路一般的在线聊天室体系结构都包括数据库设计、数据访问层、业务逻辑层和页面显示层。
数据库设计是最基础的工作,数据库的设计模型是整个系统设计的基础,一旦确定了数据库的结构,在开发过程中不要轻易地修改,否则会对后面的工作造成巨大的影响[12]。
数据访问层完成所有与数据库的交互操作。
业务逻辑层实现在线聊天室系统的所有业务逻辑,包括用户管理和发表信息的管理等。
页面显示层用于实现最终显示在浏览器上的用户可以看到的界面,其主要功能包括业务逻辑层的调用、动态显示数据以及显示方式等[13,14]。
一般在设计程序前,需要对系统功能进行分析,并确定数据库中数据表机存储过程的定义。
而一般的聊天室具有以下的功能:(1)采用数据库记录在线用户信息及聊天信息;(2)登录及注册功能;(3)群聊与私聊功能;(4)聊天用户实时更新等。
俗话说“三分技术,七分管理,十二分基础数据”,可见数据库的设计也是十分重要的。
数据库设计步骤为:(1)需求分析;(2)概念结构设计;(3)逻辑结构设计;(4)物理结构设计;(5)数据库实施;(6)数据库运行和维护[15]。
本系统采用语言编写,并结合数据库,完成一个具有登录、注册、选择聊天室、群聊、私聊等功能的在线聊天室。
2需求分析该部分主要叙述了该网络聊天室系统的设计目标、拥有的功能以及实现后的应具有的效果。
2.1设计目标该系统为一个在线聊天室的网站,除了具备所有聊天室的基本功能外,在设计以及实施的过程中要尽可能做到使该聊天室系统具有易操作性、良好的扩展性、易用性等特性,确保在未来的安装、管理、运行维护中,使普通用户和专业管理人员得到最大的方便。
2.2开发环境开发环境为:(1)SQL Server 2008数据库工具;(2)Windows Visual Studio 2010 编程软件。
2.3功能要求该网络聊天室系统使用人员分为两类,一类为普通用户,另一类为管理员用户,他们具有不同的功能。
普通用户是该系统的实际使用者,他们具有聊天室中的基本功能,包括:注册与登录、选择房间、群聊与私聊、更换头像和修改密码等功能。
管理员是该系统的管理人员,他们除具有普通用户的基本功能外,还具有管理普通用户的功能,具体为:设置黑名单。
根据系统功能的不同,系统的功能结构图分三部分,第一部分为总的功能结构图,第二部分是普通用户的功能结构图,第三部分是管理员的功能结构图。
总的功能结构图如图2.1。
图2.1系统总功能结构图普通用户功能结构图如图2.2。
图2.2普通用户功能结构图管理员功能结构图如图2.3。
图2.3 管理员功能结构图2.4实现效果该聊天室拥有两种不同的用户身份:普通用户和管理员。
在登录时需要判断用户身份,当用户名、密码和身份输入正确进入后,用户将选择所要进入的聊天室,该系统默认设置了四个聊天室供用户选择。
选择聊天室进入后,是聊天界面,聊天界面由三部分组成,分为显示在线用户、聊天信息显示和发送信息。
显示在线用户是统计在线人数并列表显示,用户名列表中将显示用户头像和用户的用户名。
聊天信息显示分为群聊信息显示和私聊信息显示。
在聊天界面的菜单中有修改密码、退出和修改头像的功能。
修改头像可以选择自己喜爱的头像,系统有十五个头像供用户选择。
管理员除了具有这些普通用户的基本功能外,还具有管理用户的功能,可以将某个用户加入黑名单,黑名单中的用户是不可以发言的,其他的功能没有影响。
总的来说,本网络聊天室系统实现了以下的功能:(1) 注册功能,首先检测用户名是否使用,若未使用,则该用户可以使用;(2) 登录功能,输入用户名和密码,并且选择用户登录的角色;(3) 聊天室房间的选择,系统预置四个房间;(4) 在线用户显示,定时更新在线用户列表;(5) 聊天信息的显示,分为群聊和私聊,定时更新聊天信息;(6) 发送信息,选择对象后,确定是私聊还是公聊;(7) 更改密码功能;(8) 选择头像功能,系统预设十五个头像;(9) 更换聊天室功能;(10) 管理黑名单功能,该功能为管理员的功能。
2.5网络聊天室系统E-R图根据功能分析,得到该网络聊天室系统E-R如图2.4所示:图2.4网络聊天室系统E-R图3系统概要设计该部分内容主要讲述了系统的模块划分、模块的层次结构及调用关系、模块接口和人机界面等内容。
同时包括了系统数据库的设计。
3.1需求规定(1)对功能的规定:①主界面:该系统包括了注册与登录界面、选择房间界面、聊天室界面和管理用户界面。
在这些不同的界面中,不同用户拥有不同的权限,根据权限的不同,用户所拥有的功能也是不同的。
②系统后台:包括系统数据库的建立、重要信息的管理,通过前台界面实现对数据库的查找、修改等功能。
(2) 对功能模块的描述:①登录与注册功能模块:实现不同用户的注册与登录功能。
②选择房间功能模块:进入聊天室系统的用户,需要选择所要进入的房间,系统预设四个房间。
③聊天室主界面:该部分包括了显示在线用户、聊天信息的显示和发送信息三个功能模块。
显示在线用户主要是统计在线用户人数并将其列表显示;聊天信息显示分为公聊信息显示和私聊信息显示,不同模式信息将显示在不同区域;发送信息则是按公聊或者私聊模式将信息发送出去。
④修改密码功能模块:重新修改用户的密码。
⑤选择头像功能模块:重新选择用户头像,系统预设十五个头像,头像将显示在在线用户区域。
⑥管理用户功能模块:该功能模块是只有管理员才拥有的功能,主要是黑名单的管理。
3.2系统层次结构该系统的层次结构以及调用关系如图3.1。
在该图中可以看到,经过注册与登录功能模块后,系统模块分为了两大部分,一部分为普通用户模块,另一部分为管理员模块。