1. 程式人生 > >Android 客戶端Socket 實現及簡單封裝。

Android 客戶端Socket 實現及簡單封裝。

Socket,客戶端實現。先下載SocketTools工具,以便測試。
第一次用,沒有寫到的,請指出。首先 建個類,然後寫方法。。。。。。調皮了。。直接來

TCP UDP 連線

public class SocketClient {
    private static final Socket SOCKET=null;
    private static final DataInputStream dis=null;//輸入
    private static final DataOutputStream dos=null;//輸出
    private Timer heartBeatTimer;
    private
TimerTask heartBeatTask; private SocketClient(){} private static SocketClient socketClient; private static DatagramSocket socketUdp=null; private static Socket socketTcp=null; //獲取單例 public static SocketClient getSingle(){ if(socketClient==null){ synchronized
(SocketClient.class) {//加鎖 多個程序使用 if(socketClient==null){//優化 socketClient=new SocketClient(); } } } return socketClient; } /** * 獲取TCP連線 * @param serverIp :服務Ip地址 * @param
prot :埠號 * @param data :data 要傳送的資料 * @param call :CallBackSocket 介面 */
public void getTCPConnect(String serverIp,int prot,String data,CallBackSocketTCP call){ //建立Socket"192.168.1.115",60000 try { socketTcp= new Socket(serverIp,prot); SocketUtil util=new SocketUtil(socketTcp); util.sendData(data); //獲取輸入流,並讀取服務端的響應資訊 boolean b=true; while(b){ boolean ba=util.isConnect(); //把值給介面,這裡的介面作用,就是傳值的作用 call.isConnect(ba); System.out.println("當前Soket是否連線:"+ba); String info =util.receiveData(); //同理 call.Receive(info); System.out.println(" 伺服器說:"+info); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * UDP連線, * @param port 埠號 * @param data 通過UDP傳送的資料 */ public void getUDPConnect(int port,String datas,CallBackSocketUDP call){ try { /* * 向伺服器端傳送資料 */ // 1.定義伺服器的地址、埠號、資料localhost InetAddress address = InetAddress.getByName("localhost"); // port = 8800; byte [] data = datas.getBytes(); // 2.建立資料報,包含傳送的資料資訊 DatagramPacket packet = new DatagramPacket(data, data.length, address, port); // 3.建立DatagramSocket物件 socketUdp = new DatagramSocket(); // 4.向伺服器端傳送資料報 socketUdp.send(packet); boolean b=true; while(b){ /* * 接收伺服器端響應的資料 */ // 1.建立資料報,用於接收伺服器端響應的資料 byte[] data2 = new byte[1024]; DatagramPacket packet2 = new DatagramPacket(data2, data2.length); // 2.接收伺服器響應的資料 socketUdp.receive(packet2); // 3.讀取資料 String reply = new String(data2, 0, packet2.getLength()); call.Receive(reply);//把傳送的資料交給介面 System.out.println("我是客戶端,伺服器說:" + reply); // 4.關閉資源 } // socketUdp.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 關閉 這裡請教一個問題。 就是我關閉不了。為了實現長連線。怎麼弄。 */ public void closeSocket(){ if(socketUdp!=null){ socketUdp.close(); System.out.println("關閉了UDP連線"); }else if(socketTcp!=null){ try { socketTcp.close(); System.out.println("關閉了TCP連線"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ System.out.println("沒有開啟無須關閉!!"); } }

在這裡面。使用了兩個介面。不要忘記添加了

//TCP
public interface CallBackSocketTCP {
    //這個回撥用於獲取服務端返回的資料
      void Receive(String info);
    //判斷是否處在連線在狀態
      void isConnect(boolean state);
}
//UDP
public interface CallBackSocketUDP {
    void isConnect(boolean state);//判斷狀態
    void Receive(String data); //接收服務端返回的資料
}
//對了,還有一個工具類
/**
 * 
 * @author jay chen
 *  Socket 工具類
 */
public class SocketUtil {
    Socket socket = null;

    public SocketUtil(Socket socket) {
        super();
        this.socket = socket;
    }

    //斷開連線
    public void closeConnect(){
        try {
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //檢測是否連線 如果斷開就重連
    public boolean isConnect(){
        if(socket.isClosed()){//檢測是否關閉狀態
            //TODO 這個地方檢測數 是斷開,在這寫重連的方法。

            return false;
        } 
        return true;
    }
    //傳送資料
    public void sendData(String data) throws IOException {
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write(data.getBytes());
    }

    //接收資料
    public String receiveData() throws IOException {
        InputStream inputStream = socket.getInputStream();
//        DataInputStream data=new DataInputStream(inputStream);
        byte[] buf = new byte[1024];
        int len = inputStream.read(buf);
        String text = new String(buf, 0, len);
        return text;
    }
}

最後就是呼叫了。

    public static void main(String[] args) {
//IP 請填寫你們的本機地址         SocketClient.getSingle().getTCPConnect("192.168.00.00", 60000,"客戶端 要傳送的data", new CallBackSocketTCP() {
//              @Override
//              public void Receive(String info) {
//                  // TODO Auto-generated method stub
//                  System.out.println("服務端返回的資料:"+info);
//              
//              }
//              
//              @Override
//              public void isConnect(boolean state) {
//                  // TODO Auto-generated method stub
//                   if(state){
//                       System.out.println(state);
//                   }else{
//                       System.out.println("正在嘗試重新連線socket"); 
//                   }
//              }
//              
//               
//          });

            SocketClient.getSingle().getUDPConnect(55555,"這是我要傳送的資料",new CallBackSocketUDP() {

                @Override
                public void isConnect(boolean state) {//連線狀態
                    // TODO Auto-generated method stub
                    System.out.println(state);
                }

                @Override
                public void Receive(String data) {//返回的資料
                    // TODO Auto-generated method stub
                    System.out.println(data);
                }
            });
            //關閉 socket
            SocketClient.getSingle().closeSocket();
        } 

開啟SocketTool 開始測試吧。。