你好,你有用java编写的聊天室的代码吗,基于cs架构的

你好,你有用java编写的聊天室的代码吗,基于cs架构的,第1张

服务端 用户名 y 密码 1 客户端代码在我的评论里,这敲不了那么多字,没办法。

登陆实现类: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()

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7832869.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存