簡體   English   中英

Android Socket編程

[英]Android Socket programming

我試圖連接Android應用程序(客戶端)與Java應用程序(服務器'PC')這里是我的客戶端代碼。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btn = (Button) findViewById(R.id.button1);
    txt = (EditText) findViewById(R.id.editText1);

    btn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            new CallServer().execute();
        }
    });
}

public class CallServer extends AsyncTask<String, Integer, String> {

    @Override
    protected String doInBackground(String... arg0) {
        String modifiedSentence = "hello";
        Socket clientSocket;
        try {
            clientSocket = new Socket("192.168.1.100", 8081);


            DataOutputStream outToServer = new DataOutputStream(
                    clientSocket.getOutputStream());
            BufferedReader inFromServer = new BufferedReader(
                    new InputStreamReader(clientSocket.getInputStream()));

            outToServer.writeBytes("hello world");

            modifiedSentence = 
            (inFromServer.readLine());

            clientSocket.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return modifiedSentence;
    }

    protected void onPostExecute(String result) {
        txt.setText(result);
    }
}

Android權限

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET"/>

我無法找到此代碼的問題,因為它沒有給出任何類型的交戰或錯誤我的服務器端代碼完全正常,因為我已經測試了其他Java應用程序(客戶端)。 沒有任何類型的端口問題,因為我已經通過將客戶端和服務器端代碼保存在不同的機器上來測試它並且它工作正常。

很明顯,這不是路由器防火牆相關的問題,因為你在同一個網絡下,所以只有幾個可能性:

  • 在服務器端的那個IP上沒有監聽該端口
  • 服務器端有一個本地防火牆阻止了這種連接嘗試
  • 您沒有使用WIFI,因此您不在同一個網絡中。

您應該確保可以以某種方式打開該服務,這將有助於您調試罪魁禍首的位置。 如果你已經這樣做了,我建議使用一些調試工具來跟蹤TCP數據包(我不知道你在目標機器上使用什么樣的操作系統;如果它是一些linux發行版, tcpdump可能有幫助)。

您無法從doInBackground修改諸如txt類的UI元素,因為它是一個不同的線程。

doInBackground返回你的套接字數據並在onPostExecute設置你的txt

問題出在我的服務器端代碼上。 我沒有關閉BufferedReader所以現在它工作正常。

像C#一樣使用invoke(new methodinvoker(delegate {}))

暫無
暫無

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

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