Java Sockets - передача в режиме реального времени - PullRequest
2 голосов
/ 01 мая 2011

Я получил этот код от блога Android-er. Большое ему спасибо за то, что я почти понял основные соединения с сокетами в Java. Итак, я получил это клиентское приложение на моем устройстве Android и компьютере с запущенным сервером, но как я могу сделать цикл в клиентском коде, чтобы он отправлял данные из EditText в режиме реального времени? (всякий раз, когда это меняется) Пожалуйста, если кто-то может очистить это для полного новичка?

----- Это код клиента (Android-er Copyrights):

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

----- Это код сервера (Android-er Copyrights):

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

Ответы [ 2 ]

1 голос
/ 01 мая 2011

Есть несколько вещей, которые вам нужно изменить.

Прежде всего, если вы хотите, чтобы данные отправлялись в режиме реального времени, вам нужно будет перейти от использования кнопки OnClickListener к использованию TextWatcher(см. addTextChangedListener в TextView )

Поскольку это событие будет вызываться при каждом изменении текста, вам нужно будет открыть свой сокет вне события (вам не нужен новый сокеткаждый раз, когда набирается какой-то текст), а затем в прослушивателе вы просто хотите отправить новые данные в сокет.

0 голосов
/ 01 мая 2011

Вы можете установить прослушиватель измененного текста на свой EditText и выполнить отправку оттуда.

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

Но учтите, что если эта отправка не асинхронная, она может заблокировать ввод текста для пользователя. Задержка в сети может быть относительно высокой в ​​сетях GSM, поэтому пользователь может раздражаться, когда его недавно набранные символы не сразу появляются на экране.

...