clients.get(i).sendMessage(strRead);
}
}
}
}catch(Exceptione){
try{
br.close();
socket.close();
}catch(IOExceptione1){
e1.printStackTrace();
}
e.getStackTrace();
}finally{
try{
if(br!
=null)br.close();
if(bw!
=null)bw.close();
if(socket!
=null) {
socket.close();
//s=null;
}
}catch(IOExceptione1){
e1.printStackTrace();
}
}
}
}
}
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
import.Socket;
import.UnknownHostException;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importjavax.swing.*;
/**
*@Title 客户端
*@authorAllen
*@version2010-5-3下午08:
28:
47
*/
publicclassClientextendsJFrame{
Socketsocket=null;
JTextFieldjname=null;
JTextFieldtext=newJTextField();
JTextAreaarea=newJTextArea(10,40);
BufferedReaderbr=null;
BufferedWriterbw=null;
BufferedWritername_buf=null;
booleanconnected=false;
SimpleDateFormatsdf=newSimpleDateFormat("MM-ddHH:
mm:
ss");
staticStringuserName=null;
publicClient(){
initFrame();
}
publicstaticvoidmain(String[]args){
newClient();
}
publicStringgetUserName(){
returnuserName;
}
publicvoidinitFrame(){
//setTitle(userName);
setSize(400,300);
setLocation(500,200);
this.setResizable(false);
JPanelpanel=newJPanel();
GridBagConstraintsgbc=newGridBagConstraints();
//GridBagLayoutlayout=newGridBagLayout();
FlowLayoutlayout=(FlowLayout)panel.getLayout();
layout.setAlignment(FlowLayout.RIGHT);
gbc.anchor=GridBagConstraints.LINE_END;
JButtonbtn_send=newJButton("send");
JButtonbtn_clear=newJButton("clear");
panel.setLayout(layout);
panel.add(btn_clear);
panel.add(btn_send,gbc);
area.setLineWrap(true);
area.setEditable(false);
JScrollPanejsp=newJScrollPane(area);
this.add(jsp,BorderLayout.NORTH);
this.add(panel,BorderLayout.CENTER);
this.add(text,BorderLayout.SOUTH);
pack();
SendListenersendListener=newSendListener();
btn_send.addActionListener(sendListener);
text.addActionListener(sendListener);
btn_clear.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
text.setText("");
area.setText("");
text.requestFocus();
}
});
//窗体监听
this.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
disConnect();
System.exit(0);
System.out.println("窗体关闭了");
}
}
setVisible(true);
connect();
ClientThreadclient=newClientThread();
newThread(client).start();
setTitle(userName);
}
//监听发送信息方法
privateclassSendListenerimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
Stringstr=text.getText();
//area.setText(area.getText()+str+" "+sdf.format(newDate())+"\n");
text.setText("");
text.requestFocus();
try{
bw.write(userName+"说:
"+str);
bw.newLine();
bw.flush();
}catch(IOExceptione1){
e1.printStackTrace();
}
}
}
//连接服务器方法
publicvoidconnect(){
try{
socket=newSocket("127.0.0.1",8888);
br=newBufferedReader(newInputStreamReader(socket.getInputStream()));
bw=newBufferedWriter(newOutputStreamWriter(socket.getOutputStream()));
connected=true;
newSetNameJTextField(this);
}catch(UnknownHostExceptione){
System.out.println("端口错误!
"+e.getMessage());
}catch(IOExceptione){
e.printStackTrace();
}
}
//关闭方法
publicvoiddisConnect(){
if(bw!
=null){
try{
bw.close();
bw=null;
}catch(IOExceptione1){
e1.printStackTrace();
}finally{
if(br!
=null){
try{
br.close();
br=null;
}catch(IOExceptione1){
e1.printStackTrace();
}finally{
if(socket!
=null){
try{
socket.close();
socket=null;
}catch(IOExceptione1){
e1.printStackTrace();
}
}
}
}
}
}
}
//client读取操作线程
privateclassClientThreadimplementsRunnable{
Stringstr=null;
publicvoidrun(){
try{
while(connected){
while((str=br.readLine())!
=null){
Strings=str+" "+sdf.format(newDate())+"\n";
area.setText(area.getText()+s);
//设置JTextArea内容过多是聚焦
area.setCaretPosition(area.getText().length());
System.out.println("ServertoClient..."+str);
}
}
}catch(IOExceptione){
System.out.println("Client退出了!
");
System.exit(0);
}
}
}
//设置名字窗体
privateclassSetNameJTextFieldextendsJFrame{
JButtonbtn_setName=null;
Clientc=null;
publicSetNameJTextField(finalClientc){
JFrameframe=newJFrame();
this.c=c;
frame.setTitle("ScannerUserName...");
frame.setSize(300,130);
frame.setLocation(550,250);
JPanelpanel=newJPanel();
jname=newJTextField(16);
btn_setName=newJButton("OK");
panel.add(newJLabel("UserName:
"));
panel.add(jname);
panel.add(btn_setName);
frame.add(panel);
frame.setVisible(true);
SetUserNameListenernameListener=newSetUserNameListener(c,frame);
btn_setName.addActionListener(nameListener);
jname.addActionListener(nameListener);
}
}
privateclassSetUserNameListenerimplementsActionListener{
JFramef=null;
Clientclient=null;
publicSetUserNameListener(Clientc,JFramef){
this.client=c;
this.f=f;
}
publicvoidactionPerformed(ActionEvente){
try{
name_buf=newBufferedWriter(newOutputStreamWriter(socket.getOutputStream()));
userName=jname.getText();
client.setTitle(userName);
name_buf.write(userName);
name_buf.newLine();
name_buf.flush();
//buf.close();
f.dispose();
}catch(IOExceptione1){
e1.printStackTrace();
}
}
}
}
五、运行结果
六、实习心得和体会
这次的课程设计是简单聊天程序,在平日的生活学习中我们也经常用,比如QQ、MSN等即时通讯软件,所以这个课程设计很有现实意义,做起来也比较感兴趣。
此次编程的一对多聊天工具利用了javasocket套接字编程,由于对于才刚开始学习java语言,由于对java语言的不熟悉,花费了很多时间在对用到的java语言的学习,另外也搜索了一些关于JAVAsocket编程的知识,关于服务器和客户端之间的通信主要借用socket编程,由serversocketsoc=newserversocket(10000)构造对象监视服务器的10000端口,用socket=soc.accept();产生阻塞等待客户端连接,客户端由Socketsoc=newSocket(“172.0.0.1”10000)和服务器产生连接。
由Socket对象得到输入流,并构造相应的BufferedReader对象,由socketd对象得到输出流,服务器从客户端发出的输入流读取信息,编程完时程序不能运行成功,服务器和客户端并不能一对多的聊天,且不能循环,后来询问了学习java的同学,还是没有能找到原因,有在网上搜索一下,也没能有结果,后来我将System.out.println("server:
"+is.readLine());从输入流读取服务器信息改为从标准输入读取信息,才运行出正确结果。
通过这次实验,我全面的认识到,计算机网络方面的知识学得不够扎实,不能将知识运用到实践中去。
以后要注意加强。