2012-04-09 45 views
6

Tôi đang phát triển một ứng dụng Android (máy khách) và muốn nó kết nối với máy chủ Java của tôi bằng cách sử dụng giao tiếp TCP.Máy khách Android và máy chủ Java Giao tiếp TCP

tôi đã thực hiện mã - chương trình đơn giản, khách hàng gửi tin nhắn và máy chủ echos nó trở lại - như bên dưới:

đang Server:

import java.net.*; 


public class Server { 

    public static void main(String[] args) { 

     int nreq = 1; 
     try 
     { 
      ServerSocket sock = new ServerSocket (8080); 
      for (;;) 
      { 
       Socket newsock = sock.accept(); 
       System.out.println("Creating thread ..."); 
       Thread t = new ThreadHandler(newsock,nreq); 
       t.start(); 
      } 
     } 
     catch (Exception e) 
     { 
      System.out.println("IO error " + e); 
     } 
     System.out.println("End!"); 
    } 
} 

mã Chủ đề Handler trong cùng một tập tin dự án của máy chủ:

import java.io.*; 
import java.net.*; 

class ThreadHandler extends Thread { 
    Socket newsock; 
    int n; 

    ThreadHandler(Socket s, int v) { 
     newsock = s; 
     n = v; 
    } 


    public void run() { 
     try { 

      PrintWriter outp = new PrintWriter(newsock.getOutputStream(), true); 
      BufferedReader inp = new BufferedReader(new InputStreamReader(
        newsock.getInputStream())); 

      outp.println("Hello :: enter QUIT to exit \n"); 
      boolean more_data = true; 
      String line; 

      while (more_data) { 
       line = inp.readLine(); 
       System.out.println("Message '" + line + "' echoed back to client."); 
       if (line == null) { 
        System.out.println("line = null"); 
        more_data = false; 
       } else { 
        outp.println("From server: " + line + ". \n"); 
        if (line.trim().equals("QUIT")) 
         more_data = false; 
       } 
      } 
      newsock.close(); 
      System.out.println("Disconnected from client number: " + n); 
     } catch (Exception e) { 
      System.out.println("IO error " + e); 
     } 

    } 
} 

Và đây là mặt khách hàng (Android):

package com.android.client; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.Scanner; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class Client extends Activity { 
    /** Called when the activity is first created. */ 
    Scanner scanner = new Scanner(System.in); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final EditText msg = (EditText) findViewById(R.id.etMsg); 
     Button send = (Button) findViewById(R.id.bSend); 
     final TextView convo = (TextView) findViewById(R.id.tvConvo); 
     final TextView status = (TextView) findViewById(R.id.tvStatus); 

     try { 
      send.setOnClickListener(new View.OnClickListener() { 

       Socket s = new Socket("localhost", 8080); 
       String message = msg.getText().toString(); 

       @Override 
       public void onClick(View v) { 
        status.setText("..."); 
        PrintWriter outp = null; 
        BufferedReader inp = null; 
        status.setText("Established connection.."); 
        String serverMsg = null; 

        try { 
         outp = new PrintWriter(s.getOutputStream(), true); 
         inp = new BufferedReader(new InputStreamReader(s.getInputStream())); 
         serverMsg = inp.readLine(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        convo.append(serverMsg + "\n"); 

        if (message != null) { 
         if (msg.getText().toString().trim() == "QUIT") { 
          try { 
           s.close(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          status.setText("Disconnected from server."); 

         } else { 
           try { 

            convo.append(message + "\n"); 
            outp.println(message); 
            serverMsg = inp.readLine(); 
            convo.append(serverMsg + "\n"); 
           } catch (IOException e) { 
            e.printStackTrace(); 
           } 
         } 

        } 
        else 
         status.setText("Problem in connection..!"); 
       } 
      }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Và đây là file XML:

<?xml version="1.0" encoding="utf-8" ?> 
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> 
    <TextView android:id="@+id/tvText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Your message here:" /> 
- <EditText android:id="@+id/etMsg" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10"> 
    <requestFocus /> 
    </EditText> 
    <TextView android:id="@+id/tvStatus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Status..." android:textAppearance="?android:attr/textAppearanceSmall" /> 
    <Button android:id="@+id/bSend" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send" /> 
    <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Conversation:" android:textAppearance="?android:attr/textAppearanceLarge" /> 
    <TextView android:id="@+id/tvConvo" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> 
    </LinearLayout> 

Tôi cố gắng chạy nó, nhưng không có gì xảy ra. Khi tôi nhấp vào nút TextView không xem thông báo "Hello" từ máy chủ.

+0

Bạn có 'android sử dụng-permission android: name =" android.permission.INTERNET "/>' được đặt trong tệp manifest.xml của bạn không? – diewie

+0

Có sự cho phép INTERNET –

Trả lời

9

Bạn kết nối với ứng dụng Android của mình để localhost.

Socket s = new Socket("localhost", 8080); 

Điều này sẽ chỉ hoạt động khi máy chủ của bạn đang chạy trên thiết bị Android. Nhưng tôi nghĩ nó đang chạy trên PC của bạn. Vì vậy, khi bạn chạy ứng dụng trên trình giả lập Android, bạn có thể kết nối với 10.0.2.2 để liên hệ với máy chủ. Trên thiết bị thực, bạn phải tìm ra địa chỉ IP của máy chủ có thể truy cập được bằng thiết bị Android, ví dụ: qua Wi-Fi.

+0

Cảm ơn bạn rất nhiều! Điều đó hiệu quả. –

+0

Xin chào Diewie, tôi đang cố gắng kết nối máy khách (Android) với máy tính của mình qua internet, làm thế nào tôi có thể làm điều đó? - Tôi đã thử kết nối nó qua WiFi và nó hoạt động bằng cách thay thế 10.2.0.0 bằng địa chỉ IP của máy tính xách tay của tôi. –

+1

Điều này sẽ chỉ hoạt động, khi máy tính của bạn có thể truy cập trực tiếp từ Internet hoặc các quy tắc chuyển tiếp cổng tương ứng tồn tại. Thiết lập hiện tại của bạn như thế nào? – diewie

0

Nếu máy chủ của bạn có trên Windows, hãy nhập cmd vào hộp tìm kiếm menu Bắt đầu rồi nhập ipconfig tại dấu nhắc lệnh. Bạn sẽ thấy một cái gì đó như IVP4 Address----- 192.168.0.101. bạn cần sử dụng địa chỉ và số cổng này trên máy khách của mình.

Các vấn đề liên quan