2011-05-01 9 views
2

私はこのコードフォームをAndroid-er blogspotで入手しました。だから、私はアンドロイドデバイス上のこのクライアントアプリケーションを取得し、サーバーが稼働しているコンピュータがありますが、クライアントコードでループを作成して、リアルタイムでEditTextからデータを送信できるようにするにはどうすればよいですか? (それが変わるたびに)誰かが完全な初心者のためにそれをクリアすることができる場合はどうかしてください?Javaソケット - リアルタイムでの送信

-----これはクライアントコード(アンドロイド-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(); 
    } 
    } 
} 
}}; 
} 

-----これは、サーバコード(アンドロイド-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(); 
    } 
    } 
    } 
    } 
} 
} 

答えて

1

変更する必要があることがいくつかあります。あなたはデータをリアルタイムに送信する場合

まず第一に、あなたはTextWatcherを使用するには、ボタンOnClickListenerを使用してから変更する必要があります(TextViewでaddTextChangedListenerを参照)

このイベントが発射されるようにテキストが変更されるたびに、イベントの外でソケットを開く必要があります(テキストが入力されるたびに新しいソケットを必要としません)。その後、リスナーで新しいデータをソケット。

+0

ありがとうございました!私はイベントの外で新しいソケットを開くonSensorChanged - センサーデータをPCに送信し、新しいdataOutputStreamも作成したいので、イベント内でDataOutputStream.WriteUTFを使用すると、一度だけ送信されます。 – Boro

+0

ソケットを閉じていないことを確認し、書き込みが終わるたびにソケットをフラッシュしてください。 – Codemwnci

0

EditTextにテキスト変更されたリスナーを設定し、そこから送信することができます。

edittext.addTextChangedListener(new TextWatcher() { 
    public void onTextChanged(CharSequence charSequence, int start, int before, int count) { 
// ... do your sending here 
} 

ただし、送信が非同期でないと、ユーザーのテキスト入力をブロックする可能性があります。ネットワークの待ち時間はGSMネットワーク上で比較的高くなる可能性があるため、ユーザは入力したばかりの文字が画面にすぐに表示されないと、苛立つかもしれません。

関連する問題