博客地址 http://blog.csdn.net/ftx2540993425
界面如下显示:
客户端代码:
package com.ftx;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* Created by FTX2 on 2015/12/28.
*/
public class ChatRoomClient extends JFrame implements ActionListener{
Socket sk=null;
ObjectOutputStream out;
ObjectInputStream in;
Container c;
JTextArea taMsgBrd = new JTextArea("");
JTextField [] tf2 ={new JTextField(7),new JTextField(30)};
JLabel [] lb2={new JLabel("Name "),new JLabel("Msg")};
JPanel pnSouth=new JPanel();
public ChatRoomClient(){
c=getContentPane();
c.setLayout(new BorderLayout());
c.add(taMsgBrd,BorderLayout.CENTER);
for(int i=0;i<tf2.length;i++){
pnSouth.add(lb2[i],BorderLayout.SOUTH);
pnSouth.add(tf2[i],BorderLayout.SOUTH);
tf2[i].addActionListener(this);
tf2[i].setEnabled(i==0);
}
c.add(pnSouth,BorderLayout.SOUTH);
setTitle("Chatroom Client ftx");
setSize(550,500);
setVisible(true);
}
//监听事件
public void actionPerformed(ActionEvent ev) {
Object obj=ev.getSource();
if(obj==tf2[0]) connect();
else writeMessage();
}
void connect( ) {
String host = "localhost";
try {
sk = new Socket (host, 5011 );
out = new ObjectOutputStream ( sk.getOutputStream () );
in = new ObjectInputStream ( sk.getInputStream () );
tf2[0].setEnabled ( false );
tf2[1].setEnabled ( true );
new Thread ( new CAgent( in, taMsgBrd )).start();
} catch (Exception e) { e.printStackTrace(); }
}
protected void writeMessage(){
try {
out.writeObject(tf2[0].getText()+":"+tf2[1].getText());
out.flush();
tf2[1].setText("");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String [] args){
ChatRoomClient app=new ChatRoomClient();
app.addWindowListener(
new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
System.exit(0);
}
}
);
}
}
class CAgent implements Runnable{
ObjectInputStream in;
JTextArea msgBrd;
public CAgent(ObjectInputStream in,JTextArea tf){
this.in=in;
msgBrd=tf;
System.out.printf("Client agent is initialized\n");
}
@Override
public void run() {
try {
Object obj;
while(true){
obj=in.readObject();
msgBrd.append(obj.toString()+'\n');
}
} catch (Exception e) {
e.printStackTrace();
}
try {
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务器端代码:
package com.ftx;
import java.net.*;
import java.util.Vector;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
/**
* Created by FTX2 on 2015/12/28.
*/
public class ChatRoomServer {
ChatroomMonitor mtrCR=new ChatroomMonitor();
public static void main(String [] args){
ChatRoomServer app=new ChatRoomServer();
int agentID=1;
ServerSocket ssk=null;
Socket sk=null;
try {
ssk=new ServerSocket(5011);
while (true){
sk=ssk.accept();
new Thread(new SAgent(agentID++,sk,app.mtrCR)).start();
System.out.printf("\n\t\t%4d clients are connected to CR server.\n",agentID-1);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
class ChatroomMonitor{
Vector<ObjectOutputStream> vec = new Vector<ObjectOutputStream>(5);
void put(ObjectOutputStream out){vec.add(out);}
void remove(ObjectOutputStream out){vec.remove(out);}
int size(){return vec.size();}
void broadcast(Object obj){
ObjectOutputStream out=null;
for(int i=0;i<vec.size();i++){
System.out.printf("Side monitor.broadcast(),[%s] is to broadcast to [%d] client\n",obj.toString(),vec.size());
try {
out=vec.get(i);
out.writeObject(obj);
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class SAgent implements Runnable{
int ID;
ChatroomMonitor mtr;
Socket sk;
ObjectOutputStream out;
ObjectInputStream in;
public SAgent(int id,Socket sk,ChatroomMonitor mtr){
ID=id;
this.sk=sk;
this.mtr=mtr;
try {
out = new ObjectOutputStream(sk.getOutputStream());
in =new ObjectInputStream(sk.getInputStream());
mtr.put(out);
} catch (Exception e) {
e.printStackTrace();
}
System.out.printf("Server agent is created");
}
void close(){
try {
mtr.remove(out);
in.close();
sk.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
Object obj=null;
while(true){
obj=in.readObject();
System.out.printf("Object read:%s\n",obj);
mtr.broadcast(obj);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}