現(xiàn)實(shí)中的socket可能會(huì)因?yàn)楦鞣N原因done機(jī),但這么重要的服務(wù)器怎么能允許這種事情發(fā)生?這次我們就來通過一個(gè)線程去監(jiān)控socket服務(wù)器,如果done機(jī)重新將其啟動(dòng)。

下面是監(jiān)控項(xiàng)目和socket服務(wù)器項(xiàng)目的目錄結(jié)構(gòu):

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

 

因?yàn)榫€程是每?jī)擅氚l(fā)送一次請(qǐng)求檢測(cè)服務(wù)器是否done機(jī),類似心跳,所以包名起作heart。

來看客戶端heart代碼:

Entity 實(shí)體類:用來構(gòu)建測(cè)試請(qǐng)求的數(shù)據(jù)結(jié)構(gòu)

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

package heart;import java.io.Serializable;public class Entity implements Serializable {    private static final long serialVersionUID = 1L;    private String name;    private String sex;    public String getName() {        return name;
    }    public void setName(String name) {        this.name = name;
    }    public String getSex() {        return sex;
    }    public void setSex(String sex) {        this.sex = sex;
    }

    @Override    public String toString() {        return "Entity [name=" + name + ", sex=" + sex + "]";
    }

}

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

客戶端同步線程代碼:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

package heart;public class ClientHeart extends Thread {

    @Override    public void run() {        try {            while (true) {
                ClientSender.getInstance().send();                synchronized (ClientHeart.class) {                    // this.wait(5000);
                    Thread.sleep(2000);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }    /**
     * 程序的入口main方法
     * 
     * @param args     */
    public static void main(String[] args) {
        ClientHeart client = new ClientHeart();
        client.start();
    }

}

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

客戶端發(fā)送消息代碼:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

package heart;import java.io.ObjectOutputStream;import java.net.InetAddress;import java.net.Socket;import echoserver.EchoServer;import heart.Entity;public class ClientSender {    private ClientSender() {
    }

    Socket sender = null;    private static ClientSender instance;    public static ClientSender getInstance() {        if (instance == null) {            synchronized (ClientHeart.class) {
                instance = new ClientSender();
            }
        }        return instance;
    }

    @SuppressWarnings("static-access")    public void send() {        try {
            sender = new Socket("192.168.1.166", 9090);            
            while (true) {
                ObjectOutputStream out = new ObjectOutputStream(sender.getOutputStream());
                Entity obj = new Entity();
                obj.setName("xiaoming");
                obj.setSex("男");
                out.writeObject(obj);
                out.flush();

                System.out.println("已發(fā)送...");
                Thread.sleep(5000);
            }
        } catch (Exception e) {
            EchoServer myServer = new EchoServer();
            System.out.println("連接異常");            try {
                myServer.main(null);
            } catch (Exception e1) {                // TODO Auto-generated catch block                e1.printStackTrace();
            }
            
        }
    }
}

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

發(fā)送消息代碼中,可以看到socket是重新起的一個(gè)socket,和socket服務(wù)器并無關(guān)聯(lián),與服務(wù)器中的heart代碼中的服務(wù)器相對(duì)應(yīng)(如果加上監(jiān)控socket的服務(wù)器,服務(wù)器項(xiàng)目中其實(shí)是有兩個(gè)服務(wù)器的,一個(gè)作為socket服務(wù)器,一個(gè)作為監(jiān)控socket的服務(wù)器),這樣就可以避免一直重新new出socket造成的channel異常。

一開始我選擇用過quartz定時(shí)器作為輪巡監(jiān)測(cè),也試著搭建過webservice,但是都失敗了。quartz輪巡會(huì)造成socket服務(wù)器的阻塞,webservice的話,如果服務(wù)器done機(jī),那么這個(gè)webservice也就跟著一起done掉了,更不要談什么監(jiān)測(cè)了,所以,創(chuàng)建一個(gè)單線程的監(jiān)測(cè),速度又快(2秒一次完全夠了),又安全,何樂不為?

 

注意,客戶端的config包中的xml配置文件其實(shí)是和服務(wù)器中的一模一樣的,我是在監(jiān)測(cè)服務(wù)器的項(xiàng)目中為了能夠在服務(wù)器done機(jī)后重新啟動(dòng)服務(wù)器,在buildPath中加入了服務(wù)器的項(xiàng)目,但是服務(wù)器項(xiàng)目中需要引用EchoServer.xml這個(gè)文件,所以在客戶端重新復(fù)制了一份。

以下是服務(wù)器端的監(jiān)測(cè)線程:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

package heart;import java.io.ObjectInput;import java.io.ObjectInputStream;import java.net.ServerSocket;import java.net.Socket;import heart.Entity;public class ServerHeart extends Thread {    private ServerSocket server = null;
    Object obj = new Object();

    @Override    public void run() {        try {
            server = new ServerSocket(9090);            while (true) {
                Socket client = server.accept();                synchronized (obj) {                    new Thread(new Client(client)).start();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }    /**
     * 客戶端線程
     * 
     * @author USER
     *     */
    class Client implements Runnable {
        Socket client;        public Client(Socket client) {            this.client = client;
        }

        @Override        public void run() {            try {                while (true) {
                    ObjectInput in = new ObjectInputStream(client.getInputStream());
                    Entity entity = (Entity) in.readObject();
                    System.out.println(entity);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }    /**
     * 程序的入口main方法
     * 
     * @param args     */
    public static void main(String[] args) {
        System.out.println("開始檢測(cè)服務(wù)器是否done機(jī)...");        new ServerHeart().start();
    }
}

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

 

下面附上兩個(gè)項(xiàng)目的傳送門:http://files.cnblogs.com/files/fengwenzhee/monitorSocket.rar

 

另外:SSsocket(服務(wù)器項(xiàng)目)中有一個(gè)Test.jar文件,這個(gè)可不是jar包,里面是socket服務(wù)器的測(cè)試原件,直接解壓就可以用了。

 

如果要在linux系統(tǒng)測(cè)試,就把兩個(gè)項(xiàng)目打成可執(zhí)行的jar(runnable JAR file),然后導(dǎo)入linux虛擬機(jī)中(我是通過putty這個(gè)輔助軟件導(dǎo)入的)地址:http://files.cnblogs.com/files/fengwenzhee/putty.rar,命令在我另一篇博客中有提到,然后jar -jar monitor.jar命令啟動(dòng)項(xiàng)目,(我是直接啟動(dòng)的監(jiān)控項(xiàng)目,正好測(cè)試一下是否成功拉起done機(jī)的socket服務(wù)器)。

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

測(cè)試成功,至于服務(wù)器的socket我用的是quicksocket,關(guān)于服務(wù)器有什么不明白的可以直接留言。

 轉(zhuǎn)載請(qǐng)注明出處。

http://www.cnblogs.com/fengwenzhee/p/7119546.html