免费预览已结束,剩余16页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java聊天室Java聊天室制作人:_杨永生_制作时间:2012.9.26目录1本文简介22聊天室截图与说明22.1用Java编译:22.2服务器登录界面22.3服务器窗口22.4客服端登录界面32.5客服端窗口33服务器端63.1MyServer()方法63.2Login()方法103.3Time()方法134客户端144.1MyClient()方法144.2Login()方法184.3Time()方法201 本文简介这是一个简单的Java聊天室,仅提供给一些刚学Java的学生做实验,本文也是仅供参考.本文代码都有注释,希望读者能读懂代码,本实验内部还有一些错误,比如只能一条一条的发信息,不能连发,希望能解决本问题的朋友能给我发信息,我的QQ号就是百度号!2 聊天室截图与说明2.1 用Java编译:本代码有七个类,放在六个java文件中,类名在下方希望读者自己观看,2.2 服务器登录界面要先运行服务器端的程序用户名:y密码:1用户名密码可以自己设定点击确定可以登录,2秒后到服务端界面2.3 服务器窗口聊天室的IP为本机的网络虚拟IP,在任何电脑上都能用,端口应设置在1024以后,2.4 客服端登录界面和服务器端的登录一样2.5 客服端窗口当登录上后 客服端就显示已经连接了,此时服务器端的窗口如下由于本程序设计的不是很完整,具体的聊天要先从客服端开始:在客服端输入一条聊天内容后按确定,在服务器端就可以收到信息,之后客户端不能输入了,要等待服务器端来信息后才能继续输入信息.想要结束聊天,直接可以关闭窗口,也可以输入bye后断开聊天有兴趣的朋友可以继续完善本实验程序.3 服务器端3.1 MyServer()方法/服务器端代码import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import .ServerSocket;import .Socket;import java.text.DateFormat;import java.util.Date;import javax.swing.*;public class MyServer /窗体实现类protected JLabel lab10; /全体变量,做传递的一个组件 String s=已经成功连接; /初始字符串,在两个聊天窗口链接成功时输出,同时作为两个窗口传递字符的一个变量 /构造方法 public MyServer()try/异常处理tryJFrame frame=new JFrame(服务器窗口); /设置窗体frame.setLayout(null); /让布局管理器为空 ,使用绝对定位Font fnt=new Font(Serief,Font.PLAIN,40);/字体设置Font fnt1=new Font(Serief,Font.PLAIN,20);/字体设置/我的用户名显示JLabel lab1=new JLabel(服务器名:,JLabel.LEFT); /标签实例化,文本左对齐lab1.setBounds(8, 10, 100, 20); /设置组件位置及大小frame.add(lab1); /添加组件JTextField text2=new JTextField(30); /单行文本输入组件text2.setBounds(150, 10, 200, 20);/设置组件位置及大小text2.setEnabled(false);/文本条不可编辑text2.setText(笑笑聊天室);/输入内容text2.setFont(fnt1);/设置字体frame.add(text2);/添加组件/服务器IP显示JLabel lab2=new JLabel(当前服务器IP:,JLabel.LEFT); /标签实例化,文本左对齐lab2.setBounds(8, 45, 100, 20);/设置组件位置及大小frame.add(lab2);/添加组件JTextField text3=new JTextField(30);/单行文本输入组件text3.setBounds(150, 45, 200, 20);/设置组件位置及大小text3.setEnabled(false); /文本不可编辑text3.setText();/输入内容text3.setFont(fnt1);/设置字体frame.add(text3); /添加组件/服务器端口显示JLabel lab3=new JLabel(当前服务器端口:,JLabel.LEFT); /标签实例化,文本左对齐lab3.setBounds(8, 80, 100, 20);/设置组件位置及大小frame.add(lab3);/添加组件JTextField text4=new JTextField(30);/单行文本输入组件text4.setBounds(150, 80, 200, 20);/设置组件位置及大小text4.setEnabled(false);/文本不可编辑text4.setText(8888);/输入内容text4.setFont(fnt1);/设置字体frame.add(text4);/添加组件/聊天记录显示JLabel lab4=new JLabel(聊天记录如下:,JLabel.LEFT); /标签实例化,文本左对齐lab4.setBounds(8, 115, 100, 20);/设置组件位置及大小frame.add(lab4);/添加组件final JTextArea text1=new JTextArea();/多行文本输入组件text1.setEnabled(false);/文本不可编辑text1.setLineWrap(true);/自动换行 JScrollPane scr=new JScrollPane(text1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); /设置滚动条,水平和垂直滚动条始终显示scr.setBounds(8, 150, 450, 350);/设置组件位置及大小frame.add(scr);/添加组件/聊天输入窗口及确定JLabel lab5=new JLabel(请输入聊天内容:,JLabel.LEFT); /标签实例化,文本左对齐lab5.setBounds(8, 500, 100, 20);/设置组件位置及大小frame.add(lab5);/添加组件final JTextArea text5=new JTextArea();/多行文本输入组件text5.setLineWrap(true);/自动换行JScrollPane scr2=new JScrollPane(text5,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);/设置滚动条,水平和垂直滚动条始终显示scr2.setBounds(150, 500, 300, 50);/设置组件位置及大小frame.add(scr2);/添加组件 final JButton but=new JButton(确定);/设置确定按钮but.setFont(fnt);/添加字体设置but.setBounds(480, 500, 200, 50);/设置组件位置及大小but.addActionListener(new ActionListener() /采用内部匿名类public void actionPerformed(ActionEvent e)if(e.getSource()=but) /判断触发器源是否是提交按钮text1.append(笑笑: +lab10.getText()+n );/在聊天记录上添加文本text1.append(text5.getText()+n); /将输入的聊天内容输出在聊天记录上 s=text5.getText(); /得到聊天内容 text5.setText(); / 将聊天窗口内容设置为空 ) ;frame.add(but);/添加组件/当前时间显示JLabel lab7=new JLabel(时间显示:,JLabel.LEFT);/标签实例化,文本左对齐lab7.setBounds(450, 20, 100, 20);/设置组件位置及大小frame.add(lab7);/添加组件DateFormat df=DateFormat.getDateTimeInstance();/取得系统时间String df2= df.format(new Date();/将时间转换成字符串JLabel lab8=new JLabel(df2,JLabel.LEFT);/标签实例化,文本左对齐lab8.setBounds(520, 20, 130, 20);/设置组件位置及大小frame.add(lab8);/添加组件lab10=lab8; /传递时间显示,以便能在聊天记录上显示记录时间new Time(lab8); /使时间动态显示/用户列表显示JLabel lab6=new JLabel(用户列表:,JLabel.LEFT);/标签实例化,文本左对齐lab6.setBounds(500, 40, 100, 20);/设置组件位置及大小frame.add(lab6);/添加组件JTextArea text6=new JTextArea();/标签实例化,文本左对齐text6.setEnabled(false);/文本不可编辑text6.setLineWrap(true);/自动换行JScrollPane scr3=new JScrollPane(text6,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);/设置滚动条,水平和垂直滚动条始终显示scr3.setBounds(460, 70, 220, 420);/设置组件位置及大小frame.add(scr3);/添加组件/窗口的属性frame.setSize(700,600);/窗口大小frame.getContentPane().setBackground(Color.pink);/窗口的背景颜色frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/关闭窗口时关闭程序frame.setLocation(100,50);/在电脑桌面上出现的位置frame.setVisible(true);/显示窗口/连个窗口连接/建立Server Socket并等待连接请求 ServerSocket server =new ServerSocket(8889); Socket socket=server.accept(); /连接建立,通过Socket获取连接上的输入/输出流 BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream(); final PrintWriter out =new PrintWriter(socket.getOutputStream(); /先读取Client发送的数据,然后从标准输入读取数据发送给Client当接收到bye时关闭连接String s1=,s2=; /标志字符串,作为传递字符串使用 while(!(s1=in.readLine().equals(bye) /得到其他窗口传递的字符串,并判断是否结束 text6.setText(可可在线); /当连接成功是在用户列表中 输出用户名字 if(!s1.equals() /如果传递的字符串不为空 text1.append(可可: +lab10.getText()+n );/在聊天记录上添加文本 text1.append(s1+n); /将输入的聊天内容输出在聊天记录上 s2=s;/将在聊天窗口中得到的字符串传递给输出字符串 for(;s2.equals()|s2.equals(null);s2=s)/当传递的字符串为空时等待用户输入聊天内容 s=;/将在聊天窗口中得到的字符串设为空 if(!s2.equals()&!s2.equals(null)/ s2不为空时做 out.println(s2);/向其他窗口输出字符串 out.flush();/输出聊天内容 /关闭连接 in.close(); out.close(); socket.close(); server.close(); catch(Exception e) /main函数public static void main(String args)new Login();/登录实现3.2 Login()方法import java.awt.event.WindowAdapter ;import java.awt.event.ActionListener ;import java.awt.event.WindowEvent ;import java.awt.event.ActionEvent ;import java.awt.Color ;import java.awt.Font ;import javax.swing.JFrame ;import javax.swing.JButton ;import javax.swing.JLabel ;import javax.swing.JTextField ;import javax.swing.JPasswordField ;/用户名和密码设置class LoginCheck/设置登录密码private String name ;/用户名private String password ;/密码/构造方法public LoginCheck(String name,String password) = name ;/传递用户名this.password = password ;/传递密码/验证用户名和密码public boolean validate()/验证方法if(y.equals(name)&1.equals(password) /判断用户名和密码是否正确return true ;/返回trueelsereturn false ;/返回false;/登录窗口class Login/登录类名boolean f=false;/按登录时设置的一个标志private JFrame frame = new JFrame(Welcome To MLDN) ; /设置窗体private JButton submit = new JButton(登陆);/设置登录按钮private JButton reset = new JButton(重置);/设置重置按钮private JLabel nameLab = new JLabel(服务器:) ;/标签实例化private JLabel passLab = new JLabel(密 码:) ;/标签实例化private JLabel infoLab = new JLabel(服务器登陆系统) ;/标签实例化private JTextField nameText = new JTextField(10) ;/单行文本输入条private JPasswordField passText = new JPasswordField() ;/单行密码文本输入条public Login()/登录窗口构造方法Font fnt = new Font(Serief,Font.ITALIC + Font.BOLD,12) ;/设置字体infoLab.setFont(fnt) ;/ 设置标签的显示文字submit.addActionListener(new ActionListener() /采用内部匿名类public void actionPerformed(ActionEvent e)if(e.getSource()=submit) /判断触发器源是否是提交按钮String tname = nameText.getText() ; /得到输入的用户名String tpass = new String(passText.getPassword() ;/得到输入的密码,此时通过getPassageword()方法返回的是字符数组LoginCheck log = new LoginCheck(tname,tpass) ;/实例化LoginCheck对象,传入输入的用户名和密码if(log.validate()/对用户名和密码进行验证try /线程异常处理tryThread.sleep(2000); /2秒后打开聊天窗口 f=true; /登录成功后的表示项为trueframe.dispose(); /关闭本窗口catch(Exception ee)/异常获取elseinfoLab.setText(登陆失败,错误的用户名或密码!) ;/登录失败) ;reset.addActionListener(new ActionListener() /采用内部匿名类public void actionPerformed(ActionEvent e)if(e.getSource()=reset) /判断触发器源是否是提交按钮nameText.setText() ;/设置文本框中的内容passText.setText() ;/设置文本框中的内容infoLab.setText(服务器登陆系统) ;/恢复标签显示) ;frame.addWindowListener(new WindowAdapter()/加入窗口监听public void windowClosing(WindowEvent e) ;/ 加入事件frame.setLayout(null) ;/使用绝对定位nameLab.setBounds(5,5,60,20) ;/设置标签的位置及大小passLab.setBounds(5,30,60,20) ;/设置标签的位置及大小infoLab.setBounds(5,65,220,30) ;/设置标签的位置及大小nameText.setBounds(65,5,100,20) ;/设置文本域的位置及大小passText.setBounds(65,30,100,20) ;/设置密码域的位置及大小submit.setBounds(165,5,60,20) ;/设置按钮的位置及大小reset.setBounds(165,30,60,20) ;/设置按钮的位置及大小frame.add(nameLab) ;/向窗体加入标签frame.add(passLab) ;/向窗体加入标签frame.add(infoLab) ;/向窗体加入标签frame.add(nameText) ;/向窗体加入文本框frame.add(passText) ;/向窗体加入密码框frame.add(submit) ;/向窗体加入按钮frame.add(reset) ;/向窗体加入按钮frame.setSize(280,130) ;/设置窗体大小frame.getContentPane().setBackground(Color.green) ;/设置窗体的背景颜色frame.setLocation(300,200) ;/设置窗体在电脑桌面上的位置frame.setVisible(true) ;/显示窗口while(f=false) /当登录失败时,一直循环运行,new MyServer();/显示窗体页面3.3 Time()方法import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.text.SimpleDateFormat;import java.util.Date;import javax.swing.JLabel;import javax.swing.Timer;/时间类public class Time public Time(JLabel time) /构造方法this.setTimer(time); /设置时间public void setTimer(JLabel time) /设置时间方法 final JLabel varTime = time; /传递组件 Timer timeAction = new Timer(1000, new ActionListener() /时间监听 public void actionPerformed(ActionEvent e) long timemillis = System.currentTimeMillis(); /得到系统时间 SimpleDateFormat df = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); /转换日期显示格式 varTime.setText(df.format(new Date(timemillis); /输出得到的时间 ); timeAction.start(); /开启线程 4 客户端4.1 MyClient()方法import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import .Socket;import java.text.DateFormat;import java.util.Date;import javax.swing.*;public class MyClientprotected JLabel lab10;/全体变量,做传递的一个组件 String s=连接成功;/初始字符串,在两个聊天窗口链接成功时输出,同时作为两个窗口传递字符的一个变量/构造方法 public MyClient()JFrame frame=new JFrame(用户端窗口); /设置窗体frame.setLayout(null); /让布局管理器为空 ,使用绝对定位Font fnt=new Font(Serief,Font.PLAIN,40);/字体设置Font fnt1=new Font(Serief,Font.PLAIN,20);/字体设置/我的用户名显示JLabel lab1=new JLabel(服务器名:,JLabel.LEFT); /标签实例化,文本左对齐lab1.setBounds(8, 10, 100, 20); /设置组件位置及大小frame.add(lab1); /添加组件JTextField text2=new JTextField(30); /单行文本输入组件text2.setBounds(150, 10, 200, 20);/设置组件位置及大小text2.setEnabled(false);/文本条不可编辑text2.setText(可可聊天室);/输入内容text2.setFont(fnt1);/设置字体frame.add(text2);/添加组件/服务器IP显示JLabel lab2=new JLabel(当前服务器IP:,JLabel.LEFT); /标签实例化,文本左对齐lab2.setBounds(8, 45, 100, 20);/设置组件位置及大小frame.add(lab2);/添加组件JTextField text3=new JTextField(30);/单行文本输入组件text3.setBounds(150, 45, 200, 20);/设置组件位置及大小text3.setEnabled(false); /文本不可编辑text3.setText();/输入内容text3.setFont(fnt1);/设置字体frame.add(text3); /添加组件/服务器端口显示JLabel lab3=new JLabel(当前服务器端口:,JLabel.LEFT); /标签实例化,文本左对齐lab3.setBounds(8, 80, 100, 20);/设置组件位置及大小frame.add(lab3);/添加组件JTextField text4=new JTextField(30);/单行文本输入组件text4.setBounds(150, 80, 200, 20);/设置组件位置及大小text4.setEnabled(false);/文本不可编辑text4.setText(8888);/输入内容text4.setFont(fnt1);/设置字体frame.add(text4);/添加组件/聊天记录显示JLabel lab4=new JLabel(聊天记录如下:,JLabel.LEFT); /标签实例化,文本左对齐lab4.setBounds(8, 115, 100, 20);/设置组件位置及大小frame.add(lab4);/添加组件final JTextArea text1=new JTextArea();/多行文本输入组件text1.setEnabled(false);/文本不可编辑text1.setLineWrap(true);/自动换行JScrollPane scr=new JScrollPane(text1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); /设置滚动条,水平和垂直滚动条始终显示scr.setBounds(8, 150, 450, 350);/设置组件位置及大小frame.add(scr);/添加组件/聊天输入窗口及确定JLabel lab5=new JLabel(请输入聊天内容:,JLabel.LEFT); /标签实例化,文本左对齐lab5.setBounds(8, 500, 100, 20);/设置组件位置及大小frame.add(lab5);/添加组件final JTextArea text5=new JTextArea();/多行文本输入组件text5.setLineWrap(true);/自动换行JScrollPane scr2=new JScrollPane(text5,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);/设置滚动条,水平和垂直滚动条始终显示scr2.setBounds(150, 500, 300, 50);/设置组件位置及大小frame.add(scr2);/添加组件 final JButton but=new JButton(确定);/设置确定按钮but.setFont(fnt);/添加字体设置but.setBounds(480, 500, 200, 50);/设置组件位置及大小but.addActionListener(new ActionListener() /采用内部匿名类public void actionPerformed(ActionEvent e)if(e.getSource()=but) /判断触发器源是否是提交按钮text1.append(可可: +lab10.getText()+n );/在聊天记录上添加文本text1.append(text5.getText()+n);/将输入的聊天内容输出在聊天记录上 s=text5.getText(); /得到聊天内容 text5.setText(); / 将聊天窗口内容设置为空 ) ;frame.add(but);/添加组件/当前时间显示JLabel lab7=new JLabel(时间显示:,JLabel.LEFT);/标签实例化,文本左对齐lab7.setBounds(450, 20, 100, 20);/设置组件位置及大小frame.add(lab7);/添加组件DateFormat df=DateFormat.getDateTimeInstance();/取得系统时间String df2= df.format(new Date();/将时间转换成字符串JLabel lab8=new JLabel(df2,JLabel.LEFT);/标签实例化,文本左对齐lab8.setBounds(520, 20, 130, 20);/设置组件位置及大小frame.add(lab8);/添加组件lab10=lab8; /传递时间显示,以便能在聊天记录上显示记录时间new Time(lab8); /使时间动态显示/用户列表显示JLabel lab6=new JLabel(用户列表:,JLabel.LEFT);/标签实例化,文本左对齐lab6.setBounds(500, 40, 100, 20);/设置组件位置及大小frame.add(lab6);/添加组件JTextArea text6=new JTextArea();/标签实例化,文本左对齐text6.setEnabled(false);/文本不可编辑text6.setLineWrap(true);/自动换行JScrollPane scr3=new JScrollPane(text6,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);/设置滚动条,水平和垂直滚动条始终显示scr3.setBounds(460, 70, 220, 420);/设置组件位置及大小frame.add(scr3);/添加组件/窗口的属性frame.setSize(700,600);/窗口大小frame.getContentPane().setBackground(Color.pink);/窗口的背景颜色frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/关闭窗口时关闭程序frame.setLocation(10,10);/在电脑桌面上出现的位置frame.setVisible(true);/显示窗口try /try异常处理 Socket socket=new Socket(,8889); /发出连接请求 /建立连接,通过Socket获得连接上的输入/输出流 PrintWriter out =new PrintWriter(socket.getOutputStream(); BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream(); /从标准输入中读取一行,发送Server端,当用户输入bye时结束连接 do while(s.equals()|s.equals(null)/当传递的字符串为空时等待用户输入聊天内容 if(!s.equals()&!s.equals(null)/s不为空时做 out.println(s); /向其他窗口输出字符串 s=; /将在聊天窗口中得到的字符串设为空 out.flush();/输出聊天内容 if(!s.equals(bye) /判断聊天是否结束 String s3; /得到其他窗口传来的字符串 while( (s3=in.readLine().equals(n)&s3.equals(null)&s3.equals()/判断s3是否为空 ,为空时等待 text6.setText(笑笑在线); /当连接成功是在用户列表中 输出用户名字 if(!s3.equals(n)&!s3.equals(null)&!s3.equals()/s3不为空时做 text1.append(笑笑: +lab10.getText()+n );/在聊天记录上添加文本 text1.append(s3+n); /将输入的聊天内容输出在聊天记录上 while(!s.equals(bye);/判断是否结束 /关闭连接 out.close(); in.close(); socket.close(); catch(Exception e) /main函数public static void main(String args)new Login();/登录实现4.2 Login()方法import java.awt.event.WindowAdapter ;import java.awt.event.ActionListener ;import java.awt.event.WindowEvent ;import java.awt.event.ActionEvent ;import java.awt.Color ;import jav
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年初中三年级化学下学期环境保护试卷
- 个人简历模版(三页)带封面(可编辑)橙色风格
- 2025关于停车场租赁合同范本
- 促进艺术教育普及提高全民审美水平
- 2025煤炭材料购销合同范本
- 2025长沙购销合同范文
- 2025版企业办公场地租赁合同范本
- 2025年重庆市铁路集团有限公司璧铜线运营公司招聘综合测试题库及答案
- 2025年城市轨道交通试题及答案
- 2025标准版城市房屋租赁合同模板
- 医学社区获得性肺炎诊疗和治疗指导建议
- 2025年辅警考试综合试题及答案
- 2025年数控车工职业技能鉴定考试(高级技师·一级)历年参考题库含答案
- YY/T 1976-2025中医器械玻璃拔罐器
- 2025年泰安市公开招聘劳务派遣制工会社会工作者(52人)笔试考试参考试题及答案解析
- 第12课 中国共产党诞生 课件(内嵌视频)
- 2025年生活美容行业分析报告及未来发展趋势预测
- 2025年教师职称考试(道德与法治学科知识)(小学)模拟试题及答案
- 事业单位会计专业考试重点题解
- 浙江省天域全国名校协作体2026届高三上学期10月联考技术试题(含答案)
- 超龄员工用工承诺书模板
评论
0/150
提交评论