學習Android推送功能筆記(4)---Socket實戰之服務器端

socket的使用和 Mina框架

1.編程實現服務器和客戶端之間建立連接,用Socket

服務器端:

package com.weikang.server;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {

public static void main(String[] args) {//main方法裏的代碼都是靜態的,所以把start方法體寫在其他方法裏,用main方法調用
    // TODO Auto-generated method stub
    SocketServer server = new SocketServer();
    server.startServer();
}
public void startServer(){
    ServerSocket serverSocket = null;//初始化一個ServerSocket對象
    BufferedReader bufferedReader = null;//初始化一個BufferedReader對象,用於讀取從Socket輸入流裏傳送過來的信息
    Socket socket =null;//初始化一個socket對象
    BufferedWriter writer = null;//定義BufferedWriter對象,用於讀取輸入信息,並傳送到Socket輸出流
    try {
        serverSocket = new ServerSocket(9899);
        System.out.println("server started...");
        socket = serverSocket.accept();//打斷再次,直到有客戶端接入
        System.out.println("client" + socket.hashCode() +"connected");//打印提示有客戶端接入了
        bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//獲得從客戶端傳送過來的信息
        writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        String receivedmMsg ;
        while (((receivedmMsg = bufferedReader.readLine())!=null)) {
            System.out.println(receivedmMsg);
            writer.write("收到了:\"" + receivedmMsg+"\"\n");   


            writer.flush();
        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        try {
            writer.close();
            serverSocket.close();
            bufferedReader.close();
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

}
客戶端代碼

package com.weikang.client;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class SocketClient {
public static void main(String[] args){
SocketClient client = new SocketClient();
client.start();
}

public void start(){
    BufferedReader inputReader =null;
    BufferedWriter writer = null;
    Socket socket = null;
    BufferedReader socketReader = null;
    try {
        socket = new Socket("127.0.0.1",9899);
        startServerReplyListener(socketReader);
        System.out.println("連接到了服務器...");
        writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        inputReader = new BufferedReader(new InputStreamReader(System.in));
        String inputContent;
        while (!(inputContent = inputReader.readLine()).equals("bye")) {
            writer.write(inputContent+"\n");
            writer.flush();
            String response = socketReader.readLine();
            System.out.println(response);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        try {
            socketReader.close();
            socket.close();
            inputReader.close();
            writer.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
public void startServerReplyListener(final BufferedReader reader){
    new Thread(){
        public void run() {
            String response = null;
            try {
                while ((response = reader.readLine())!=null) {
                    System.out.println(response);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        };
    }.start();

}

}


與服務器端差不多
- 其實我覺得我寫上代碼也沒啥意思,,以後返回來看的時候也不會看代碼吧,,,,,,
- 總之就是用了原生態的方法實現了服務器和一個客戶端之間的長連接,,恩,,是這樣,
- 後面再學習框架的方法實現服務器客戶端的多個長連接


用原生方式寫的過程中,連接多個客戶端出現了一個Bug
- 具體表現爲:每個客戶端只能與服務器發送一次消息,
- 經過各種Dubug,發現了問題所在, 以上代碼是存在問題的,如果在等待輸入的時候進入while循環.在while循環裏打印出從服務器獲得的消息.而不是從寫的那個監聽器裏打印出來的,會導致,在while循環等待的過程中,內部打印從服務器獲取消息的那一行還在等待從服務器發來消息,導致從控制檯輸入無效,發送不到服務器!

socket總結

socket是阻塞式的,,確實不咋地,,所以爆出了我上面的各種錯誤
其實Java1.4以上的版本中Java都封裝了一個工具java.nio,但是操作特別複雜,用的人也不是很多.所以一些大牛就在nio的基礎上有封裝了一些操作簡單的框架,Mina爲例—-接下來學習,Mina初體驗

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章