2012-04-09 6 views
6

Sto sviluppando un'applicazione Android (client) e desidero che si connetta al mio server Java tramite la comunicazione TCP.Comunicazione client TCP e client Android Java

ho fatto il codice - semplice programma, client di inviare un messaggio e server echi esso indietro - come qui sotto:

codice del 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!"); 
    } 
} 

un codice Handler thread nello stesso file di progetto server:

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); 
     } 

    } 
} 

E questo è il lato client (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(); 
     } 
    } 
} 

e questo è il 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> 

ho provato a fare funzionare, ma non succede nulla. Quando faccio clic sul pulsante, TextView non visualizza il messaggio "Hello" dal server.

+0

Avete '' impostato nel manifest.xml? – diewie

+0

Sì, c'è un permesso INTERNET –

risposta

9

Si connette con il proprio client Android a localhost.

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

questo dovrebbe funzionare solo quando il server è in esecuzione sul dispositivo Android. Ma penso che sia in esecuzione sul tuo PC. Quindi, quando esegui la tua app sull'emulatore Android, puoi connetterti allo 10.0.2.2 per contattare l'host. Su un dispositivo reale, devi trovare l'indirizzo IP del tuo server che può essere raggiunto dal dispositivo Android, ad es. via Wi-Fi.

+0

Grazie mille! Ha funzionato. –

+0

Ciao Diewie, sto cercando di connettere il client (Android) al mio PC tramite internet, come posso farlo? - Ho provato a collegarlo tramite WiFi e ha funzionato sostituendo il 10.2.0.0 con l'indirizzo IP del mio portatile. –

+1

Funziona solo quando il PC può essere raggiunto direttamente da Internet o esistono le rispettive regole di port forwarding. Com'è la tua attuale configurazione? – diewie

0

Se il server è su Windows, digitare cmd nella casella di ricerca del menu Start, quindi digitare ipconfig al prompt dei comandi. Vedrai qualcosa come IVP4 Address----- 192.168.0.101. è necessario utilizzare questo indirizzo e numero di porta sul client.