2011-05-01 6 views
2

J'ai reçu ce code Android-er blogspot, un grand merci pour lui de me faire presque comprendre les connexions de base de socket en Java. J'ai donc eu cette application client sur mon appareil android, et l'ordinateur avec le serveur en cours d'exécution, mais comment ai-je pu faire une boucle dans un code client, pour lui faire envoyer des données depuis EditText en temps réel? (chaque fois que cela change) S'il vous plaît si quelqu'un pouvait l'effacer pour un débutant complet?Java Sockets - transmission en temps réel

----- C'est le code client (droits d'auteur Android er):

package com.exercise.AndroidClient; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.Socket; 
import java.net.UnknownHostException; 

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 AndroidClient extends Activity { 

EditText textOut; 
TextView textIn; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

textOut = (EditText)findViewById(R.id.textout); 
Button buttonSend = (Button)findViewById(R.id.send); 
textIn = (TextView)findViewById(R.id.textin); 
buttonSend.setOnClickListener(buttonSendOnClickListener); 
} 

Button.OnClickListener buttonSendOnClickListener 
= new Button.OnClickListener(){ 

@Override 
public void onClick(View arg0) { 
// TODO Auto-generated method stub 
Socket socket = null; 
DataOutputStream dataOutputStream = null; 
DataInputStream dataInputStream = null; 

try { 
    socket = new Socket("192.168.1.101", 8888); 
    dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
    dataInputStream = new DataInputStream(socket.getInputStream()); 
    dataOutputStream.writeUTF(textOut.getText().toString()); 
    textIn.setText(dataInputStream.readUTF()); 
} catch (UnknownHostException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
finally{ 
    if (socket != null){ 
    try { 
    socket.close(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    } 

    if (dataOutputStream != null){ 
    try { 
    dataOutputStream.close(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    } 

    if (dataInputStream != null){ 
    try { 
    dataInputStream.close(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    } 
} 
}}; 
} 

----- Ce code est serveur (Android de droits d'auteur) er:

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 


public class MyServer { 

public static void main(String[] args){ 
    ServerSocket serverSocket = null; 
    Socket socket = null; 
    DataInputStream dataInputStream = null; 
    DataOutputStream dataOutputStream = null; 

    try { 
    serverSocket = new ServerSocket(8888); 
    System.out.println("Listening :8888"); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

    while(true){ 
    try { 
    socket = serverSocket.accept(); 
    dataInputStream = new DataInputStream(socket.getInputStream()); 
    dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
    System.out.println("ip: " + socket.getInetAddress()); 
    System.out.println("message: " + dataInputStream.readUTF()); 
    dataOutputStream.writeUTF("Hello!"); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    finally{ 
    if(socket!= null){ 
    try { 
     socket.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 

    if(dataInputStream!= null){ 
    try { 
     dataInputStream.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 

    if(dataOutputStream!= null){ 
    try { 
     dataOutputStream.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 
    } 
    } 
} 
} 

Répondre

1

Il y a quelques choses que vous devrez changer.

Tout d'abord, si vous voulez que les données soient envoyées en temps réel, vous devrez changer d'utiliser un bouton OnClickListener à l'aide d'un TextWatcher (voir addTextChangedListener en TextView)

Comme cet événement sera tiré chaque fois que le texte change, vous devez ouvrir votre socket en dehors de l'événement (vous ne voulez pas un nouveau socket chaque fois que du texte est tapé), puis dans votre écouteur, vous voulez simplement envoyer les nouvelles données prise.

+0

Merci pour votre aide! J'ouvre une nouvelle socket en dehors de l'événement onSensorChanged - parce que je veux envoyer à un PC des données de capteur, et aussi créer de nouveaux dataOutputStream, mais quand j'utilise DataOutputStream.WriteUTF dans l'événement, il est envoyé une seule fois ... qu'est-ce qui ne va pas? – Boro

+0

assurez-vous que vous ne fermez pas votre socket, et assurez-vous également de vider le socket après chaque écriture. – Codemwnci

0

Vous pouvez définir un écouteur de modification de texte sur votre EditText et effectuer l'envoi à partir de là. Mais attention, si cet envoi n'est pas asynchrone, il peut bloquer l'entrée de texte pour l'utilisateur. La latence du réseau peut être relativement élevée sur les réseaux GSM, de sorte que l'utilisateur peut être irrité, lorsque ses caractères fraîchement tapés n'apparaissent pas immédiatement à l'écran.