登陆实现类:class Login
package com.server
import java.awt.Color
import java.awt.Font
import java.awt.event.ActionEvent
import java.awt.event.ActionListener
import java.awt.event.WindowAdapter
import java.awt.event.WindowEvent
import javax.swing.JButton
import javax.swing.JFrame
import javax.swing.JLabel
import javax.swing.JPasswordField
import javax.swing.JTextField
public 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{ //线程异常处理try
Thread.sleep(2000) //2秒后打开聊天窗口
f=true//登录成功后的表示项为true
frame.dispose() //关闭本窗口
}catch(Exception e1){//异常获取
e1.printStackTrace()
}
}else{
infoLab.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()//显示窗体页面
}
}
验证登陆实现类 class LoginCheck
package com.server
public class LoginCheck {
private String name //用户名
private String password //密码
//构造方法
public LoginCheck(String name,String password){
this.name = name //传递用户名
this.password = password //传递密码
}
//验证用户名和密码
public boolean validate(){
//验证方法
if("y".equals(name)&&"1".equals(password)){ //判断用户名和密码是否正确
return true//返回true
}else{
return false //返回false
}
}
}
package com.server
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 java.net.ServerSocket
import java.net.Socket
import java.text.DateFormat
import java.util.Date
import javax.swing.*
聊天实现类 class MyServer
public class MyServer {
protected JLabel lab10
// 全体变量,做传递的一个组件
String s = "已经成功连接"
// 初始字符串,在两个聊天窗口链接成功时输出,同时作为两个窗口传递字符的一个变量
// 构造方法
public MyServer(){
try{//异常处理
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("127.0.0.1")//输入内容
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()//登录实现 } }
}
}
时间类 class Time
package com.server
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() //开启线程
}
}
socket通讯是阻塞的,一个聊天就有一个socket,需要一直在哪里阻塞读取数据,所以就一个socket就要用一个线程了。如果用nio的话,通讯是非阻塞的,就不用一个聊天一个线程了。如果聊天人数大的话,建议用nio。现在netty框架就非常不错。/*** 基于UDP协议的聊天程序
*
*2007.9.18
* */
//导入包
import java.awt.*
import java.awt.event.*
import java.awt.event.ActionEvent
import java.awt.event.ActionListener
import javax.swing.*
import java.net.*
public class Chat extends JFrame implements ActionListener
{
//广播地址或者对方的地址
public static final String sendIP = "172.18.8.255"
//发送端口9527
public static final int sendPort = 9527
JPanel p = new JPanel()
List lst = new List() //消息显示
JTextField txtIP = new JTextField(18)//填写IP地址
JTextField txtMSG = new JTextField(20)//填写发送消息
JLabel lblIP = new JLabel("IP地址:")
JLabel lblMSG = new JLabel("消息:")
JButton btnSend = new JButton("发送")
byte [] buf
//定义DatagramSocket的对象必须进行异常处理
//发送和接收数据报包的套接字
DatagramSocket ds = null
//=============构造函数=====================
public Chat()
{
CreateInterFace()
//注册消息框监听器
txtMSG.addActionListener(this)
btnSend.addActionListener(this)
try
{
//端口:9527
ds =new DatagramSocket(sendPort)
}
catch(Exception ex)
{
ex.printStackTrace()
}
//============接受消息============
//匿名类
new Thread(new Runnable()
{
public void run()
{
byte buf[] = new byte[1024]
//表示接受数据报包
while(true)
{
try
{
DatagramPacket dp = new DatagramPacket(buf,1024,InetAddress.getByName(txtIP.getText()),sendPort)
ds.receive(dp)
lst.add("【消息来自】◆" + dp.getAddress().getHostAddress() + "◆"+"【说】:" + new String (buf,0,dp.getLength()) /*+ dp.getPort()*/,0)
}
catch(Exception e)
{
if(ds.isClosed())
{
e.printStackTrace()
}
}
}
}
}).start()
//关闭窗体事件
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent w)
{
System.out.println("test")
int n=JOptionPane.showConfirmDialog(null,"是否要退出?","退出",JOptionPane.YES_NO_OPTION)
if(n==JOptionPane.YES_OPTION)
{
dispose()
System.exit(0)
ds.close()//关闭ds对象//关闭数据报套接字
}
}
})
}
//界面设计布局
public void CreateInterFace()
{
this.add(lst,BorderLayout.CENTER)
this.add(p,BorderLayout.SOUTH)
p.add(lblIP)
p.add(txtIP)
p.add(lblMSG)
p.add(txtMSG)
p.add(btnSend)
txtIP.setText(sendIP)
//背景颜色
lst.setBackground(Color.yellow)
//JAVA默认风格
this.setUndecorated(true)
this.getRootPane().setWindowDecorationStyle(JRootPane.FRAME)
this.setSize(600,500)
this.setTitle("〓聊天室〓")
this.setResizable(false)//不能改变窗体大小
this.setLocationRelativeTo(null)//窗体居中
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE)
this.setVisible(true)
txtMSG.requestFocus()//消息框得到焦点
}
//===============================Main函数===============================
public static void main(String[]args)
{
new Chat()
}
//================================发送消息===============================
//消息框回车发送消息事件
public void actionPerformed(ActionEvent e)
{
//得到文本内容
buf = txtMSG.getText().getBytes()
//判断消息框是否为空
if (txtMSG.getText().length()==0)
{
JOptionPane.showMessageDialog(null,"发送消息不能为空","提示",JOptionPane.WARNING_MESSAGE)
}
else{
try
{
InetAddress address = InetAddress.getByName(sendIP)
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(txtIP.getText()),sendPort)
ds.send(dp)
}
catch(Exception ex)
{
ex.printStackTrace()
}
}
txtMSG.setText("")//清空消息框
//点发送按钮发送消息事件
if(e.getSource()==btnSend)
{
buf = txtMSG.getText().getBytes()
try
{
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(txtIP.getText()),sendPort)
}
catch(Exception ex)
{
ex.printStackTrace()
}
txtMSG.setText("")//清空消息框
txtMSG.requestFocus()
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)