首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Sockets -实时传输

Java Sockets -实时传输
EN

Stack Overflow用户
提问于 2011-05-01 22:06:09
回答 2查看 3.5K关注 0票数 2

我从Android-er blogspot得到这段代码,非常感谢他让我几乎理解了java中的基本套接字连接。所以我在我的安卓设备和运行服务器的电脑上安装了这个客户端应用程序,但我如何在客户端代码中进行循环,使其实时从EditText发送数据?(每当它改变时)如果有人可以为一个完整的新手清理它吗?

-这是客户端代码(Android-er版权):

代码语言:javascript
复制
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版权):

代码语言:javascript
复制
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();
     }
    }
   }
  }
 }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-01 22:18:30

有几件事你需要改变。

首先,如果您希望实时发送数据,则需要从使用按钮OnClickListener改为使用TextWatcher (请参阅TextView中的addTextChangedListener )

由于此事件将在每次文本更改时触发,因此您将需要在事件外部打开套接字(您不希望每次键入文本时都有新的套接字),然后在侦听器中,您只需将新数据发送到套接字。

票数 1
EN

Stack Overflow用户

发布于 2011-05-01 22:20:54

你可以在你的EditText上设置一个文本改变的监听器,然后从那里发送。

代码语言:javascript
复制
edittext.addTextChangedListener(new TextWatcher() {
    public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
 // ... do your sending here
}

但要注意,如果发送不是异步的,可能会阻塞用户的文本输入。在GSM网络上,网络延迟可能相对较高,因此当用户新键入的字符不会立即出现在屏幕上时,用户可能会感到恼火。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5848876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档