利用JAVA实现简单聊天室

合集下载

SimpleChat程序(一对多聊天源代码 java)

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, "航哥哥");//启动服务端,约定端口,指定网名}}。

本科毕业论文-基于JAVA的聊天系统的设计与实现【范本模板】

本科毕业论文-基于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。

java聊天室部分主要代码

java聊天室部分主要代码

ChatClient.javaimport java.awt.*;import java.io.*;import .*;import java.applet.*;import java.util.Hashtable;public class ChatClient extends Applet implements Runnable{ Socket socket=null;DataInputStream in=null;//读取服务器端发来的消息DataOutputStream out=null;//向服务器端发送的消息InputInfo 用户名提交界面=null;UserChat 聊天界面=null;Hashtable listTable;//用于存放在线用户的用户名的散列表Label 提示条;Panel north,center;Thread thread;public void init(){setSize(1000,800);int width=getSize().width;int height=getSize().height;listTable=new Hashtable();setLayout(new BorderLayout());用户名提交界面=new InputInfo(listTable);int h=用户名提交界面.getSize().height;聊天界面=new UserChat("",listTable,width,height-(h+5));聊天界面.setVisible(false);提示条=new Label("正在连接到服务器...",Label.CENTER);提示条.setForeground(Color.red);north=new Panel(new FlowLayout(FlowLayout.LEFT));center=new Panel();north.add(用户名提交界面);north.add(提示条);center.add(聊天界面);add(north,BorderLayout.NORTH);add(center,BorderLayout.CENTER);validate();}public void start(){if(socket!=null&&in!=null&&out!=null){try{socket.close();in.close();out.close();聊天界面.setVisible(false);}catch(Exception ee){}}try{socket=new Socket(this.getCodeBase().getHost(),6666);in=new DataInputStream(socket.getInputStream());out=new DataOutputStream(socket.getOutputStream());}catch(IOException ee){提示条.setText("连接失败");}//客户端成功连接服务器端if(socket!=null){InetAddress address=socket.getInetAddress();提示条.setText("连接:"+address+"成功");用户名提交界面.setSocketConnection(socket,in,out);north.validate();}if(thread==null){thread=new Thread(this);thread.start();}}public void stop(){try{socket.close();thread=null;}catch(IOException e){this.showStatus(e.toString());}}public void run(){while(thread!=null){if(用户名提交界面.getchatornot()==true){聊天界面.setVisible(true);聊天界面.setName(用户名提交界面.getName());聊天界面.setSocketConnection(socket,in,out);提示条.setText("祝聊天快乐!");center.validate();break;}try{Thread.sleep(100);}catch(Exception e){}}}}ChatMain.javaimport .*;import java.util.*;public class ChatMain {public static void main(String args[]) {ServerSocket server=null;Socket you=null;Hashtable peopleList;peopleList=new Hashtable();while(true){try{//服务器端在端口6666处监听来自客户端的信息server=new ServerSocket(6666);}catch(IOException e1){System.out.println("正在监听");}try{//当服务器端接收到客户端的消息后,取得客户端的IP地址。

用Java Socket实现网络聊天室

用Java Socket实现网络聊天室

务的端 口为8 端 口. e n t 2 端 口, 0 t le 为 3 f p为 2 端 口。通常.从 0 1 2 t 1 — 0 3的端
程序使用 。
L号为系统保 留.大于 1 2 『 0 3提供给应 用 F i t t e m( e rnSra nw
B f e e o tu S r a u f r d u p t t em
t ryi
首先 分析一下聊天室的基 本功能 需

操 作系统的通 用网络编程标准 。在 网络 编程中最常用的方案便是客户 / 务器模 服 型。奉文提 出了在客户机 /服务器 模型 下用 j v o k t a a sc e 实现 I t r e n en t巾常见 的聊天 室软件 的解 决方案 。 Sc e o k t简介
e :
户 当用 户差 闭客 户 端退 出时 . 结束
与用户的 会话 .在服务器端注 销此用 户 2.客户 端 :提 供 良好 的用户 界 面 . 便 于用 户 进 行 连接 、交 谈 当与
个 具有 S c e 接 口的计算机通信 。『 okt 盏用 程序在 网络上传输 ,接收 的信 息都通过 这个 S c e 接 口来 实现 。在应 用开发中 okt
S s e u . r a l (E r r y tm o t p it n r o : e: )
端 有无 数据 发 出, 如有 则接 收数 据 , 更新显示 。 四 、聊 天室应 用程 序类音 规 划 9
经过分析 笔者主 要确定 了如下类 :
服务器端 :

如睹络上最通用 的 t 1 e 、f p等 .就 en t t 如主机 接收 到此请求 .则通信 建 是基于 s c e o k t的服 务程序 ,同一 台主机 立 .服务端产 生一个 S c e o k t实例 .同 可 以提供 多种 服 务,但他 们 并不冲 突 . 此 客 户端 进 行 通 信 ,如 上 。 只因为他们的通信端 口不同,如 h t t p服 然后客户端和服务端分别打 开相 应 的输入输 出流 进行数据 传送 。

Java网络聊天室系统

Java网络聊天室系统
panel.add(lb2);
lb2.setPreferredSize(new Dimension(50,30));
lb2.setBounds(100, 150, 100, 30);
panel.add(txtName);
txtName.setBounds(200, 150, 150, 30);
}catch(Exception e){e.printStackTrace();}
public RegisterFrame(LoginFrame loginFrame)
{
this.f = loginFrame;
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); //设置外观为系统本地外观
this.setPreferredSize(new Dimension(500,500));
this.setBounds(screenSize.width/2-250, screenSize.height/2-250, 500, 500);
this.setVisible(true);
getContentPane().add(lb1);
lb1.setFont(new Font("",Font.BOLD,30));
lb1.setBounds(200, 100, 400, 50);
getContentPane().add(panel);
panel.setLayout(null);
panel.setVisible(true);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

Java课程设计聊天室(含代码)

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桥访问数据库。

使用Java和WebSocket实现网页聊天室实例代码

使⽤Java和WebSocket实现⽹页聊天室实例代码在没介绍正⽂之前,先给⼤家介绍下websocket的背景和原理:背景在浏览器中通过http仅能实现单向的通信,comet可以⼀定程度上模拟双向通信,但效率较低,并需要服务器有较好的⽀持; flash中的socket 和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使⽤这两项功能. 可以预见,如果websocket⼀旦在浏览器中得到实现,将会替代上⾯两项技术,得到⼴泛的使⽤.⾯对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。

在JavaEE7中也实现了WebSocket协议。

原理WebSocket protocol 。

现很多⽹站为了实现即时通讯,所⽤的技术都是轮询(polling)。

轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。

这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然⽽HTTP request 的header是⾮常长的,⾥⾯包含的有⽤数据可能只是⼀个很⼩的值,这样会占⽤很多的带宽。

⽽⽐较新的技术去做轮询的效果是Comet – ⽤了AJAX。

但这种技术虽然可达到全双⼯通信,但依然需要发出请求。

在 WebSocket API,浏览器和服务器只需要做⼀个握⼿的动作,然后,浏览器和服务器之间就形成了⼀条快速通道。

两者之间就直接可以数据互相传送。

在此WebSocket 协议中,为我们实现即时服务带来了两⼤好处:1. Header互相沟通的Header是很⼩的-⼤概只有 2 Bytes2. Server Push服务器的推送,服务器不再被动的接收到浏览器的request之后才返回数据,⽽是在有新数据时就主动推送给浏览器。

JAVA课程设计报告聊天室

JAVA课程设计报告聊天室一、课程目标知识目标:1. 学生能理解网络编程的基本概念,掌握JAVA Socket编程的基础知识。

2. 学生能运用面向对象编程思想,设计并实现聊天室客户端与服务器的数据传输功能。

3. 学生了解并掌握多线程技术在网络编程中的应用。

技能目标:1. 学生能运用所学知识,独立编写并调试简单的聊天室程序。

2. 学生具备分析问题、解决问题的能力,能针对聊天室程序进行优化和改进。

3. 学生能在团队协作中发挥自己的作用,与他人共同完成一个完整的网络编程项目。

情感态度价值观目标:1. 学生培养对计算机编程的兴趣,增强学习JAVA的自信心。

2. 学生认识到团队合作的重要性,培养良好的团队协作精神。

3. 学生通过编程实践,体验创新与创造的乐趣,培养积极向上的学习态度。

本课程针对高年级学生,结合课本内容,注重理论与实践相结合,以提高学生的实际编程能力为主要目标。

课程要求学生在掌握基本知识的基础上,能够独立完成实际项目,培养其分析问题、解决问题的能力。

同时,课程强调团队协作,使学生学会与他人共同进步,共同成长。

通过本课程的学习,使学生达到知识、技能和情感态度价值观的全面提升。

二、教学内容1. 网络编程基础理论:介绍网络编程的基本概念,包括IP地址、端口号、协议等,使学生理解网络通信的基本原理。

- 教材章节:第三章 网络编程基础2. JAVA Socket编程:讲解Socket编程的原理,指导学生掌握客户端与服务器之间的数据传输方法。

- 教材章节:第四章 Socket编程3. 面向对象编程:运用面向对象编程思想,设计聊天室程序,包括类的定义、封装、继承与多态。

- 教材章节:第二章 面向对象编程基础4. 多线程技术:介绍多线程编程的概念,分析在聊天室程序中如何实现多用户并发通信。

- 教材章节:第五章 多线程编程5. 聊天室程序设计与实现:指导学生完成聊天室客户端与服务器的编写,实现基本的功能需求。

java程序设计 实训题目

java程序设计实训题目
以下是一些Java程序设计实训题目,供您参考:
1. 编写一个Java程序,实现一个简单的计算器,可以进行加、减、乘、除
运算。

要求使用面向对象的思想,将计算器的功能封装在一个类中,并提供一个主函数用于测试。

2. 编写一个Java程序,实现一个简单的文本编辑器,可以打开、保存、编
辑和打印文本文件。

要求使用Java的I/O流和文件操作类库,以及图形用
户界面库(如Swing或JavaFX)。

3. 编写一个Java程序,实现一个简单的聊天室,支持多人同时在线聊天。

要求使用Java的多线程机制和网络编程技术(如Socket编程),并实现基本的用户注册、登录和消息发送功能。

4. 编写一个Java程序,实现一个简单的数据库管理系统,可以创建、删除、查询和更新数据库中的记录。

要求使用Java的JDBC API连接数据库,并
使用SQL语句进行操作。

5. 编写一个Java程序,实现一个简单的图像处理软件,可以对图像进行缩放、旋转、裁剪和滤镜处理。

要求使用Java的图像处理库(如Java Advanced Imaging API)和图形用户界面库(如Swing或JavaFX)。

6. 编写一个Java程序,实现一个简单的邮件发送系统,可以发送HTML格式的邮件。

要求使用Java的邮件发送库(如JavaMail API),并支持SMTP协议和附件上传功能。

7. 编写一个Java程序,实现一个简单的在线考试系统,可以随机生成试题、计时考试时间并自动评分。

要求使用Java的多线程机制和网络编程技术(如Socket编程),并实现基本的用户登录、答题和提交功能。

java websocket案例

java websocket案例摘要:1.Java WebSocket 简介2.WebSocket 案例一:聊天室3.WebSocket 案例二:在线投票4.WebSocket 案例三:实时股票信息5.总结正文:1.Java WebSocket 简介Java WebSocket 是一种在单个TCP 连接上进行全双工通信的协议。

相较于HTTP,WebSocket 提供了更快的数据传输速度和更低的延迟,使得实时应用和交互成为可能。

在Java 中,我们可以通过使用WebSocket API 和相关的库来实现WebSocket 应用。

2.WebSocket 案例一:聊天室聊天室是一个经典的实时通信应用。

在这个案例中,我们可以使用Java WebSocket 实现一个简单的聊天室,让用户能够实时地发送和接收消息。

通过WebSocket,我们可以实现客户端与服务器之间的双向通信,让用户能够实时地看到其他人发送的消息。

3.WebSocket 案例二:在线投票在线投票是一个实时的数据收集和处理应用。

使用Java WebSocket,我们可以实现一个实时的在线投票系统。

在这个系统中,用户可以实时地投票并查看投票结果。

通过WebSocket,我们可以实时地更新投票数据,让用户能够看到实时的投票结果。

4.WebSocket 案例三:实时股票信息实时股票信息是一个需要快速响应的应用。

使用Java WebSocket,我们可以实现一个实时的股票信息展示系统。

在这个系统中,用户可以实时地查看股票的涨跌情况。

通过WebSocket,我们可以实时地更新股票数据,让用户能够看到实时的股票信息。

5.总结Java WebSocket 为实时应用和交互提供了强大的支持。

通过使用WebSocket,我们可以实现聊天室、在线投票和实时股票信息等应用,为用户提供更加丰富和实时的体验。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用JAVA实现简单聊天室1.设计思路Java是一种简单的,面向对象的,分布式的,解释的,键壮的,安全的,结构中立的,可移植的,性能很优异的,多线程的,动态的语言。

而且,Java 很小,整个解释器只需215K的RAM。

因此运用JAVA程序编写聊天室,实现简单聊天功能。

程序实现了聊天室的基本功能,其中有:(1)启动服务器:实现网络的连接,为注册进入聊天室做准备。

(2)注册登陆界面:填写基本信息如姓名等,可以供多人进入实现多人聊天功能。

(3)发送信息:为用户发送信息提供平台。

(4)离开界面:使用户退出聊天室。

(5)关闭服务器:断开与网络的连接,彻底退出聊天室。

2.设计方法在设计简单聊天室时,需要编写5个Java源文件:Server.java、Objecting.java、LogIn.java、ClientUser.java、Client.java。

3 程序功能图及程序相关说明(1)主功能框图(2) 聊天室基本功能表4.程序代码是说明程序中引入的包:package Chat;import .*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*;import java.io.*;(1)服务器端代码中用户自定义类:类名:Server作用:服务器启动继承的接口名:ActionListenerpublic class Server implements ActionListener{定义的对象:count //记录点机关闭按钮次数2次关闭soconly //只有SOCKET,用于群发sockets//所有客户的SOCKETsocket_thread //Socket所在的线乘,用于退出;frame // 定义主窗体panel //定义面板start,stop //启动和停止按钮主要成员方法:public void center //定义小程序查看器的位置public void actionPerformed //定义处理异常机制定义子类:serverRun,Details继承的父类名:Threadclass serverRun extends Thread //启线乘用于接收连入的Socket class Details extends Thread //具体处理消息的线乘,只管发送消息创建一个ServerSocket 对象,用于接受指定端口客户端的信息ServerSocket server = new ServerSocket("1234");接受请求时候,通过accept()方法,得到一个socket对象。

Socket socket = server.accept();通过socket创建流(输入,输出)。

BufferedReaderbr=newBufferedReader(newInputStreamReader(socket.getInputStream()))DataInputStream dis = new DataInputStream(socket.getInputStream());PrintWriter out = new PrintWriter(socket.getOutputStream()); 通过流,来和客户交互。

(2)用户注册代码中相关类:类名:LogIn作用:用户注册登录继承的接口名:ActionListenerpublic class LogIn implements ActionListener定义的对象:Title //定义标题Name //提示输入姓名,添加注册信息Send //提示点击“进入”,进入聊天室构造方法:public LogIn()(3)客户端:①创建一个socket对象,用于连接服务器。

②用socket创建流。

③通过流和服务器进行交互。

④交互完毕,将流和socket关闭。

(4)聊天室:类名:Client作用:实现发送即时信息。

继承的接口名:ActionListenerpublic class Client implements ActionListener构造方法:public Client(String name2)异常处理:public void actionPerformed(ActionEvent e)public void connect()public void actionPerformed(ActionEvent e)定义的子类:ClientSocket继承的父类:Threadclass ClientSocket extends Thread ()5.设计结果与分析5个Java源文件:Server.java、Objecting.java、LogIn.java、ClientUser.java、Client.java。

分别编译这5个Java源文件,或运行“javac *.java”命令,编译全部的源文件,然后运行连接服务器的主类,即运行Server 类。

连接完毕后在运行注册的主函数类,即运行LogIn类。

首先运行启动服务器的文件Server.java,运行结果如下:图1服务器启动成功结果分析:在进入聊天室之前必须先启动服务器,实现服务器端的连接为用户的登录打开“窗口”。

其次运行用户注册登录文件LogIn.java,运行结果如下:图2用户登陆界面结果分析:添加用户信息,输入用户姓名,为用户进入聊天室提供关口。

并且利用以下语句实现如图3的界面 JLabel title=new JLabel("免注册版"); JLabel name=new JLabel("输入姓名");JButton send=new JButton("进入");添加注册信息后点击“进入”按钮,结果如图3图3显示用户已登录结果分析:当服务器启动用户完成信息注册时,在服务期端的界面中会显示当前在线的人员,并且提示客户已连接到服务器,可以进行聊天行为。

图4显示聊天内容结果分析:多个用户进入聊天室之后,用户可以在发送信息的文本框里填写自己的内容,点击“发送信息”按钮,信息会出现在上方的区域内,在界面的右方还可以显示在线人员的姓名,另在线用户可以知道有谁在聊天室内。

聊天结束点击“离开”按钮,结果如图5所示:图5离开聊天室点击服务器中的“停止”按钮,结果如图6.图7.所示:图6 点击“停止”按钮图7终止与服务器端连接结果分析:用户聊天结束点击“离开”按钮之后会在服务器端的界面上自动显示该用户已离开,提时、示服务器执行相关行为。

离开界面:使用户退出聊天室;关闭服务器:断开与网络的连接,彻底退出聊天室。

6.语句实现(1)Server.javapackage Chat;import .*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.io.*;public class Server implements ActionListener{int count=0;Vector soconly=new Vector();HashMap sockets=new HashMap();HashMap socket_thread=new HashMap();ServerSocket serversocket;JFrame frame;JTextArea area=new JTextArea();JPanel panel=new JPanel();JButton start=new JButton("启动");JButton stop=new JButton("停止");public Server() {panel.add(start);panel.add(stop);frame.add(panel,BorderLayout.NORTH);frame.add(area,BorderLayout.CENTER);frame.pack();center();frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);frame.setVisible(true);start.addActionListener(this);stop.addActionListener(this);System.out.println("new");}public void center(){Toolkit toolkit=Toolkit.getDefaultToolkit();Dimension e=toolkit.getScreenSize();int x=e.width/2-(int)(frame.getSize().getWidth()/2);int y=e.height/2-(int)(frame.getSize().getHeight()/2);frame.setLocation(x,y);}public void actionPerformed(ActionEvent e){JButton btn=(JButton)e.getSource();if(btn==start){serverRun serverrun=new serverRun();System.out.println("gogo");serverrun.start();}if(btn==stop){try{Iterator i = soconly.iterator();while (i.hasNext()) {Socket s = (Socket) i.next();ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());Objecting bj=new Objecting();out.writeObject("系统消息-----服务器马上关闭!!!!!!请马上关闭客户端");}count++;if(count==2){System.exit(0);}JOptionPane.showMessageDialog(frame,"已通知客户端,请再次点击关闭按钮关闭");}catch(Exception ex){ex.printStackTrace();}}}class serverRun extends Thread{public void run(){try{System.out.println("开始SERVERRUN");serversocket=new ServerSocket(55555);area.append("服务器启动\n");start.setEnabled(false);while(true){Socket socket=serversocket.accept();System.out.println("连接成功");BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));String name=br.readLine();area.append("服务器接收用户"+name+"的连接\n");soconly.add(socket);Iterator i=soconly.iterator();while(i.hasNext()){Socket s=(Socket)i.next();//获得其他SOCKET的通信口ObjectOutputStream out=newObjectOutputStream(s.getOutputStream());out.writeObject("系统消息-----"+name+"用户进入"+"------"); }V ector v=getList();Iterator j=soconly.iterator();while(j.hasNext()){Socket s = (Socket) j.next();ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());out.writeObject(v);System.out.println("服务器发送用户列表进入"); }Details d=new Details(socket);socket_thread.put(name,d);d.start();}}catch(Exception e){e.printStackTrace();}} }class Details extends Thread{boolean alive=true;ObjectInputStream in;ObjectOutputStream out;Socket socket;Details(Socket socket){this.socket=socket;public void run(){while(alive){try{in = new ObjectInputStream(socket.getInputStream());Objecting objecting=(Objecting)in.readObject();String name=objecting.getKey();String content=objecting.getValue();if(name.equalsIgnoreCase("all")){Iterator i=soconly.iterator();while(i.hasNext()){Socket s=(Socket)i.next();out=new ObjectOutputStream(s.getOutputStream());out.writeObject(content);System.out.println("Send");} }if(name.equalsIgnoreCase("exit")){Details thread=(Details)socket_thread.get(content);thread.alive=false;area.append(content+"离开\n");socket.close();soconly.remove(socket);sockets.remove(content);Iterator i=soconly.iterator();while(i.hasNext()){Socket s=(Socket)i.next();out=new ObjectOutputStream(s.getOutputStream());out.writeObject("系统消息-----"+content+"用户离开"+"------"); }Vector v=getList();Iterator j=soconly.iterator();while(j.hasNext()){Socket s = (Socket) j.next();ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());out.writeObject(v);System.out.println("服务器发送用户列表离开");}}if(!name.equalsIgnoreCase("all")&!name.equalsIgnoreCase("exit")){area.append("处理私聊信息");Socket s=(Socket)sockets.get(name);out=new ObjectOutputStream(s.getOutputStream());out.writeObject(content);}catch(Exception e){e.printStackTrace();}} } }public Vector getList(){Vector v=new Vector();Set set=sockets.keySet();Iterator i=set.iterator();while(i.hasNext()){v.add(i.next());}return v;}public static void main(String args[]){new Server(); } }(2)Objecting.javapackage Chat;import java.io.Serializable;public class Objecting implements Serializable{String key;String value;public Objecting(){ }public Objecting(String key,String value) {this.key =key;this.value=value;}public void setKey(String key) {this.key = key; }public void setValue(String value) {this.value = value; }public String getKey() {return key; }public String getValue() {return value;} }(3)LogIn.javapackage Chat;import javax.swing.*;import java.awt.*;import java.awt.event.*;public class LogIn implements ActionListener{JFrame frame;JLabel title=new JLabel("免注册版");JPanel banner=new JPanel();JTextField text=new JTextField(10);JPanel body=new JPanel();JPanel buttom=new JPanel();JLabel name=new JLabel("输入姓名");JButton send=new JButton("进入");public LogIn() {frame=new JFrame("注册");frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);banner.add(title);body.add(name);body.add(text);buttom.add(send);frame.add(banner,BorderLayout.NORTH);frame.add(body,BorderLayout.CENTER);frame.add(buttom,BorderLayout.SOUTH);frame.pack();center();frame.setVisible(true);send.addActionListener(this); }public void center(){Toolkit toolkit=Toolkit.getDefaultToolkit();Dimension e=toolkit.getScreenSize();int x=e.width/2-(int)(frame.getSize().getWidth()/2);int y=e.height/2-(int)(frame.getSize().getHeight()/2);frame.setLocation(x,y); }public void actionPerformed(ActionEvent e){if(text.getText().equals("")){JOptionPane.showMessageDialog(frame,"姓名不能为空");return;}else{new Client(text.getText());frame.dispose(); } }public static void main(String args[]){new LogIn(); } }(4)ClientUser.javapackage Chat;import java.awt.*;import java.awt.event.*;import javax.swing.*;import .*;import java.io.*;public class ClientUser extends WindowAdapter implements ActionListener,Runnable{public JFrame jf;public JTextField jt;public JTextField name;public JButton connect;public JScrollPane jsp;public JTextArea jta;public JButton jb;public JLabel l;Socket soc;InputStream soc_in;OutputStream soc_out;BufferedReader Bsoc_in;PrintWriter Psoc_out;public ClientUser(){jf=new JFrame("Client Chat Room");jta=new JTextArea(10,30);jta.setEditable(false);jsp=newJScrollPane(jta,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_ SCROLLBAR_AS_NEEDED);jt=new JTextField(30);name=new JTextField(5);l=new JLabel("Please in put your name");connect=new JButton("Connect");connect.addActionListener(this);jt.addActionListener(this);jb=new JButton("Send The Message");jb.addActionListener(this);JPanel jp=new JPanel();JPanel jp2=new JPanel();jp.setLayout(new FlowLayout());jp.add(jt);jp.add(jb);jp2.add(l);jp2.add(name);jp2.add(connect);Container c=jf.getContentPane();c.setLayout(new GridBagLayout());GridBagConstraints gbc=new GridBagConstraints();gbc.gridx=0;gbc.gridy=0;c.add(jp2,gbc);gbc.gridx=0;gbc.gridy=1;c.add(jsp,gbc);gbc.gridy=2;c.add(jp,gbc);jf.pack();jf.setVisible(true); }public static void main(String[] args) {ClientUser cuser=new ClientUser(); }public void windowClosing(WindowEvent e){System.exit(0);}public void actionPerformed(ActionEvent e){if (e.getSource()==connect){if(name.getText().equals("")){new JOptionPane().showMessageDialog(null,"Please in Put your name First!");}else{try{soc=new Socket("localhost",55555);Psoc_out=new PrintWriter(soc.getOutputStream(),true);Bsoc_in=new BufferedReader(new InputStreamReader(soc.getInputStream()));Psoc_out.println(name.getText());}catch(Exception e1){e1.printStackTrace();}name.setEditable(false);new Thread (this).start();} }if(e.getSource()==jt||e.getSource()==jb){jta.append(name.getText()+":"+jt.getText()+"\n");Psoc_out.println(name.getText()+":"+jt.getText());jt.setText("");} }public void run(){String text;while(true){try{text=Bsoc_in.readLine();jta.append(text+"\n");}catch(Exception e){e.printStackTrace();}} }(5)Client.javapackage Chat;import javax.swing.*;import java.awt.*;import java.awt.event.*;import .*;import java.io.*;import java.util.Vector;public class Client implements ActionListener{ClientSocket cs;String name;Socket socket;JFrame frame;JTextArea area=new JTextArea(30,30);JTextField text=new JTextField(30);JButton send=new JButton("发送消息");JButton exit=new JButton("离开");JPanel banner=new JPanel();JPanel panel=new JPanel();List list=new List(35);JPanel right=new JPanel();JLabel welcome=new JLabel();public Client(String name2) {=name2;welcome.setText(name+"----欢迎来到聊天室");area.setEditable(false);frame=new JFrame("聊天室");frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);frame.setResizable(false);banner.add(welcome);frame.add(banner,BorderLayout.NORTH);panel.add(text);panel.add(send);panel.add(exit);frame.add(panel,BorderLayout.SOUTH);frame.add(area,BorderLayout.CENTER);right.add(new JScrollPane(list));frame.add(right,BorderLayout.EAST);frame.pack();center();frame.setVisible(true);connect();send.addActionListener(this);exit.addActionListener(this);list.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){String to=list.getSelectedItem();String content=JOptionPane.showInputDialog(frame,"输入向"+name+"发送的私聊信息","私聊",RMA TION_MESSAGE);if(content==null){return;}else{Objecting o=new Objecting(to,"---私聊信息--"+name+":"+content);try{ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());out.writeObject(o);JOptionPane.showMessageDialog(frame,to+"收到消息");}catch(Exception e2){e2.printStackTrace();}}}});text.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){if(text.getText().equals("")){JOptionPane.showMessageDialog(frame,"消息为空");return;}else{Objecting o=new Objecting("all",name+":"+text.getText())try{ObjectOutputStreamout=new ObjectOutputStream(socket.getOutputStream());out.writeObject(o);text.setText("");}catch(Exception e2){e2.printStackTrace();}} } }); }public void connect(){try{socket = new Socket("localhost",55555);cs=new ClientSocket();cs.start();}catch(Exception e){e.printStackTrace();} }public void center(){Toolkit toolkit=Toolkit.getDefaultToolkit();Dimension e=toolkit.getScreenSize();int x=e.width/2-(int)(frame.getSize().getWidth()/2);int y=e.height/2-(int)(frame.getSize().getHeight()/2);frame.setLocation(x,y);}class ClientSocket extends Thread{ObjectInputStream in;ObjectOutputStream out;PrintWriter pw;public void run(){try{pw = new PrintWriter(socket.getOutputStream(),true);pw.println(name);}catch(Exception e){e.printStackTrace();}while(true){try{in = new ObjectInputStream(socket.getInputStream());Object o=in.readObject();if(o instanceof String){area.append(o.toString()+"\n"); }if(o instanceof Vector){System.out.println("列表操作");Vector v=(Vector)o;list.removeAll();Object []obj=v.toArray();for(int i=0;i<obj.length;i++){System.out.println((String)obj[i]);list.add((String)obj[i]);} }}catch(Exception e){e.printStackTrace();} } } }public void actionPerformed(ActionEvent e){JButton btn=(JButton)e.getSource();if(btn==send){if(text.getText().equals("")){JOptionPane.showMessageDialog(frame,"消息为空");return;}else{Objecting o=new Objecting("all",name+":"+text.getText());try{ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());out.writeObject(o);text.setText("");}catch(Exception e2){e2.printStackTrace();}}}if(btn==exit){Objecting o=new Objecting("exit",name);try{ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());out.writeObject(o);cs.stop();socket.close();}catch(Exception x){x.printStackTrace();}System.exit(0);} } }(5)ServerHost.javapackage Chat;import java.awt.*;import java.awt.event.*;import java.io.*;import .*;import javax.swing.*;import java.util.*;public class ServerHost extends WindowAdapter implements ActionListener,Runnable{ public JFrame jf;public JTextField jt;public JScrollPane jsp;public static JTextArea jta;public JButton jb;HashMap hm=new HashMap();JLabel inof;JTextField name;JCheckBox check;OutputStream soc_out;Vector Thread_vector=new Vector();public ServerHost(){jf=new JFrame("Server Chat Room");jta=new JTextArea(10,30);jta.setEditable(false);jsp=newJScrollPane(jta,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_ SCROLLBAR_AS_NEEDED);jt=new JTextField(30);jt.addActionListener(this);jb=new JButton("Send The Message");jb.addActionListener(this);check=new JCheckBox("Send to all");check.setSelected(true);inof=new JLabel("write the name you want to send");name=new JTextField(5);name.enable(false);JPanel jp=new JPanel();jp.setLayout(new FlowLayout());jp.add(inof);jp.add(name);jp.add(jt);jp.add(jb);jp.add(check);Container c=jf.getContentPane();c.setLayout(new GridBagLayout());GridBagConstraints gbc=new GridBagConstraints();gbc.gridx=0;gbc.gridy=0;c.add(jsp,gbc);gbc.gridy=1;c.add(jp,gbc);jf.pack();jf.setVisible(true);}public void windowClosing(WindowEvent e){System.exit(0); }public static void main(String[] args) {ServerHost sh=new ServerHost();new Thread(sh).start(); }public void run(){ServerSocket ssc=null;try{ssc=new ServerSocket(55555);}catch(Exception e){System.out.print("1");}while(true){try{Socket soc=ssc.accept();BufferedReaderBsoc_in=new BufferedReader(new InputStreamReader(soc.getInputStream()));String s=Bsoc_in.readLine();hm.put(soc,s);ServerThread st=new ServerThread(soc);Thread_vector.addElement(soc);new Thread(st).start();}catch(Exception e){System.out.print("2");}} }public void actionPerformed(ActionEvent e){boolean find=false;String temp="";try{if(check.isSelected()){for(int i=0;i<Thread_vector.size();i++){Socket s=(Socket)(Thread_vector.elementAt(i));PrintWriterPsoc_out=newPrintWriter( s.getOutputStream(),true);temp="Server:"+jt.getText()+"\n";Psoc_out.println("Server:"+jt.getText());Psoc_out.flush(); }jta.append(temp);jt.setText(""); }else{System.out.print("aaaaaaaa");Set shm=hm.keySet();Iterator it=shm.iterator();while(it.hasNext()){Map.Entry me=(Map.Entry)(it.next());String Sstr=(String)(me.getValue());if(Sstr.equals(name.getText())){Socket Smsoc=(Socket)(me.getKey());PrintWriterPsoc_out=newPrintWriter( Smsoc.getOutputStream(),true);Psoc_out.println(name.getText()+jt.getText());find=true; } }if(find==false){new JOptionPane().showMessageDialog(null,"Can not find the Clientuser");} }}catch(Exception e3){e3.printStackTrace();}}}class ServerThread implements Runnable{Socket socket;InputStream soc_in;BufferedReader Bsoc_in;ServerThread(Socket socket){this.socket=socket;}public void run(){try{soc_in=socket.getInputStream();Bsoc_in=new BufferedReader(new InputStreamReader(soc_in));String s=Bsoc_in.readLine();while(true){if(s!=null)ServerHost.jta.append(s+"\n");s=Bsoc_in.readLine();}}catch(Exception e){System.out.print("3");}}}。

相关文档
最新文档