【问题标题】:Android Client socket , how to read data?Android 客户端套接字,如何读取数据?
【发布时间】:2011-05-05 07:06:37
【问题描述】:

这是我的完整代码:cnx 已建立,我正在向服务器发送数据,但我无法从服务器读取任何内容...

public class client extends Activity
{
    /** Called when the activity is first created. */
    Socket sock;
    String spliter = "**";
    String mobileNbr = "100";
    String LastJOKEId = "-1";
    String spliterlast = "^^$$";
    BufferedReader inFromServer;
    DataOutputStream outToServer;
    TextView cnx;
    TextView output;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setupNetworking();
        // Thread readerThread=new Thread(new IncomingReader());
        // readerThread.start();
    }

    private void setupNetworking()
    {
        try
        {
            Log.i("ClientActivity", "Connecting...");
            sock = new Socket("192.168.153.221", 9003);
            cnx = (TextView) findViewById(R.id.textView1);
            cnx.setText("Network Established.");
            inFromServer = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            Log.i("ClientActivity", "Sending command.");
            outToServer = new DataOutputStream(sock.getOutputStream());
            String sentence = "logins" + spliter + mobileNbr + spliter + LastJOKEId + spliterlast;
            outToServer.writeBytes(sentence + '\n');
            Log.i("ClientActivity", "Sent.");
        }
        catch (UnknownHostException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            cnx = (TextView) findViewById(R.id.textView1);
            cnx.setText("Network failed");
            e.printStackTrace();
        }
    }

    public class IncomingReader implements Runnable
    {
        String message;
        public void run()
        {
            try
            {
                while ((message = inFromServer.readLine()) != null)
                {
                    output = (TextView) findViewById(R.id.textView2);
                    output.setText(message);
                }
            }
            catch (IOException e)
            {
                output = (TextView) findViewById(R.id.textView2);
                output.setText("nth to display");
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

【问题讨论】:

  • 我什么也没有得到:S什么都没发生...
  • 这部分你调试了吗?您的inFromServer 是如何声明/处理的?您应该尝试捕获Exception 而不是IOException,因为也很容易找到NullPointerException。此外,如果您的最后一行是一个空/空白字符串,您的 TextViwe 将不会显示任何内容。您应该尝试使用append 而不是setText
  • 谢谢你rekaszeru...你给了我一个提示o解决我的问题。它起作用了,现在我可以读取我的数据了:D

标签: java android eclipse sockets client-side


【解决方案1】:
package some;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class NetClient {

    /**
     * Maximum size of buffer
     */
    public static final int BUFFER_SIZE = 2048;
    private Socket socket = null;
    private PrintWriter out = null;
    private BufferedReader in = null;
    
    private String host = null;
    private String macAddress = null;
    private int port = 7999;
    
    
    /**
     * Constructor with Host, Port and MAC Address
     * @param host
     * @param port
     * @param macAddress
     */
    public NetClient(String host, int port, String macAddress) {
        this.host = host;
        this.port = port;
        this.macAddress = macAddress;
    }
    
    private void connectWithServer() {
        try {
            if (socket == null) {
                socket = new Socket(this.host, this.port);
                out = new PrintWriter(socket.getOutputStream());
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private void disConnectWithServer() {
        if (socket != null) {
            if (socket.isConnected()) {
                try {
                    in.close();
                    out.close();
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    public void sendDataWithString(String message) {
        if (message != null) {
            connectWithServer();
            out.write(message);
            out.flush();
        }
    }
    
    public String receiveDataFromServer() {
        try {
            String message = "";
            int charsRead = 0;
            char[] buffer = new char[BUFFER_SIZE];
            
            while ((charsRead = in.read(buffer)) != -1) {
                message += new String(buffer).substring(0, charsRead);
            }
            
            disConnectWithServer(); // disconnect server
            return message;
        } catch (IOException e) {
            return "Error receiving response:  " + e.getMessage();
        }
    }
    
    
}

//---------------使用NetClient---------------- --------------------------------

NetClient nc = new NetClient(host, port, mac); //mac address maybe not for you
nc.sendDataWithString("your data");
String r = nc.receiveDataFromServer();

这是我们的 android socket 客户端,可以很好地与 Python server socket 配合使用,希望对您有所帮助。

【讨论】:

    【解决方案2】:
    HttpResponse response = m_httpClient.execute( request );
    String result = "";
    if( response.getStatusLine().getStatusCode() == HttpStatus.SC_OK )
    {
    // open stream
          InputStream stream = response.getEntity().getContent();
    
          if( stream != null )
          {
            int len = 0;
            byte[] buf = new byte[ 1024 ];
    
            try
            {
              ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    
              while( ( len = stream.read( buf ) ) > 0 )
              {
                outputStream.write( buf, 0, len );
              }
    
              buf = outputStream.toByteArray();
              result = EncodingUtils.getAsciiString( buf );
            }
            catch( IOException e )
            {
              e.printStackTrace();
            }
            finally
            {
              stream.close();
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 2012-06-24
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多