Java_QQ_源程序代码
Java实现QQ登陆
Java实现QQ登陆图②:图③:好了,效果就是这样了,虽然实现了基本功能,但是还是不完美,比如说好友面板不能随着窗口改变大小而改变,不过应该已经可以解决了,只是还没实践,下面就发上源代码:一共有三个类:MemberModel.java //显示类QQ似好友标签信息的模板类;TestPane.java //添加多个模板的容器类;TestFrame.java //窗体类;核心部分是前面两个类,注意,第二个类的布局方式不能为空,否则不能是容器显示滚动条,这是实现这个面板功能的一个难题,因为我不怎么会使用其他的布局方式,就只经常用空布局,经过这次才知道,光用空布局是不行的,空布局的应用受到了太多的限制。
在TestPane.java中添加好友信息的方式应该是代码添加黑名单信息的方式,可在其他类中调用方法,传递参数(数组)过来,然后对信息模板进行初始化,还有面板上的信息模板从程序刚开始运行就生成了,只是设置了不可见,后点击相关分类标签后的可视与不可视是同理的,也就是说你有多少个好友就一直会有多少个JLabel存在你的面板上,只是你可能看不见他们,我感觉自己的实现方式不是很好。
还有在我所用的这种布局方式中,显示Label的宽度是一定的,我不知道怎么设置他的宽度和高度,所以通过在Label上添加了一个白色图标(185 X 60)来使Label变宽,然后再添加模板JPanel,如果网友们还有好的解决方法,希望不吝赐教。
下面是源码:MemberModel.java 的源代:package coolbaby6;import javax.swing.ImageIcon;import javax.swing.JPanel;import javax.swing.JButton;import java.awt.Color;import java.awt.Rectangle;import javax.swing.JLabel;import java.awt.Dimension;import java.awt.Font;public class MemberModel{private static final long serialVersionUID = 1L;public JButton jButton = null;//显示好友头像;public JPanel jPanel = new JPanel();//模板容器;private JLabel lb_nickName = null;//显示昵称;private int pic;private String nickname = null;private JLabel lb_mood = null;//显示心情;public MemberModel(int pic, String nickname, int len) {super();this.pic = pic;//头像编(有多种方法可以实现,这种最简单)this.nickname = nickname;//昵称;initialize();}private void initialize() {lb_mood = new JLabel();lb_mood.setBounds(new Rectangle(51, 30, 131, 20));lb_mood.setFont(new Font("Dialog", Font.PLAIN, 12));lb_mood.setText("世界上最遥远的距离不是生与死,而是我站在你面前你却不知道我爱你!");lb_mood.addMouseListener(new java.awt.event.MouseAdapter() {public void mouseEntered(java.awt.event.MouseEvent e) {exchangeEnter();lb_mood.setToolTipText(lb_mood.getText());}public void mouseExited(java.awt.event.MouseEvent e) {exchangeExited();}});lb_nickName = new JLabel();lb_nickName.setBounds(new Rectangle(52, 10, 80, 20));lb_nickName.setFont(new Font("Dialog", Font.BOLD, 14));lb_nickName.setText(nickname);jPanel.setSize(new Dimension(185, 60));jPanel.setLayout(null);jPanel.add(getJButton(), null);jPanel.add(lb_nickName, null);jPanel.add(lb_mood, null);jPanel.addMouseListener(new java.awt.event.MouseAdapter() {public void mouseExited(java.awt.event.MouseEvent e) {exchangeExited();//鼠标移出模板区,改变背景颜色;}public void mouseEntered(java.awt.event.MouseEvent e) {exchangeEnter();//鼠标移进模板区,改变背景颜色;}});}private void exchangeEnter() {jPanel.setBackground(new Color(192,224,248));}private void exchangeExited() {jPanel.setBackground(null);}private JButton getJButton() {if (jButton == null) {jButton = new JButton();jButton.setBounds(new Rectangle(8, 10, 40, 40));jButton.setBackground(new Color(236, 255, 236));jButton.setIcon(new ImageIcon("head/"+pic + ".jpg"));jButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseExited(java.awt.event.MouseEvent e) {exchangeExited();//鼠标移出模板区,改变背景颜色;}public void mouseEntered(java.awt.event.MouseEvent e) {exchangeEnter();//鼠标移进模板区,改变背景颜色;}});}return jButton;}}TestPane.java 的源代码:package coolbaby6;import javax.swing.BorderFactory;import javax.swing.JPanel;import javax.swing.JLabel;import javax.swing.BoxLayout;import javax.swing.ImageIcon;public class TestPane extends JPanel {private static final long serialVersionUID = 1L;private JLabel jLabel = null;private JLabel jLabel1 = null;private JLabel jLabel11 = null;private JLabel jLabel12 = null;private int clickF=0;private int clickB=0;public TestPane() {super();initialize();}private void initialize() {jLabel12 = new JLabel();jLabel12.setIcon(new ImageIcon("img/bg.jpg"));jLabel12.add(new MemberModel(3,"CoolBabY3",200).jPanel);jLabel12.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); jLabel11 = new JLabel();jLabel11.setIcon(new ImageIcon("img/bg.jpg"));jLabel11.add(new MemberModel(2,"CoolBabY2",200).jPanel);jLabel11.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); jLabel1 = new JLabel();jLabel1.setIcon(new ImageIcon("img/bg.jpg"));jLabel1.add(new MemberModel(1,"CoolBabY1",200).jPanel);jLabel1.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); jLabel = new JLabel();jLabel.setText("我的好友");jLabel.setIcon(new ImageIcon("img/ico.jpg"));jLabel.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); jLabel.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent e) {clickF+=1;if(clickF%2==1){jLabel1.setVisible(false);jLabel11.setVisible(false);jLabel12.setVisible(false);jLabel.setIcon(new ImageIcon("img/ico2.jpg"));update();}else{jLabel1.setVisible(true);jLabel11.setVisible(true);jLabel12.setVisible(true);jLabel.setIcon(new ImageIcon("img/ico.jpg"));update();}}});this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));this.setSize(200, 408);this.setLocation(20, 5);this.add(jLabel, null);this.add(jLabel1, null);this.add(jLabel11, null);this.add(jLabel12, null);addJLabel();}private void update(){//更新UI界面;this.updateUI();}private void clickBlack2(JLabel []jb){//点击标签,将后面的标签全部设为不可视; for(int i=1;i<jb.length;i++){try{jb[i].setVisible(false);}catch(Exception e){e.printStackTrace();}}update();}private void clickBlack(JLabel []jb){//点击标签,将后面的标签全部设为可视;for(int i=1;i<jb.length;i++){try{jb[i].setVisible(true);}catch(Exception e){e.printStackTrace();}}update();}private void addJLabel(){//添加黑名单的内容;final JLabel []jb=new JLabel[7];jb[0] = new JLabel();jb[0].setText("黑名单");jb[0].setIcon(new ImageIcon("img/ico2.jpg"));jb[0].setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));jb[0].addMouseListener(new java.awt.event.MouseAdapter() {public void mouseClicked(java.awt.event.MouseEvent e) {clickB+=1;if(clickB%2==1){clickBlack(jb);jb[0].setIcon(new ImageIcon("img/ico.jpg"));}else{clickBlack2(jb);jb[0].setIcon(new ImageIcon("img/ico2.jpg"));}}});this.add(jb[0],null);for(int i=1;i<jb.length;i++){jb[i]=new JLabel();jb[i].setIcon(new ImageIcon("img/bg.jpg"));jb[i].setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));jb[i].add(new MemberModel((i+3),"CoolBabY"+(i+3),200).jPanel);jb[i].setVisible(false);this.add(jb[i],null);}}TestFrame.java 的源代码:package coolbaby6;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.ScrollPaneConstants;import javax.swing.SwingUtilities;public class TestFrame {private JFrame jFrame = null;private JPanel jContentPane = null;private JScrollPane scrollPane=null;public static void main(String[] args) {SwingUtilities.invokeLater(new Runnable() {public void run() {TestFrame application = new TestFrame();application.getJFrame().setVisible(true);}});}private JFrame getJFrame() {if (jFrame == null) {jFrame = new JFrame();jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jFrame.setSize(230, 700);jFrame.setTitle("模拟实现QQ面板功能");jFrame.setContentPane(getJContentPane());}return jFrame;}private JScrollPane getScrollPane(){//给添加好友的容器JPanel添加滚动条;if(scrollPane==null){scrollPane=new JScrollPane(new TestPane());scrollPane.setBounds(20,5, 190, 600);scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLL BAR_NEVER );//不显示水平滚动条;return scrollPane;}private JPanel getJContentPane() {//实例化底层的容器JPanel;if (jContentPane == null) {jContentPane = new JPanel();jContentPane.setLayout(null);jContentPane.add(getScrollPane());}return jContentPane;}}能成功编译成功我的源代码的方略:①、建一个项目,按我的类名建3个类,将源代码拷贝进去;②、在项目根目录下建一个名为img的文件夹,将要用到的图片放进去。
Java调用本地命令
Java调⽤本地命令参考:⼀、Process类ProcessBuilder.start()创建⼀个本机进程,并返回⼀个Process⼦类的⼀个实例,该实例可以获取进程的相关信息,也可以控制进程。
这个进程没有⾃⼰的终端,它的操作结果io都重定向到了它的⽗进程,⽗进程通过getInputStream(),getOutputStream(),getErrorStream()为⼦进程提供输⼊和获取输出,⽽对于io流如果有缓冲⼤⼩限制,则可能出现阻塞,导致死锁情况。
可使⽤destory()⽅式强制杀掉⼦进程,exitValue()返回执⾏结果,如果⼦进程需要等待返回,调⽤waitFor()⽅法将当前线程等待,直到⼦进程退出。
⼆、Runtime类Runtime.getRuntime().exec() 获得的就是Process类,exec()⽅法有多个重载可以使⽤,针对不同的情况设置不同的参数。
另外需要注意的是执⾏的windows和linux的明林的写法是不同的。
public static void main(String[] args) {String command = "notepad.exe txt.txt";try {Process process = Runtime.getRuntime().exec(command);BufferedInputStream bis = new BufferedInputStream(process.getInputStream());BufferedReader br = new BufferedReader(new InputStreamReader(bis));String line;while ((line = br.readLine()) != null) {System.out.println(line);}process.waitFor();if (process.exitValue() != 0) {System.out.println("error!");}bis.close();br.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}三、Apache Common-Exec强烈建议使⽤apache的第三⽅库,该库提供了更加详细的设置和监控⽅法等等。
本科毕业论文-基于JAVA的聊天系统的设计与实现【范本模板】
摘要随着互联网的快速发展,网络聊天工具已经作为一种重要的信息交流工具,受到越来越多的网民的青睐.目前,出现了很多非常不错的聊天工具,其中应用比较广泛的有Netmeeting、腾讯QQ、MSN-Messager等等。
该系统开发主要包括一个网络聊天服务器程序和一个网络聊天客户程序两个方面。
前者通过Socket套接字建立服务器,服务器能读取、转发客户端发来信息,并能刷新用户列表。
后者通过与服务器建立连接,来进行客户端与客户端的信息交流。
其中用到了局域网通信机制的原理,通过直接继承Thread类来建立多线程。
开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。
在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法。
经过分析这些情况,该局域网聊天工具采用Eclipse为基本开发环境和java 语言进行编写,首先可在短时间内建立系统应用原型,然后,对初始原型系统进行不断修正和改进,直到形成可行系统关键词:局域网聊天 socket javaAbstractAlong with the fast development of Internet,the network chating tool has already become one kind of important communication tools and received more and more web cams favor. At present, many extremely good chating tools have appeared . for example,Netmeeting, QQ,MSN—Messager and so on. This system development mainly includes two aspects of the server procedure of the network chat and the customer procedure of the network chat。
模拟QQ聊天室需求分析报告(DOC)
文档名称: 需求分析报告项目名称: 模拟QQ聊天系统项目负责人:班级:学校:1引言1.1 编写目的作为用户与该系统软件开发维护人员共同遵守的软件需求规范说明, 本《软件需求说明书》的主要目的是明确所要开发的软件所应具有的功能、性能, 使系统分析人员和软件设计人员能清楚地了解用户的需求, 并在此基础上进一步提出概要设计和完成后续设计与开发工作, 为软件开发范围、业务处理规范提供依据, 也是应用软件进行合同最终验收的依据。
客户登陆后可以通过服务器转发, 实现一对一和多对多聊天, 闪动托盘图标提示到来信息, 实现呼叫功能, 并播放不同音乐来提示。
系统可以实时显示目前其它用户的状态, 保存并能察看聊天纪录, 并可以申请新的用户号码。
用户登陆成功, 将保存其号码, 以便下次登陆时, 不必再输入而可以直接选择, 显示登陆时间。
服务器端, 向各个客户端发布系统消息。
接受来自客户端的各种信息并分别处理。
自动分配8位用户号码, 并保存该用户, 同时将信息返回给客户端。
用户下线, 将此用户下线消息发给各客户端, 并改写用户在服务器端的状态。
系统易用、美观的图形界面, 可以实现系统托盘。
此外系统还涉与系统数据安全和用户管理的问题、各种代码使用和维护问题、数据安全和数据维护问题、聊天记录和输出等问题, 因此还要求系统具有系统管理和事务处理功能。
总而言之, 要求通过系统的开发, 达到系统项目的总体目标是: 在整个系统的框架下, 结合客户端与服务器端情况的需要实现对数据更新、数据查询、数据统计、数据分析等功能进行有效的管理。
并提供用户友好接口, 满足用户需求的软件。
预期的使用者就是各单位办公区、联系密切的同学朋友与家人、公司同事等, 使用前仔细阅读此软件说明是很必要的, 以便更好的使用、管理和维护此系统!1.2 背景1.待开发软件名称: 模拟QQ聊天工具2.用户: 所有使用QQ的用户。
3、实现软件的单位:4、QQ作为基础的聊天工具, 方便所有计算机用户的交流。
开源源码大全
开源源码⼤全授权协议介绍先了解下相关词的解释协议和版权信息(License and copyright notice):在代码中保留作者提供的协议和版权信息声明变更(State Changes):在代码中声明对原来代码的重⼤修改及变更公开源码(Disclose Source):代码必需公开。
如果是基于LGPL协议下,则只需使⽤的开源代码公开,不必将整个软件源码公开库引⽤(Library usage):该库可以⽤于商业软件中责任承担(Hold Liable):代码的作者承担代码使⽤后的风险及产⽣的后果商标使⽤(Use Trademark):可以使⽤作者的姓名,作品的Logo,或商标附加协议(Sublicensing):允许在软件分发传播过程中附加上原来没有的协议条款等协议描述要求允许禁⽌Apache⼀个较宽松且简明地指出了专利授权的协议。
协议和版权信息声明变更商⽤分发修改专利授权私⽤附加协议责任承担(禁⽌让作者承担责任,可以理解为免责)商标使⽤GPL 此协议是应⽤最为⼴泛的开源协议,拥有较强的版权⾃由(copyleft )要求。
衍⽣代码的分发需开源并且也要遵守此协议。
此协议有许多变种,不同变种的要求略有不同。
公开源码协议和版权信息声明变更商⽤分发修改专利授权私⽤责任承担附加协议MIT 宽松简单且精要的⼀个协议。
在适当标明来源及免责的情况下,它允许你对代码进⾏任何形式的使⽤。
协议和版权信息商⽤分发修改私⽤附加协议责任承担Artistic Perl社区尤为钟爱此协议。
要求更改后的软件不能影响原软件的使⽤。
协议和版权信息声明变更商⽤分发修改私⽤附加协议责任承担商标使⽤BSD 较为宽松的协议,包含两个变种BSD 2-Clause 和BSD 3-Clause,两者都与MIT协议只存在细微差异。
协议和版权信息商⽤分发修改私⽤附加协议责任承担Eclipse 对商⽤⾮常友好的⼀种协议,可以⽤于软件的商业授权。
包含对专利的优雅授权,并且也可以对相关代码应⽤商业协议。
计算机软件著作权的专业类别
计算机软件著作权的专业类别全文共四篇示例,供读者参考第一篇示例:随着计算机软件产业的不断发展壮大,计算机软件著作权也逐渐受到人们的重视和关注。
计算机软件著作权是指对计算机软件作品享有的法律保护权利,包括著作权拥有者享有的复制、发行、展示、表演、广播、信息网络传播等权利。
根据《著作权法》的相关规定,计算机软件作品属于文学作品的一种,因此计算机软件著作权也是在著作权法的保护范围之内。
针对计算机软件著作权的专业类别,它主要包括以下几个方面:一、操作系统软件:操作系统软件是计算机最基础的系统软件,它是计算机硬件与应用软件之间的桥梁。
操作系统软件不仅控制和管理计算机硬件资源,还提供用户与计算机系统之间的界面,使用户可以方便地与计算机进行交互操作。
常见的操作系统软件包括Windows、Mac OS、Linux等。
二、应用软件:应用软件是计算机用户进行各种工作、学习和娱乐活动所需的软件。
应用软件可以根据用户的需求和功能要求进行设计和开发,包括办公软件、图像处理软件、多媒体软件、游戏软件等。
常见的应用软件包括Microsoft Office套件、Adobe Photoshop、QQ等。
三、编程开发工具软件:编程开发工具软件是程序员用来编写、编辑、调试和测试计算机程序的软件工具。
编程开发工具软件提供了各种编程语言和工具,帮助程序员完成软件开发工作。
常见的编程开发工具软件包括Visual Studio、Eclipse、Xcode等。
四、数据库管理软件:数据库管理软件是用来存储和管理大量数据的软件系统。
数据库管理软件提供了各种数据库操作和管理功能,包括数据的增删改查、数据的备份和恢复、数据的安全控制等。
常见的数据库管理软件包括MySQL、Oracle、SQL Server等。
五、网络通信软件:网络通信软件是用来实现计算机之间网络通信和数据传输的软件系统。
网络通信软件包括各种网络协议和通信协议,帮助计算机之间进行数据交换和通信。
腾讯编码规范
本标准中“腾讯集团”是指腾讯控股有限公司、其附属公司、及为会计而综合入账的公司,包括但不限于腾讯控股有限公司、深圳市腾讯计算机系统有限公司、腾讯科技(深圳)有限公司、腾讯科技(北京)有限公司、深圳市世纪凯旋科技有限公司、时代朝阳科技(深圳)有限公司、腾讯数码(深圳)有限公司、深圳市财付通科技有限公司。
12附录
附录A《编码安全规范》
附录A
(规范性附录)
编码安全规范
———————————
7.4.3尽量避免单个字符的变量名,除非是一次性的临时变量。临时变量通常被取名为i,j,k,m和n,它们一般用于整型;c,d,e,它们一般用于字符型;
7.4.4不采用匈牙利命名法则,对不易清楚识别出该变量类型的变量应使用类型名或类型名缩写作其后缀,例如:
7.4.5组件或部件变量使用其类型名或类型名缩写作其后缀,例如:
8.3.4避免声明的局部变量覆盖上一级声明的变量,即不要在内部代码块中声明相同的变量名;
8.3.5公共和保护的可见性应当尽量避免,所有的字段都建议置为私有,由获取和设置成员函数(Getter、Setter)访问;
8.3.6定义一个变量或者常量的时候,不要包含包名(类似java.security.MessageDigest digest = null),而要定义成下面的格式,除非是两个包有相同的类名:
常量
类变量
实例变量:
公有字段
受保护字段
友元字段
私有字段
9异常
9.1捕捉异常的目的是为了处理它。
9.2多个异常应分别捕捉并处理,避免使用一个单一的catch来处理。
10习惯
10.1if、for、do、while等语句的执行语句部分无论多少都要加括号"{}";
面向对象程序设计实训
1) 观看老师运行一个简单的java聊天程序。
2) 新建一个Hello.java程序,在控制台打印“欢迎使用本聊天系统!”。
3) 新建一个Test类,在test类中打印下面表达式的运算结果,设a=3,b=-5,f=true:(1) --a % b ++ (2) (a>=1&&a<=12?a:b)4) 阅读TestWhat的源代码,编译并运行,并在老师的要求下使代码规范化。
5) 编写并运行一个字符界面的Java Application,接收用户输入的一个字符,并把该字符打印在屏幕上。
6) 新建一个工程,新建一个包(basic),新建一个类,在类里面写一个方法用来判断三角形的三条边能否构成三角形,并要求能判断出是等腰等边还是普通三角形,在main函数里面实例化对象,调用该方法。
7) 新建另一包(test),然后新建另一个类,测试能不能调用步骤1中的方法.8)Java API有一个类java.util.GregorianCalendar,可用来获得某个日期的年、月、日,用无参数的构造函数创建当前日期的实例,get(GregorianCalendar.YEAR),get(GregorianCalendar.MONTH),get(GregorianCalendar.DAY_OF_MONTH)返回日期的年、月、日。
写程序显示当前的年、月、日。
9)创建聊天程序中的用户类(User),用户拥有自己的名称、出生年份、年龄、密码等信息。
其中年龄要通过出生年份计算出来。
10)考虑以上User类各种方法的访问性,并设计出合理的访问控制修饰符。
11)定义矩形类和它的子类正方形类,并增加一个Printable接口,用于以字符和图形的方式打印矩形和正方形的信息。
(1)定义矩形类,用户输入矩形的长与宽,程序计算其面积和周长;(2)定义矩形类的派生类---正方形类。
正方形类的操作同样是求周长和面积;(3)定义一个接口Printable,其中包括一个方法printWay(),这个方法没有形参,返回值为空;(4)改写矩形类,使之实现Printable接口,用printWay()将矩形的相关信息(长、宽、周长、面积)打印在屏幕上;(5)改写正方形类,重载printWay()方法,将正方形的边长、周长、面积打印在屏幕上;(6)在Printable接口中增加一个新的printWay(char)方法,并改写矩形类、正方形类定义。
Java实现简单的QQ聊天
一、界面的介绍
1、登录界面
第一次登录需要注册,该程序使用的数据库是 Mysql。首先要建立 test 数据 库,在 test 数据库中创建一个表 jdbctest。
从表中可以看出有 8 个字段,除 id 外(设置为自动分配) 。 2、注册界面 点击立刻注册按钮,会弹出注册窗口:
二、以下是完整的代码:
1、ChatServe.java:
package Chat; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException;
import java.io.IOException; import .*; import java.util.*; public class ChatServer { static boolean started = false; static boolean bconnected = false; static ServerSocket ss = null; static Socket s = null; ArrayList<Client> clients = new ArrayList<Client>(); public static void main(String[] args) { new ChatServer().start(); } public void start(){ try { ss = new ServerSocket(8888); started=true; }catch (BindException e) { System.out.println("端口使用中......."); }catch (IOException e) { e.printStackTrace(); } try{ while(started){ s = ss.accept(); Client c = new Client(s); System.out.println("a client connect"); new Thread(c).start(); clients.add(c); } }catch (IOException e) { e.printStackTrace(); }finally{ try { ss.close(); } catch (IOException e) { e.printStackTrace(); } } }
QQ源程序代码
packet = new DatagramPacket(buf, buf.length, group, 928);
mServer.receive(packet);
JPanel styleFP = new JPanel();
styleFP.add(cbFont);
styleFP.setBorder(BorderFactory.createTitledBorder("Font Style"));
mServer.joinGroup(group);
byte[] buf = new byte[256];
DatagramPacket packet;
System.out.println("Waiting for a connection...");
import .DatagramPacket;
import .InetAddress;
import .MulticastSocket;
import .Socket;
import java.text.DateFormat;
import java.util.Date;
private String choiceName = "to All";
private JMenuBar jmb = new JMenuBar();
private JMenu jmFile = new JMenu("File");
private JMenu jmHelp = new JMenu("Help");
}
}
public final void showFonts() {
QQ源代码分析
QQ源代码分析(5664版)一、源文件分析1、应用程序框架类:KQQMIDlet.java定义了一个http地址:http://218.18.95.203:21001/,在构造函数中,对一些变量进行初始化。
公共变量:public static KQQMIDlet instance = null;public static Display display = null;public static Runtime runtime = null;public int gaugeState;public String strUserID;public String strPasswd;public static String url = "http://218.18.95.203:21001/";public static MainMenu mainMenu;public static HttpPoster httpPoster;public static FriendRecord friendRecord;public static FriendList friendList;public static GetMsgDlg getMsgDlg;public static SendMsgDlg sendMsgDlg;public static AddFriend addFriend;public static Finger finger;public static AckSvrMsg ackSvrMsg;public static MainForm mainForm;public static BlackList blackList;public static MultiLan sysString;public static HistoryMsg historyMsg;public boolean isWaitLogin;公共方法:public void init()public void startApp() 应用程序开始函数;当应用程序开始运行时、应用程序暂停后再继续时被调用;根据不同的情况进行不同的操作:当应用程序是暂停后再继续则显示暂停前的屏幕,当应用程序是登录时并且不是等待登录则显示mainForm;public void pauseApp(); //程序暂停时被调用,当被调用时,第一时间设置好暂停标志isPause;然后判断是不是等待登录时的状态,若是则置等待登录标志,若不是则置dispPause变量;public void destroyApp(boolean flag); //仅是一接口函数,进作任何处理;public void quitApp();//当程序退出时被调用,首先停止系统时钟,然后停止HTTP发送;public void onLoadEnd()public void startTimer(int i)public void stopTimer()public void OnTimer()public void onNetError(boolean flag)public void showMessage(String s, String s1, CommandListener commandlistener, Command command, Command command1)public void playAlert()public Displayable getCurrent()public void showAlert(String s, String s1, Displayable displayable)public void showHelpForm()public void commandAction(Command command, Displayable displayable)public void receiveHttpResponse(String s)public void handleHttpError(String s)public void itemStateChanged(Item item)2、MD5算法类:MD5.java此文件中定义了一个MD5类,该类实现对一个字符串进行MD5加密,提供如下公共变量和方法:公共变量:public String digestHexStr; //此变量中存放了将输入串进行MD5运算后的128位MD5码的ASCII码。
java 第一章
学习Java的哪些内容?
• • • • • • • Java开发平台的使用 Java的基本语法 面向对象及其特性 常用Java库类 异常处理机制 图形用户界面设计 输入、输出流
如何学好Java?
Ø 课前做好预习,带着问题听课。上课认真听讲,做 好笔记。认真完成作业和上机实验。 Ø 有不懂的地方和疑问要马上提出,寻找答案和解决 的方法,千万不要积累问题。 Ø 勤读代码,勤写代码,在实践中学习。 Ø 多看课外参考书。
1.1 Java历史
Java产生背景 1991年4月,Sun公司的James Gosling领导的绿色计划(Gree n Project)开始着力发展一种分布式系统结构,使其能够在各种消 费性电子产品上运行。而Green项目组的成员一开始使用C++语言 来完成这个项目,由于Green项目组的成员都具有C++背景,所以 他们首先把目光锁定了C++编译器,Gosling首先改写了C++编译 器,但很快他就感到C++的很多不足,需要研发一种新的语言来 替代它。 这种语言最初被命名为Oak,目标设定在家用电器等小型系统 的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用 电器的控制和通讯问题。在17个月后,整个系统完成了,这个系 统是更注重机顶盒式的操作系统,不过在当时市场不成熟的情况 下,他们的项目没有获得成功,但Oak语言却得到了Sun公司总裁 的赏识。
1.1 Java历史
Sun在推出JDK1.0后,紧跟着,Sun在1997年2月18 日发布了JDK1.1。JDK1.1相对于JDK1.0最大的改进就是 为JVM增加了JIT(即时编译)编译器。 Sun在推出JDK1.1后,接着又推出了数个JDK1.x版 本。自从Sun推出Java后,JDK的下载量不断彪升,在19 97年,JDK的下载量突破了220,000,而在1998年,JDK 的下载量已经超过了2,000,000。
(完整版)java基础jar包程序
包:java中的包就相当于windows文件夹。
包的作用:1. 解决类名重复产生冲突的问题。
2. 便于软件版本的发布。
定义包的格式:package 包名;包名命名规范:包名全部小写。
包语句要注意的事项:1. package语句必须位于java文件中中第一个语句。
2. 如果一个类加上了包语句,那么该类的完整类名就是: 包名.类名3. 一个java文件只能有一个包语句。
问题:每次编译的时候都需要自己创建一个文件夹,把对应的class文件存储到文件夹中。
烦!!!javac -d 指定类文件的存放路径 java源文件*/package aa;class Demo1{public static void main(String[] args){System.out.println("这个是Demo1的main方法...");}}package bb;class Demo1{public static void main(String[] args){System.out.println("这个是Demo2main方法..");}}/*有了包之后类与类之间的访问:问题:有了包之后类与类之间的访问每次都必须要写上包名!烦!!!!解决方案: sum提供导包语句让我们解决该问题。
导包语句作用:简化书写。
(误区:把一个类导入到内存中)导包语句的格式:import 包名.类名; (导入xxx包中某个类)导包语句要注意的细节:1. 一个java文件中可以出现多句导包语句。
2. "*"是导包语句的通配符。
可以匹配任何的类名。
3. import aa.*; 是不会作用于aa包下面的子包的。
推荐使用:import 包名.类名; 因为使用*通配符会导致结构不清晰。
什么时候使用import语句:1. 相互访问的两个类不是在同一个包下面,这时候就需要使用到导包语句。
2. ng 是默认导入的,不需要我们自己导入。
Java写的斗地主游戏源码
Java写的⽃地主游戏源码源码下载在最后我们的前年的课设要求做⼀个⽃地主程序,当时正在愁如何做界⾯,当时刚好在学习C#,于是就⽤C#完成了这个程序。
⼀⽅⾯,当时我C#功底还很差(其实现在也不怎么样),很多地⽅⽤了“笨办法”,实现的⽐较幼稚,程序效率很低,另⼀⽅⾯感觉很对不起⽼师,因为做这个程序的本意是研究⽃地主程序的AI出牌等等算法相关的东西,⽽我却⼏乎忽略了这些内容。
(我会好好学习算法的……^-^)最可怕的是,由于当时时间⽐较紧,只有⼏天的时间,所以我本着“能跑就⾏”的想法完成了这个程序。
从程序本⾝来说,我觉得我的代码⼏乎没有任何参考价值,满篇的switch...case...,乱七⼋糟的结构,⽽且最可怕的是,所有代码⼏乎都集中在了⼀个mainform.xaml.cs⽂件⾥。
太恐怖了。
我⼀直为我会写出这样的代码感到羞耻……因此也就没敢发布这些源码。
最近⼜在研究Java,做另外的项⽬,看了看以前的代码,觉得虽然代码很烂,但有些地⽅的处理还是有⼀定意义的,毕竟这也算是个中⼩游戏应⽤,于是⼜⽤JAVA重写了⼀遍,发上来和⼤家分享。
如果能对你的学习或者⼯作起到任何作⽤,我都会⾮常⾼兴。
此源码完全⾃由使⽤,你可以利⽤它做任何事情,包括商业应⽤,⽽不需要提前通知我。
这次采⽤的是JAVA8 ,最新发布的JAVA版本,IDE是netbeans,⼀共有80MB左右⼤⼩,体积不⼤,安装也容易程序⽂件夹结构是从C#转过来的,期间使⽤⼀个叫C#转JAVA的⼯具,转换了⼀下语法,效果不是很理想,还是⼿⼯改了许多地⽅可以看到,程序是从Program.java启动(和VS的项⽬⼀样)游戏是⽹页版联机的,因此分服务端和客户端⼆部分,服务端JAVA包括⽃地主逻辑服务和记录服务(⽣成SQL语句发给数据库)游戏客户端 -》⽃地主逻辑服务 - 》记录服务 -》数据库《- 《- 《-客户端发消息到⽃地主逻辑,⽃地主逻辑转发到记录服务,再返回来,这样⼀个通信过程分成逻辑和记录⼆部分的好处是可以并⾏运⾏提⾼效率,⽐如在SQL语句执⾏时,⽃地主逻辑可以继续处理请求现在开始构架游戏,为了不让代码那么难看,我们很有必要加⼊设计模式和⾯向对象思想。
简单留言板代码
简单留言板代码篇一:留言版代码ASP留言板源代码:有主页,回复和删除三个版面主程序htmlheadtitle业牧粞员?lt;/titlemeta http-equiv=Content-Type content=text/html; charset=gb2312 /headscript language=VBScriptsub check()if erid.value=empty thenmsgbox 请输入您的昵称!focusto(0)exit subend ifif form.email.value=empty thenmsgbox 请输入您的E-mail地址!focusto(1)exit subend ifif instr(form.email.value, @)=0 thenmsgbox 您的E-mail地址不正确,是不是记错了?再想想!focusto(1)exit subend ifif form.content.value=empty thenmsgbox 请输入您的留言内容!focusto(5)exit subend ifform.submitend subsub focusto(x)document.form.elements(x).focus()end sub/scriptbody bgcolor=#CCFFCC text=#333333table width=90% border=0 bordercolorlight=#E2F3F2 height=77 align=centertrtd height=47 colspan=2 bgcolor=#00FFFFdiv align=center font face=华文行楷size=+6font color=#FF0000 face=行楷strong留言本/strong/font/font/div /td/trtrtd colspan=2 height=2p align=centerfont face=隶书size=+2font face=楷体_GB2312ba href=show.aspfont size=+1查看留言/font/a/b/font /font/p/td/tr/tabletable width=90% border=0 align=centertr bgcolor=#E2F3F2 align=center valign=middletd height=385form action=show.asp method=post name=form id=formtable align=center bgcolor=#E2F3F2 border=1cellpadding=0 cellspacing=0 width=100%tbodytr bgcolor=#CCFFCCtd width=96 height=34div align=centerfont color=#0000FF昵称:/font/div/tdtd width=441 height=34input maxlength=30 name=useridfont color=#FF0000* /font/td/trtr bgcolor=#CCFFCCtd width=96 height=35div align=centerfont color=#0000FF伊妹儿:/font/div/tdtd width=441 height=35 colspan=3input type=text name=emailfont color=#FF0000* /font/td/trtr bgcolor=#CCFFCCtd width=96 height=36div align=centerfont color=#0000FF主题:/font/div/tdtd width=441 height=36 colspan=3input maxlength=200 name=subject size=40/td/trtr bgcolor=#CCFFCCtd width=96 height=36div align=centerfont color=#0000FF你的QQ:/font/div/tdtd width=441 height=36 colspan=3input name=qq type=text id=qq maxlength=10/td/trtr bgcolor=#CCFFCCtd width=96 height=37div align=centerfont color=#0000FF 你的主页:/font/div/tdtd width=441 height=37 colspan=3input name=site type=text id=site value=/td/trtr bgcolor=#CCFFCCtd width=96 height=147div align=centerfont color=#0000FF留言内容:/font/div/tdtd width=441 height=147 colspan=3textarea cols=50 name=content rows=12/textarea/td/trtr align=middle bgcolor=#CCFFCCtd height=56 colspan=4div align=centerinput name=button1 type=button value= 发表onclick=check() input name=button2 type=reset value= 重写/div/td/tr/tbody/table/form/td/tr/table/body/html保存程序%@ language=VBScript%htmlheadtitle保存留言/titlemeta http-equiv=Content-Type content=text/html; charset=gb2312 /headbody bgcolor=#CCFFCC text=#0000FFp align=centerstrongfont color=#FF0000 size=+6 face=行楷我的留言本/font/strong/p%'获得表单内的信息userid = Request.Form (userid)title= Request.Form(subject)site=Request.Form(site)content= Request.Form(content)email=Request.Form(email)wtime=now()from=Request.ServerVariables(REMOTE_ADDR)email=a href=mailto: & email & & email & /aif title= thentitle=无标题end ifOn Error Resume NextApplication.Lock'以ForAppending模式开启留言文件set fso = CreateObject(Scripting.FileSystemObject)'取得save和oldsave两个文件的完整路径filepath=server.MapPath(save.txt)oldfilepath=server.MapPath(oldsave.txt)'将save改名为oldsavefso.CopyFile filepath ,oldfilepath'打开oldsave文件set readf=fso.OpenTextFile(oldfilepath,1,true)t=readf.ReadAll'打开save文件set showf=fso.CreateTextFile(filepath,true)'将新的留言内容添加(append)到留言文件中showf.WriteLine arrow & b留言者/b:& userid & brshowf.WriteLine arrow & b伊妹儿/b>:& email & brshowf.WriteLine arrow & b来自于/b:& from & br showf.WriteLine arrow & b发表日期/b:& wtime & brshowf.WriteLine arrow & b留言者主页/b:& site & brshowf.WriteLine arrow & b留言标题/b:& title & brshowf.WriteLine arrow & b留言内容/b:& content & pshowf.WriteLineshowf.WriteLine hr' 读出oldsave的内容,写入save中showf.WriteLine t'关闭oldsave文件readf.Close'删除oldsave文件fso.DeleteFile oldfilepath,trueApplication.UnLock'顺便将留言内容输出到浏览器中Response.Write h3Response.Write 以下是i & userid & /i 的留言内容:Response.Write /h3hrResponse.Write arrow & b来自于/b:& from & br Response.Write arrow & b伊妹儿/b :& email & brResponse.Write arrow & b发表日期/b:& wtime & br Response.Write arrow & b留言者主页/b:& site & br Response.Write arrow & b留言标题/b:& title & brResponse.Write arrow & b留言内容/b:& content & p Response.Write hr%p align=center点击 A href=show.aspfont color=#FF00FF这里/font/A,font color=#0000FF查看所有留言!/font/p /body/html显示程序@ language=VBScript%htmlheadtitle所有留言/titlemeta http-equiv=Content-Type content=text/html; charset=gb2312 /headbody bgcolor=#CCFFCC text=#0000FFp align=centerfont face=华文行楷size=+6font color=#FF0000 face=行楷strong留言本/strong/font/font /phrp align=center /p%on error resume nextset fso = CreateObject(Scripting.FileSystemObject)filepath=server.MapPath(save.txt)set showall=fso.OpenTextFile(filepath,1,true)t=showall.ReadAll篇二:网上留言簿jsp实现(附所有代码)计算机与信息学院《计算机网络系统实践》报告设计题目:网上留言簿的设计与实现学生姓名:学号:专业班级:计算机科学与技术X班2014年1 月二、选做部分题目:网上留言簿的设计与实现1设计要求1.进行网上留言簿的需求分析和功能设计;2.在数据库中构建数据库、表或视图,熟悉数据库开发流程; 3.根据网上留言簿的功能,设计各页面和脚本,掌握动态网页的制作技术;2开发环境操作系统:Windows7数据库:SQL Server 2005开发平台:MyEclipse 8.63基本原理1、Web编程Web编程简单地说是基于WWW的Internet上的应用程序开发,随着Internet的普及与传播,越来越多的人通过WWW走进网络世界的大门。
java网络聊天室课程设计报告(内附代码)
课程设计网络聊天室院(系) 别信电学院班级计算102学号姓名指导教师时间2013-4-18—2013-5-10 课程设计任务书题目网络聊天室课程设计系(部) 信电学院专业计算机科学与技术班级计算102学生姓名学号4 月18 日至5 月10 日共 4 周指导教师(签字)系主任(签字)年月日成绩评定表目录课程设计概述 (3)1.1问题描述 (3)1.2功能需求分析 (3)1.3环境需求分析 (3)学生信息管理系统软件总体设计 (4)2.1整体思路 (4)2.2总体设计流程图 (5)学生信息管理软件详细设计 (6)3.1.界面设计 (6)3.2通信功能实现方法 (8)参考文献 (44)摘要私達の実践の能力を高めるため、学んだ知識を運用することができて行って更に創造して、学校は特に2週間手配して、私達にVisual C++の課程の設計の実習を行わせます.このファイルの詳しい説明はVisual C++6.0環境の下で、1つのソフトウェアの過程を設計して、このソフトウェアは各種のデータの個数を統計したのです。
このソフトウェアの機能は、ユーザーは1段の文字を入力して、ソフトウェアは文字の中の各類のデータの数を記録して、英文のデータの数、数字のデータの数、空欄のデータの数とそれのタイプのデータの数を含んで、そしてそれらを明らかに示します.以下、課程を通して説明を設計して、データはソフトウェアの説明を統計して、プログラムは説明を調整して、総括などの方面を開発して、詳しくこのプログラムの製作の過程を説明して、作用、各種の実行することができる操作.关键字:データの統計,VC++6.0, ヘッドファイル课程设计概述1.1问题描述`随着计算机网络日新月异的发展,人们的交流方式越来越多,传统的交流方式,如:信件、电报、电话等已经难以满足人们的交流要求,在互联网上即时的和好友取得联系,已经成为当今社会人们主流的联系方式。
因此,两台计算机之间进行即时通讯、发送文件等交流方式已经成为必然潮流。
QQ项目编码规范
QQ项目编码规范目录一、前言 (2)1.背景 (2)2.规范实施建议 (2)3.定义和约定 (2)二、格式规范 (2)1.缩进 (2)2.行长度 (2)3.声明 (3)a)声明变量、常量 (3)b)声明类 (3)4.语句 (3)三、命名规范 (4)1.通用规则 (4)2.项目规则 (4)3.附加说明 (5)四、组织规范 (5)1.web工程目录规范 ................................................................................................... 错误!未定义书签。
2.引入包规范 (5)五、注释规范 (5)1.通用注释规则 (5)a)说明 (5)b)javadoc注释标签语法定义说明 (6)2.类的注释 (6)3.方法的注释 (6)4.失效代码块的注释 (7)5.分支语句的注释 (7)6.变量、常量的注释 (8)六、异常处理规范 (8)七、补充规范 (8)一、前言1. 背景在项目开发维护中,编码规范作为开发规范的一个组成部分,是十分重要和必须的,它不仅仅是为了提高开发效率,也有利于降低后期维护开发的成本。
编码规范的根本目的就是要让不仅代码可以一目了然,也可以很容易的理解开发人员所编写的代码程的用途和意义。
由此,用来减少项目中因为开发维护人员的更替或由于长时间不维护造成的记忆模糊或混乱等情况带来的对代码所实现的真正功能的理解困难和歧义。
另外也提高了代码复查效率和效果。
2. 规范实施建议不是为了规范而规范,以提高软件开发质量和效率为目标,逐步改进编码规范化水平对于格式规范、注释规范等部分规范的要求,java代码可以通过使用eclipse自带的Format方法(快捷键:Ctrl+Shift+F)进行自动格式化,可以提高开发效率又符合编码规范。
3. 定义和约定第1个字符大写,其后每个单词的第1个字母大写第1个字符小写,其后每个单词的第1个字母大写二、格式规范1. 缩进使用Tab键缩进;不允许使用空格键进行缩进。
java web中实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能)
又有好多天没有写博客了,最近有网友问我,在java web中如何实现像QQ登录的功能,同一帐号不能同时在两台电脑上登录。
一、该功能有什么作用大家想想吧。
反正总会有这样的需求的。
这年头什么需求不会有。
呵呵。
有时候也不一定是需求,很有可能为了安全也会这么做。
例如考试系统,在线聊天系统,很有必要做成这样的吧。
二、实现过程a.问题分析在系统中,我们一般都是把登录信息绑定到session中,看来从这入手是可能找到解决办法。
说白了,也就是当用户登录时,判断一下这个用户有没有登录,如果登录了,就把以前的那个session清除掉就OK了。
看似很简单是不?其实你细想你会发现有以下问题:如何得到之前这个用户有没有登录过,也就是如何访问到所有登录的session信息呢?b.具体实现大家知道,在j2ee api好像是没有具体的方法直接得到所有session信息的。
但是我们可以通过配制监听器,监控所有的session创建和消毁过程,以及可以监控session 中的属性的创建,删除和替换过程。
其实我们只要做以下处理即可:在保存用户登录信息到session时,对应的也就是session一个属性的创建过程(attributeAdded),可以把当前这个session记录到一个ArrayList中。
其实在保存到list中时你要首先遍历一下这个list中有没有已经存在该用户的登录信息。
如果存在就消毁掉这个list中存在的session信息,并且从list中移除,不存在就把该session信息放到list中。
在session的登录信息消毁时,直接把该sesseion从list中移除掉。
还有就是当用户登录后没有退出直接登录这个时候是一个session属性的替换过程。
也要做处理判断新的用户是否已经在除了当前session的其它session中是否存在。
存在则删除。
具体代码如下:package com.weirhp;import java.util.ArrayList;import java.util.Collections;import java.util.List;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSessionAttributeListener;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;public class RecordSessionListener implements HttpSessionAttributeListener, HttpSessionListener {private static List<SessionAndUser> sessions;public static String loginFlag = "loginUser";static {if (sessions == null) {sessions = Collections.synchronizedList(new ArrayList<SessionAndUser>()); }}public void attributeAdded(HttpSessionBindingEvent e) {HttpSession session = e.getSession();System.out.println("-------------*start added*-----------------------"); String attrName = e.getName();// 登录if (attrName.equals(loginFlag)) {User nowUser = (User) e.getValue();User sUser = (User)session.getAttribute(loginFlag);// 遍历所有sessionfor (int i = sessions.size()-1; i >= 0; i--) {SessionAndUser tem = sessions.get(i);if (tem.getUserID().equals(nowUser.getName())) {tem.getSession().invalidate();//自动调用removebreak;}}SessionAndUser sau = new SessionAndUser();sau.setUserID(nowUser.getName());sau.setSession(session);sau.setSid(session.getId());sessions.add(sau);}}public void attributeRemoved(HttpSessionBindingEvent e) {HttpSession session = e.getSession();System.out.println("-------------*start Removed*-----------------------"); String attrName = e.getName();// 登录if (attrName.equals(loginFlag)) {User nowUser = (User) e.getValue();// 遍历所有sessionfor (int i = sessions.size()-1; i >= 0; i--) {SessionAndUser tem = sessions.get(i);if (tem.getUserID().equals(nowUser.getName())) {sessions.remove(i);break;}}}}public void attributeReplaced(HttpSessionBindingEvent e) {HttpSession session = e.getSession();System.out.println("-------------*start replace*-----------------------"); String attrName = e.getName();int delS=-1;// 登录if (attrName.equals(loginFlag)) {// User nowUser = (User) e.getValue();//old valueUser nowUser = (User)session.getAttribute(loginFlag);//当前session中的user // 遍历所有sessionfor (int i = sessions.size()-1; i >= 0; i--) {SessionAndUser tem = sessions.get(i);if(tem.getUserID().equals(nowUser.getName())&&!tem.getSid().equals(session.getId())) {System.out.println("Remove:invalidate 1!");delS=i;}else if(tem.getSid().equals(session.getId())){tem.setUserID(nowUser.getName());}}if (delS!=-1) {sessions.get(delS).getSession().invalidate();//失效时自动调用了remove方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2010-06-23 20:24:11 TiBackimport .*;import java.io.*;import java.sql.*;import java.util.*;public class QQServer {public static void main(String args[]) {try {//用户名同步(14)HashMap<String , Socket> hm = new HashMap<String , Socket>() ;// 服务器在8000端口监听(1)ServerSocket ss = new ServerSocket(8000);while (true) {"服务器正在8000端口监听.....");Socket s = ss.accept();MyService t = new MyService();t.setSocket(s);t.setHashMap(hm) ;t.start();}} catch (Exception e) {}}}// 支持多用户登陆(13)class MyService extends Thread {private Socket s;private HashMap<String , Socket> hm ;public void setHashMap(HashMap<String , Socket> hm) {this.hm = hm ;}public void setSocket(Socket s) {this.s = s;}public void run() {try {// 接收客户端发送来的用户名和密码(2)InputStream is = s.getInputStream();InputStreamRead er isr = new InputStreamRead er(is);BufferedReader br = new BufferedRead er(isr);String uandp = br.readLine();// 拆分(4)String u = uandp.split("%")[0];String p = uandp.split("%")[1];// 到数据库中验证(5)Class.forName("");Connection cn = DriverManager.getConnection("jdbc:;databasename=wy", "sa","123");PreparedStatement ps = cn.prepareStatement("select * from username where username=? and password=?"); ps.setString(1, u);ps.setString(2, p);ResultSet rs = ps.executeQuery();// 发送确认信息回客户端(7)OutputStream os = s.getOutputStream();OutputStreamWriter osw = new OutputStreamWriter(os);PrintWriter pw = new PrintWriter(osw, true);if (rs.next()) {pw.println("ok");Thread.sleep(10) ;//将自己的名字发送给其他人(17)for(Socket ts : hm.values()){OutputStream tos = ts.getOutputStream() ;OutputStreamWriter tosw = new OutputStreamWriter(tos) ;PrintWriter tpw = new PrintWriter(tosw , true) ;tpw.println("user%"+u) ;}//将其他人的名字发送给自己(18)for(String tu : hm.keySet()){pw.println("user%"+tu) ;}//将用户名和Socket存入HashMap(15)hm.put(u, s) ;// 接收客户端发送来的信息(11)while (true) {String message = br.readLine();//判断是否退出if(message.equals("{exit}")){for(Socket ts : hm.values()){OutputStream tos = ts.getOutputStream() ; OutputStreamWriter tosw = new OutputStreamWriter(tos) ; PrintWriter tpw = new PrintWriter(tosw , true) ;tpw.println("exit%"+u) ;}hm.remove(u) ;return ;}String to = message.split("%")[0] ;String mess = message.split("%")[1] ;Socket ts = hm.get(to) ;OutputStream tos = ts.getOutputStream() ; OutputStreamWriter tosw = new OutputStreamWriter(tos) ; PrintWriter tpw = new PrintWriter(tosw , true) ;tpw.println("mess%"+mess) ;}} else {pw.println("err");}} catch (Exception e) {}}}2010-06-23 20:24:37 TiBackimport java.awt.*;import ;import ;import .*;import java.io.*;import javax.swing.*;public class QQLogin extends JFrame implements ActionListener { JTextFiel d txtUser = new JTextField();JPasswordFiel d txtPass = new JPasswordField();public QQLogin() {// 设置窗体属性this.setSize(250, 125);this.setTitle("QQ登陆");this.setResizable(false);// new一大堆组件JLabel labUser = new JLabel("用户名");JLabel labPass = new JLabel("密码");JButton btnLogin = new JButton("登陆");JButton btnReg = new JButton("注册");JButton btnCancel = new JButton("取消");// 注册事件btnLogin.addActionListener(this);btnReg.ad dActionListener(this);btnCancel.addActionListener(this);// 布置输入面板JPanel panInput = new JPanel();panInput.setLayout(new GridLayout(2, 2));panInput.add(labUser);panInput.add(txtUser);panInput.add(labPass);panInput.add(txtPass);// 布置按钮面板JPanel panButton = new JPanel();panButton.setLayout(new Fl owLayout());panButton.add(btnLogin);panButton.add(btnReg);panButton.add(btnCancel);// 布置窗体this.setLayout(new BorderLayout());this.ad d(panInput, BorderLayout.CENTER);this.ad d(panButton, BorderLayout.SOUTH);}public static void main(String args[]) {JFrame.setDefaultLookAndFeelDecorated(true); QQLogin w = new QQLogin();w.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e) {if (e.getActionCommand().equals("登陆")) {String u = txtUser.getText();String p = txtPass.getText();try{//将用户名和密码发送到服务器(3)Socket s = new Socket("",8000) ;OutputStream os = s.getOutputStream() ; OutputStreamWriter osw = new OutputStreamWriter(os) ; PrintWriter pw = new PrintWriter(osw , true) ;pw.println(u+"%"+p) ;//接收服务器发送回来的确认信息(6)InputStream is = s.getInputStream() ; InputStreamRead er isr = new InputStreamRead er(is) ; BufferedReader br = new BufferedRead er(isr) ;String yorn = br.readLine() ;//显示主窗体(8)if(yorn.equals("ok")){QQMain w = new QQMain(u) ;w.setSocket(s) ;w.setVisible(true) ;this.setVisible(false) ;}else {JOptionPane.showMessageDialog(this, "滚") ; }}catch(Exception ee){}}if (e.getActionCommand().equals("注册")) {}if (e.getActionCommand().equals("取消")) { System.exit(0);}}}。