publicclassChatAreaextendsPanelimplementsActionListener,Runnable
{
Socketsocket=null;
DataInputStreamin=null;
DataOutputStreamout=null;
ThreadthreadMessage=null;
TextArea谈话显示区,私聊显示区=null;
TextField送出信息=null;
Button确定,刷新谈话区,刷新私聊区;
Label提示条=null;
Stringname=null;
HashtablelistTable;
ListlistComponent=null;
ChoiceprivateChatList;
intwidth,height;
publicChatArea(Stringname,HashtablelistTable,intwidth,intheight)
setLayout(null);
setBackground(Color.orange);
this.width=width;
this.height=height;
setSize(width,height);
this.listTable=listTable;
this.name=name;
threadMessage=newThread(this);
谈话显示区=newTextArea(10,10);
私聊显示区=newTextArea(10,10);
确定=newButton("送出信息到:");
刷新谈话区=newButton("刷新谈话区");
刷新私聊区=newButton("刷新私聊区");
提示条=newLabel("双击聊天者可私聊",Label.CENTER);
送出信息=newTextField(28);
确定.addActionListener(this);
送出信息.addActionListener(this);
刷新谈话区.addActionListener(this);
刷新私聊区.addActionListener(this);
listComponent=newList();
listComponent.addActionListener(this);
privateChatList=newChoice();
privateChatList.add("大家(*)");
privateChatList.select(0);
add(谈话显示区);
谈话显示区.setBounds(10,10,(width-120)/2,(height-120));
add(私聊显示区);
私聊显示区.setBounds(10+(width-120)/2,10,(width-120)/2,(height-120));
add(listComponent);
listComponent.setBounds(10+(width-120),10,100,(height-160));
add(提示条);
提示条.setBounds(10+(width-120),10+(height-160),110,40);
PanelpSouth=newPanel();
pSouth.add(送出信息);
pSouth.add(确定);
pSouth.add(privateChatList);
pSouth.add(刷新谈话区);
pSouth.add(刷新私聊区);
add(pSouth);
pSouth.setBounds(10,20+(height-120),width-20,60);
}
publicvoidsetName(Strings)
name=s;
publicvoidsetSocketConnection(Socketsocket,DataInputStreamin,DataOutputStreamout)
this.socket=socket;
this.in=in;
this.out=out;
try
threadMessage.start();
catch(Exceptione)
publicvoidactionPerformed(ActionEvente)
if(e.getSource()==确定||e.getSource()==送出信息)
Stringmessage="";
Stringpeople=privateChatList.getSelectedItem();
people=people.substring(0,people.indexOf("("));
message=送出信息.getText();
if(message.length()0)
try{
if(people.equals("大家"))
out.writeUTF("公共聊天内容:"+name+"说:"+message);
else
out.writeUTF("私人聊天内容:"+name+"悄悄地说:"+message+"#"+people);
catch(IOExceptionevent)
elseif(e.getSource()==listComponent)
privateChatList.insert(listComponent.getSelectedItem(),0);
privateChatList.repaint();
elseif(e.getSource()==刷新谈话区)
谈话显示区.setText(null);
elseif(e.getSource()==刷新私聊区)
私聊显示区.setText(null);
publicvoidrun()
while(true)
Strings=null;
s=in.readUTF();
if(s.startsWith("聊天内容:"))
Stringcontent=s.substring(s.indexOf(":")+1);
谈话显示区.append("\n"+content);
if(s.startsWith("私人聊天内容:"))
私聊显示区.append("\n"+content);
elseif(s.startsWith("聊天者:"))
Stringpeople=s.substring(s.indexOf(":")+1,s.indexOf("性别"));
Stringsex=s.substring(s.indexOf("性别")+2);
listTable.put(people,people+"("+sex+")");
listComponent.add((String)listTable.get(people));
listComponent.repaint();
elseif(s.startsWith("用户离线:"))
StringawayPeopleName=s.substring(s.indexOf(":")+1);
listComponent.remove((String)listTable.get(awayPeopleName));
谈话显示区.append("\n"+(String)listTable.get(awayPeopleName)+"离线");
listTable.remove(awayPeopleName);
Thread.sleep(5);
catch(IOExceptione)
listComponent.removeAll();
listTable.clear();
谈话显示区.setText("和服务器的连接已中断\n必须刷新浏览器才能再次聊天");
break;
catch(InterruptedExceptione)
ChatServer.java
importjava.util.*;
publicclassChatServer
publicstaticvoidmain(Stringargs[])
ServerSocketserver=null;
Socketyou=null;
HashtablepeopleList;
peopleList=newHashtable();
server=newServerSocket(6666);
catch(IOExceptione1)
System.out.println("正在监听");
you=server.accept();
InetAddressaddress=you.getInetAddress();
System.out.println("用户的IP:"+address);
if(you!=null)
Server_threadpeopleThread=newServer_thread(you,peopleList);
peopleThread.start();
else{
continue;
classServer_threadextendsThread
Stringname=null,sex=null;
Filefile=null;
HashtablepeopleList=null;
Server_thread(Sockett,Hashtablelist)
peopleList=list;
socket=t;
in=newDataInputStream(socket.getInputStream());
out=newDataOutputStream(socket.getOutputStream());
{Strings=null;
if(s.startsWith("姓名:"))
name=s.substring(s.indexOf(":")+1,s.indexOf("性别"));
sex=s.substring(s.lastIndexOf(":")+1);
booleanboo=peopleList.containsKey(name);
if(boo==false)
peopleList.put(name,this);
out.writeUTF("可以聊天:");
Enumerationenum=peopleList.elements();
while(enum.hasMoreElements())
Server_threadth=(Server_thread)enum.nextElement();
th.out.writeUTF("聊天者:"+name+"性别"+sex);
if(th!=this)
out.writeUTF("聊天者:"+th.name+"性别"+th.sex);
out.writeUTF("不可以聊天:");
elseif(s.startsWith("公共聊天内容:"))
Stringmessage=s.substring(s.indexOf(":")+1);
((Server_thread)enum.nextElement()).out.writeUTF("聊天内容:"+message);
elseif(s.startsWith("用户离开:"))
{try
if(th!=thisth.isAlive())
th.out.writeUTF("用户离线:"+name);
catch(IOExceptioneee)
peopleList.remove(name);
socket.close();
System.out.println(name+"用户离开了");
elseif(s.startsWith("私人聊天内容:"))
String悄悄话=s.substring(s.indexOf(":")+1,s.indexOf("#"));
StringtoPeople=s.substring(s.indexOf("#")+1);
Server_threadtoThread=(Server_thread)peopleList.get(toPeople);
if(toThread!=null)
toThread.out.writeUTF("私人聊天内容:"+悄悄话);
out.writeUTF("私人聊天内容:"+toPeople+"已经离线");
catch(IOExceptionee)
importjava.applet.*;
ClientChat.java
publicclassClientChatextendsAppletimplementsRunnable
InputNameTextField用户提交昵称界面=null;
ChatArea用户聊天界面=null;
Label提示条;
Panelnorth,center;
Threadthread;
publicvoidinit()
intwidth=getSize().width;
intheight=getSize().height;
listTable=newHashtable();
setLayout(newBorderLayout());
用户提交昵称界面=newInputNameTextField(listTable);
inth=用户提交昵称界面.getSize().height;
用户聊天界面=newChatArea("",listTable,width,height-(h+5));
用户聊天界面.setVisible(false);
提示条=newLabel("正在连接到服务器,请稍等...",Label.CENTER);
提示条.setForeground(Color.red);
north=newPanel(newFlowLayout(FlowLayout.LEFT));
center=newPanel();
north.add(用户提交昵称界面);
north.add(提示条);
center.add(用户聊天界面);
add(north,BorderLayout.NORTH);
add(center,BorderLayout.CENTER);
validate();
publicvoidstart()
if(socket!=nullin!=nullout!=null)
in.close();
out.close();
catch(Exceptionee)
socket=newSocket(this.getCodeBase().getHost(),6666);
提示条.setText("连接失败");
if(socket!=null)
InetAddressaddress=socket.getInetAddress();
提示条.setText("连接:"+address+"成功");
用户提交昵称界面.setSocketConnection(socket,in,out);
north.validate();
if(thread==null)
thread=newThread(this);
thread.start();
publicvoidstop()
thread=null;
this.showStatus(e.toString());
while(thread!=null)
if(用户提交昵称界面.get能否聊天()==true)
用户聊天界面.setVisible(true);
用户聊天界面.setName(用户提交昵称界面.getName());
用户聊天界面.setSocketConnection(socket,in,out);
提示条.setText("祝聊天愉快!");
center.validate();
Thread.sleep(100);
InputNameTextField。java
publicclassInputNameTextFieldextendsPanelimplementsActionListener,Runnable
TextFieldnameFile=null;
Checkboxmale=null,female=null;
CheckboxGroupgroup=null;
Button进入聊天室=null,退出聊天室=null;
Threadthread=null;
boolean能否聊天=false;
publicInputNameTextField(HashtablelistTable)
nameFile=newTextField(10);
group=newCheckboxGroup();
male=newCheckbox("男",true,group);
female=newCheckbox("女",false,group);
进入聊天室=newButton("进入");
退出聊天室=newButton("退出");
进入聊天室.addActionListener(this);
退出聊天室.addActionListener(this);
add(newLabel("昵称:"));
add(nameFile);
add(male);
add(female);
add(进入聊天室);
add(退出聊天室);
退出聊天室.setEnabled(false);
publicvoidset能否聊天(booleanb)
能否聊天=b;
publicbooleanget能否聊天()
return能否聊天;
publicStringgetName()
returnname;
nameFile.setText(""+e);
publicSocketgetSocket()
returnsocket;
if(e.getSource()==进入聊天室)
退出聊天室.setEnabled(true);
if(能否聊天==true)
nameFile.setText("您正在聊天:"+name);
this.setName(nameFile.getText());
Stringsex=group.getSelectedCheckbox().getLabel();
if(socket!=nullname!=null)
out.writeUTF("姓名:"+name+"性别:"+sex);
nameFile.setText("没有连通服务器"+ee);
if(e.getSource()==退出聊天室)
out.writeUTF("用户离开:");
Stringmessage=null;
if(in!=null)
message=in.readUTF();
nameFile.setText("和服务器断开"+e);
if(message.startsWith("可以聊天:"))
能否聊天=true;
elseif(message.startsWith("聊天者:"))
Stringpeople=message.substring(message.indexOf(":")+1);
listTable.put(people,people);
elseif(message.startsWith("不可以聊天:"))
能否聊天=false;
nameFile.setText("该昵称已被占用");
给你一个简单的实现吧,注意一定要先运行MyServer.java
//MyCilent.java
importjavax.swing.*;
publicclassMyClientextendsJFrameimplementsActionListener{
JTextFieldtf;
JTextAreatx;
JButtonbt;
PrintWriterout;
publicMyClient(){
tf=newJTextField(20);
tx=newJTextArea();
tx.setLineWrap(true);
tx.setWrapStyleWord(true);
JPanelpan=newJPanel();
JScrollPanejsp=newJScrollPane(tx);
add(jsp,"Center");
bt=newJButton("SEND");
bt.addActionListener(this);
pan.add(tf);
pan.add(bt);
add(pan,"South");
this.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
});
setTitle("THECLIENT");
setSize(400,300);
setVisible(true);
Socketsocket=newSocket("127.0.0.1",1680);
out=newPrintWriter(socket.getOutputStream(),true);
InputStreamReaderin=newInputStreamReader(socket.getInputStream());
BufferedReadersin=newBufferedReader(in);
Strings;
while(true){
s=sin.readLine();
tx.append("#ServerSaid#:"+s+"\n");
}catch(Exceptione){
e.printStackTrace();
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==bt){
tx.append("@ClientSaid@:"+tf.getText()+"\n");
out.println(tf.getText());
tf.setText("");
publicstaticvoidmain(String[]args){
MyClientmct=newMyClient();
//MyServer.java
publicclassMyServerextendsJFrameimplementsActionListener{
JScrollPanejsp;
JPanelpan;
publicMyServer(){
jsp=newJScrollPane(tx);
pan=newJPanel();
setTitle("THESERVER");
ServerSocketserver=newServerSocket(1680);
Socketsocket=server.accept();
Strings=sin.readLine();
tx.append("@ClientSaid@:"+s+"\n");
Stringst=tf.getText();
tx.append("#ServerSaid#:"+st+"\n");
out.println(st);
MyServermsr=newMyServer();
前天帮人解决过,代码如下:publicclassiChatextendsJFrame{
privateJPaneljContentPane;
privateJButtonjButton1;
privateJScrollPanejScrollPane1;
privateJTextAreajTextArea1,jTextArea2;publiciChat(){
super();
initialize();
}privatevoidinitialize(){
this.setSize(375,364);
jTextArea1=getJTextArea1();
this.setContentPane(getJContentPane());
this.setTitle("聊天室");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}privateJPanelgetJContentPane(){
if(jContentPane==null){
jContentPane=newJPanel();
jContentPane.setBackground(Color.BLUE);//蓝色为JPanel。
jContentPane.setLayout(null);
jContentPane.add(getJButton1(),null);
jContentPane.add(getJTextArea2(),null);
jContentPane.add(getJScrollPane1(),null);
returnjContentPane;
}privateJTextAreagetJTextArea2(){
if(jTextArea2==null){
jTextArea2=newJTextArea();
jTextArea2.setBounds(newRectangle(1,253,282,73));
jTextArea2.setLineWrap(true);
jTextArea2.addKeyListener(newjava.awt.event.KeyAdapter(){
publicvoidkeyTyped(java.awt.event.KeyEvente){
if(e.getKeyChar()==KeyEvent.VK_ENTER){
Strings="你说:"+jTextArea2.getText();
Stringdate=newSimpleDateFormat(
"yyyy-MM-ddHH:mm:ss").format(Calendar
.getInstance().getTime());
jTextArea1.append(date+"\n");
jTextArea1.append(s);
returnjTextArea2;
}privateJButtongetJButton1(){
if(jButton1==null){
jButton1=newJButton();
jButton1.setBounds(newRectangle(293,288,62,32));
jButton1.setText("发送");
jButton1.addActionListener(newjava.awt.event.ActionListener(){
publicvoidactionPerformed(java.awt.event.ActionEvente){
Stringdate=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss")
.format(Calendar.getInstance().getTime());
jTextArea1.append(s+"\n");
jTextArea2.setText("");}
returnjButton1;
privateJScrollPanegetJScrollPane1(){
if(jScrollPane1==null){
jScrollPane1=newJScrollPane();
jScrollPane1.setBounds(newRectangle(0,0,360,220));
jScrollPane1.setViewportView(getJTextArea1());
returnjScrollPane1;
}privateJTextAreagetJTextArea1(){
if(jTextArea1==null){
jTextArea1=newJTextArea();
jTextArea1.setEditable(false);
jTextArea1.setLineWrap(true);
returnjTextArea1;
}publicstaticvoidmain(String[]args){
SwingUtilities.invokeLater(newRunnable(){
publicvoidrun(){
iChatthisClass=newiChat();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}}
【ClientSocketDemo.java客户端Java源代码】
publicclassClientSocketDemo
DataInputStreamin;
DataOutputStreamout;
Stringresponse[];
//执行过程中,没有参数时的构造方法,本地服务器在本地,取默认端口10745
publicClientSocketDemo()
//创建客户端socket,服务器地址取本地,端口号为10745
socket=newSocket("localhost",10745);
//创建客户端数据输入输出流,用于对服务器端发送或接收数据
//获取客户端地址及端口号
Stringip=String.valueOf(socket.getLocalAddress());
Stringport=String.valueOf(socket.getLocalPort());
//向服务器发送数据
out.writeUTF("HelloServer.Thisconnectionisfromclient.");
out.writeUTF(ip);
out.writeUTF(port);
//从服务器接收数据
response=newString[3];
for(inti=0;iresponse.length;i++)
response[i]=in.readUTF();
System.out.println(response[i]);
catch(UnknownHostExceptione){e.printStackTrace();}
catch(IOExceptione){e.printStackTrace();}
//执行过程中,有一个参数时的构造方法,参数指定服务器地址,取默认端口10745
publicClientSocketDemo(Stringhostname)
//创建客户端socket,hostname参数指定服务器地址,端口号为10745
socket=newSocket(hostname,10745);
//执行过程中,有两个个参数时的构造方法,第一个参数hostname指定服务器地址
//第一个参数serverPort指定服务器端口号
publicClientSocketDemo(Stringhostname,StringserverPort)
socket=newSocket(hostname,Integer.parseInt(serverPort));
publicstaticvoidmain(String[]args)
Stringcomd[]=args;
if(comd.length==0)
System.out.println("Uselocalhost(127.0.0.1)anddefaultport");
ClientSocketDemodemo=newClientSocketDemo();
elseif(comd.length==1)
System.out.println("Usedefaultport");
ClientSocketDemodemo=newClientSocketDemo(args[0]);
elseif(comd.length==2)
System.out.println("Hostnameandportarenamedbyuser");
ClientSocketDemodemo=newClientSocketDemo(args[0],args[1]);
elseSystem.out.println("ERROR");
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
【ServerSocketDemo.java服务器端Java源代码】
publicclassServerSocketDemo
ServerSocketserverSocket;
publicstaticfinalintPORT=10745;
InetAddressip=null;
Stringrequest[];
publicServerSocketDemo()
request=newString[3];//初始化字符串数组
//获取本地服务器地址信息
ip=InetAddress.getLocalHost();
//以PORT为服务端口号,创建serverSocket对象以监听该端口上的连接
serverSocket=newServerSocket(PORT);
//创建Socket类的对象socket,用于保存连接到服务器的客户端socket对象
Socketsocket=serverSocket.accept();
System.out.println("Thisisserver:"+String.valueOf(ip)+PORT);
//创建服务器端数据输入输出流,用于对客户端接收或发送数据
//接收客户端发送来的数据信息,并显示
request[0]=in.readUTF();
request[1]=in.readUTF();
request[2]=in.readUTF();
System.out.println("Receivedmessagesformclientis:");
System.out.println(request[0]);
System.out.println(request[1]);
System.out.println(request[2]);
//向客户端发送数据
out.writeUTF("Helloclient!");
out.writeUTF("Youripis:"+request[1]);
out.writeUTF("Yourportis:"+request[2]);
ServerSocketDemodemo=newServerSocketDemo();
登陆实现类:classLogin
packagecom.server;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPasswordField;
importjavax.swing.JTextField;
publicclassLogin{
privateJFrameframe=newJFrame("WelcomeToMLDN");
//设置窗体
privateJButtonreset=newJButton("重置");//设置重置按钮
privateJLabelnameLab=newJLabel("服务器:");//标签实例化
privateJLabelpassLab=newJLabel("密码:");//标签实例化
privateJLabelinfoLab=newJLabel("服务器登陆系统");//标签实例化
privateJTextFieldnameText=newJTextField(10);//单行文本输入条
privateJPasswordFieldpassText=newJPasswordField();//单行密码文本输入条
Fontfnt=newFont("Serief",Font.ITALIC+Font.BOLD,12);//设置字体
infoLab.setFont(fnt);//设置标签的显示文字
submit.addActionListener(newActionListener(){//采用内部匿名类
if(e.getSource()==submit){//判断触发器源是否是提交按钮
Stringtname=nameText.getText();//得到输入的用户名
Stringtpass=newString(passText.getPassword());//得到输入的密码,此时通过getPassageword()方法返回的是字符数组
LoginChecklog=newLoginCheck(tname,tpass);//实例化LoginCheck对象,传入输入的用户名和密码
if(log.validate()){//对用户名和密码进行验证
try{//线程异常处理try
Thread.sleep(2000);//2秒后打开聊天窗口
frame.dispose();//关闭本窗口
}catch(Exceptione1){//异常获取
e1.printStackTrace();
}else{
reset.addActionListener(newActionListener(){//采用内部匿名类
if(e.getSource()==reset){//判断触发器源是否是提交按钮
nameText.setText("");//设置文本框中的内容
passText.setText("");//设置文本框中的内容
infoLab.setText("服务器登陆系统");//恢复标签显示
frame.addWindowListener(newWindowAdapter(){//加入窗口监听
publicvoidwindowClosing(WindowEvente){}
});//加入事件
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);//显示窗口
newMyServer();//显示窗体页面
验证登陆实现类classLoginCheck
publicclassLoginCheck{
privateStringname;//用户名
privateStringpassword;//密码
//构造方法
publicLoginCheck(Stringname,Stringpassword){
this.name=name;//传递用户名
this.password=password;//传递密码
//验证用户名和密码
publicbooleanvalidate(){
//验证方法
if("y".equals(name)"1".equals(password)){//判断用户名和密码是否正确
returntrue;//返回true
returnfalse;//返回false
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
importjava.net.ServerSocket;
importjava.net.Socket;
importjava.text.DateFormat;
importjava.util.Date;
聊天实现类classMyServer
publicclassMyServer{
protectedJLabellab10;
//全体变量,做传递的一个组件
Strings="已经成功连接";
//初始字符串,在两个聊天窗口链接成功时输出,同时作为两个窗口传递字符的一个变量
try{//异常处理
JFrameframe=newJFrame("服务器窗口");
frame.setLayout(null);
//让布局管理器为空,使用绝对定位
Fontfnt=newFont("Serief",Font.PLAIN,40);//字体设置
Fontfnt1=newFont("Serief",Font.PLAIN,20);//字体设置
//我的用户名显示
JLabellab1=newJLabel("服务器名:",JLabel.LEFT);
//标签实例化,文本左对齐
lab1.setBounds(8,10,100,20);
//设置组件位置及大小
frame.add(lab1);
//添加组件
JTextFieldtext2=newJTextField(30);//单行文本输入组件
text2.setBounds(150,10,200,20);//设置组件位置及大小
text2.setEnabled(false);//文本条不可编辑
text2.setText("笑笑聊天室");//输入内容
text2.setFont(fnt1);//设置字体
frame.add(text2);//添加组件
//服务器IP显示
JLabellab2=newJLabel("当前服务器IP:",JLabel.LEFT);
lab2.setBounds(8,45,100,20);//设置组件位置及大小
frame.add(lab2);//添加组件
JTextFieldtext3=newJTextField(30);//单行文本输入组件
text3.setBounds(150,45,200,20);//设置组件位置及大小
text3.setEnabled(false);
//文本不可编辑
text3.setText("127.0.0.1");//输入内容
text3.setFont(fnt1);//设置字体
frame.add(text3);
//服务器端口显示
JLabellab3=newJLabel("当前服务器端口:",JLabel.LEFT);
lab3.setBounds(8,80,100,20);//设置组件位置及大小
frame.add(lab3);//添加组件
JTextFieldtext4=newJTextField(30);//单行文本输入组件
text4.setBounds(150,80,200,20);//设置组件位置及大小
text4.setEnabled(false);//文本不可编辑
text4.setText("8888");//输入内容
text4.setFont(fnt1);//设置字体
frame.add(text4);//添加组件
//聊天记录显示
JLabellab4=newJLabel("聊天记录如下:",JLabel.LEFT);
//标签实例化文本左对齐
lab4.setBounds(8,115,100,20);//设置组件位置及大小
frame.add(lab4);//添加组件
finalJTextAreatext1=newJTextArea();//多行文本输入组件
text1.setEnabled(false);//文本不可编辑
text1.setLineWrap(true);//自动换行
JScrollPanescr=newJScrollPane(text1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);//设置滚动条,水平和垂直滚动条始终显示
scr.setBounds(8,150,450,350);//设置组件位置及大小
frame.add(scr);//添加组件
//聊天输入窗口及确定
JLabellab5=newJLabel("请输入聊天内容:",JLabel.LEFT);//标签实例化,文本左对齐
lab5.setBounds(8,500,100,20);//设置组件位置及大小
frame.add(lab5);//添加组件
finalJTextAreatext5=newJTextArea();//多行文本输入组件
text5.setLineWrap(true);//自动换行
JScrollPanescr2=newJScrollPane(text5,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);//设置滚动条,水平和垂直滚动条始终显示
scr2.setBounds(150,500,300,50);//设置组件位置及大小
frame.add(scr2);//添加组件
finalJButtonbut=newJButton("确定");//设置确定按钮
but.setFont(fnt);//添加字体设置
but.setBounds(480,500,200,50);//设置组件位置及大小
but.addActionListener(
newActionListener(){//采用内部匿名类
if(e.getSource()==but){//判断触发器源是否是提交按钮
text1.append("笑笑:"+lab10.getText()+"\n");//在聊天记录上添加文本
text1.append(text5.getText()+"\n");//将输入的聊天内容输出在聊天记录上
s=text5.getText();//得到聊天内容
text5.setText("");//将聊天窗口内容设置为空
frame.add(but);//添加组件
lab7.setBounds(450,20,100,20);//设置组件位置及大小
frame.add(lab7);//添加组件
JLabellab8=newJLabel(df2,JLabel.LEFT);//标签实例化,文本左对齐
lab8.setBounds(520,20,130,20);//设置组件位置及大小
frame.add(lab8);//添加组件
//用户列表显示
JLabellab6=newJLabel("用户列表:",JLabel.LEFT);//标签实例化,文本左对齐
lab6.setBounds(500,40,100,20);//设置组件位置及大小
frame.add(lab6);//添加组件
JTextAreatext6=newJTextArea();//标签实例化,文本左对齐
text6.setEnabled(false);//文本不可编辑
text6.setLineWrap(true);//自动换行
JScrollPanescr3=newJScrollPane(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);//在电脑桌面上出现的位置
//连个窗口连接
//建立ServerSocket并等待连接请求
ServerSocketserver=newServerSocket(8889);
//连接建立,通过Socket获取连接上的输入/输出流
BufferedReaderin=newBufferedReader(newInputStreamReader(socket.getInputStream()));
finalPrintWriterout=newPrintWriter(socket.getOutputStream());
//先读取Client发送的数据,然后从标准输入读取数据发送给Client当接收到bye时关闭连接
Strings1="",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();//输出聊天内容
//关闭连接
server.close();
//main函数
publicstaticvoidmain(Stringargs[]){
importjava.text.SimpleDateFormat;
publicclassTime{
publicTime(JLabeltime){
//构造方法this.setTimer(time);
publicvoidsetTimer(JLabeltime){
finalJLabelvarTime=time;
//传递组件
TimertimeAction=newTimer(1000,newActionListener(){
SimpleDateFormatdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");//转换日期显示格式