2011-05-01 3 views
2

나는이 코드 폼을 Android-er blogspot으로 가져와 Java에서 기본 소켓 연결을 거의 이해할 수있게 해 주셔서 감사합니다. 그래서 내 안드로이드 장치 및 서버에서 실행중인 컴퓨터에이 클라이언트 응용 프로그램을 가지고 있지만 어떻게 실시간으로 EditText에서 데이터를 보낼 수 있도록 클라이언트 코드에서 루프를 만들 수 있습니까? (변경 될 때마다) 누군가가 완전한 초보자를 위해 그것을 정리할 수 있다면 제발?Java 소켓 - 실시간 전송

는 -----이 클라이언트 코드 (안드로이드 어 저작권)입니다 :

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

-----이 서버 코드 (안드로이드 어 저작권)입니다 :

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를 사용하여 (TextView에 addTextChangedListener 참조) OnClickListener를의 Button

를 사용하는 변경해야합니다 텍스트가 바뀔 때마다 이벤트 외부에서 소켓을 열어야합니다 (일부 텍스트를 입력 할 때마다 새 소켓을 원하지 않음). 그런 다음 청취자는 새 데이터를 소켓.

+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 네트워크에서 상대적으로 높을 수 있으므로 새로 입력 한 문자가 화면에 즉시 표시되지 않으면 사용자가 짜증을 느낄 수 있습니다.