多线程Socket通讯复习

博客地址  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();
        }


    }
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值