簡體   English   中英

Android中僅客戶端編程的套接字

[英]Client only socket programming in android

我想打開一個TCP連接以將數據發送到android應用程序中的ip地址。 我發現的每個套接字編程文章/線程都同時顯示客戶端和服務器端代碼(通常是聊天程序)。 是否可以僅在Android設備上運行客戶端代碼,然后將任意數據發送到例如Google的IP地址? 現在我正在使用此線程(最高支持的答案) Android Client套接字中的代碼,如何讀取數據? 在擴展AsynchTask的類中,如下所示:

public class InternetTask extends AsyncTask<Void, Integer, Void> {
    public static final int BUFFER_SIZE = 2048;
    private Socket socket = null;
    private PrintWriter out = null;
    private BufferedReader in = null;
    private int port = 80;
    private String host = null;
    private static final String TAG="sure2015test";

    public InternetTask(String host,int port) {
        this.host=host;
        this.port=port;
    }

    @Override
    protected Void doInBackground(Void... args) {


        connectWithServer();
        Log.i(TAG, "Connected");
        sendDataWithString("hello");
        Log.i(TAG, "Sent data");
        String response=receiveDataFromServer();
        Log.i(TAG,response);
        disConnectWithServer();
        return null;
    }


    private void connectWithServer() {
        try {
            if (socket == null) {
                socket = new Socket(this.host, this.port);
                out = new PrintWriter(socket.getOutputStream());
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            }
        } catch (IOException e) {
            Log.i(TAG,"IO Exeception");
            e.printStackTrace();
        }
    }

    private void disConnectWithServer() {
        if (socket != null) {
            if (socket.isConnected()) {
                try {
                    in.close();
                    out.close();
                    socket.close();
                } catch (IOException e) {
                    Log.i(TAG,"IO exception disconnecting");
                    e.printStackTrace();
                }
            }
        }
    }

    public void sendDataWithString(String message) {
        if (message != null) {
            connectWithServer();
            out.write(message);
            out.flush();
        }
    }

    public String receiveDataFromServer() {
        try {
            String message = "";
            int charsRead = 0;
            char[] buffer = new char[BUFFER_SIZE];
            Log.i(TAG,"Message before: "+message);
            while ((charsRead = in.read(buffer)) != -1) {
                message += new String(buffer).substring(0, charsRead);
                Log.i(TAG,message);
            }
            Log.i(TAG,"Message after: "+message);
            disConnectWithServer(); // disconnect server
            return message;
        } catch (IOException e) {
            Log.i(TAG,"IO Error in receiving message");
            return "Error receiving response:  " + e.getMessage();
        }
    }
}

還有我在MainActivity.java中的onCreate方法

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    InternetTask task=new InternetTask("74.125.226.159",80);
    task.execute();
}

當我運行它時,我在日志中得到這個:

05-16 00:01:04.368      622-637/? I/sure2015test﹕ Connected
05-16 00:01:04.369      622-637/? I/sure2015test﹕ Sent data
05-16 00:01:04.369      622-637/? I/sure2015test﹕ Message before:
05-16 00:03:04.405      622-637/com.example.connorstein.sockethelloworld I/sure2015test﹕ Message after:

因此,使用Google的IP在端口80上打開套接字時也沒有例外,發送或接收數據也沒有例外。 看來我沒有回應。 這是因為我發送的數據(“ hello”)沒有意義嗎? 我認為至少我會得到一個響應,說無效請求或類似的內容。 我也嘗試發送“ GET / HTTP / 1.0”,但也沒有響應。

Google回應為空白,因為您沒有向其發送正確的HTTP請求。 模仿普通Web瀏覽器的請求,您將得到響應。 HTTP是建立在TCP之上的協議。 您需要遵循協議以從服務器中獲取有用的東西。

獲得響應的最小瀏覽器標頭示例:

GET / HTTP/1.1\r\nUser-Agent: curl/7.37.1\r\nHost: www.google.com\r\nAccept: */*\r\n\r\n

與其使用Web服務器,不如考慮使用SSH服務器。 SSH服務器將發送類似...

SSH-2.0-OpenSSH_5.3\r\n

...當您連接時。 始終響應的服務器對客戶端代碼進行故障排除要容易得多。 請注意,您可能會使系統管理員瘋狂地不斷連接到他們的ssh服務器。 您可能想建立自己的測試對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM