【问题标题】:How to get multiple messages from server in android socket如何在android socket中从服务器获取多条消息
【发布时间】:2015-08-14 15:29:36
【问题描述】:

我正在 android 中实现套接字编程。我成功地从客户端获取数据并将其显示到服务器。

异步任务如下:

public class MyClientTask extends AsyncTask<Void, Void, Void> {

  String dstAddress;
  int dstPort;
  String response = "";

  MyClientTask(String addr, int port){
   dstAddress = addr;
   dstPort = port;
  }

  @Override
  protected Void doInBackground(Void... arg0) {

   Socket socket = null;

   try {
    socket = new Socket(dstAddress, dstPort);

    ByteArrayOutputStream byteArrayOutputStream = 
                  new ByteArrayOutputStream(1024);
    byte[] buffer = new byte[1024];

    int bytesRead;
    InputStream inputStream = socket.getInputStream();

    /*
     * notice:
     * inputStream.read() will block if no data return
     */
             while ((bytesRead = inputStream.read(buffer)) != -1){
                 byteArrayOutputStream.write(buffer, 0, bytesRead);
                 response += byteArrayOutputStream.toString("UTF-8");
             }

   } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    response = "UnknownHostException: " + e.toString();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    response = "IOException: " + e.toString();
   }finally{
    if(socket != null){
     try {
      socket.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   }
   return null;
  }

  @Override
  protected void onPostExecute(Void result) {
   textResponse.setText(response);
   super.onPostExecute(result);
  }

 }

}

以上代码从服务器获取数据并将其写入文本视图。我想使用同一个套接字从服务器多次获取数据,除非单击特定按钮。但是,在 doInBackground 中,我们不能使用任何 ui 组件。我想更改以下组件,以便可以从服务器接收多个数据:

socket = new Socket(dstAddress, dstPort);

        ByteArrayOutputStream byteArrayOutputStream = 
                      new ByteArrayOutputStream(1024);
        byte[] buffer = new byte[1024];

        int bytesRead;
        InputStream inputStream = socket.getInputStream();

        /*
         * notice:
         * inputStream.read() will block if no data return
         */
                 while ((bytesRead = inputStream.read(buffer)) != -1){
                     byteArrayOutputStream.write(buffer, 0, bytesRead);
                     response += byteArrayOutputStream.toString("UTF-8");
                 }

我尝试使用

onProgressUpdate

但它也没有工作。请帮我解决这个问题。

编辑1:客户的主要活动:

package com.example.shiza.client;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "CLIENT_MESSAGE";
    EditText ip_address;
    EditText port_number;
    EditText message_client;
    Button button_send;
    Button button_cancel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void connect(View view) {
//        ip_address = (EditText) findViewById(R.id.ip_address);
//        ip_address.setText("192.168.9.100");
//        port_number = (EditText) findViewById(R.id.port_number);
//        port_number.setText("8080");
        message_client = (EditText) findViewById(R.id.message_client);
        button_send = (Button)findViewById(R.id.button_send);
        button_cancel = (Button)findViewById(R.id.button_cancel);
        Log.d(TAG, "connecting to the server.");
//        new ConnectToServer(ip_address.getText().toString(), port_number.getText().toString(), message_client,button_send,button_cancel).execute();
        new ConnectToServer("192.168.9.100","8080", message_client,button_send,button_cancel).execute();

    }
}

class ConnectToServer extends AsyncTask<Void, DataOutputStream, Void> {
    private static final String TAG = "CLIENT_MESSAGE";
    String ip_address;
    int port_number;
    EditText message_client;
    Button button_send;
    Button button_cancel;
    boolean send = false;
    boolean cancel = false;

    public ConnectToServer(String ip_address, String port_number, EditText message_client,Button button_send,Button button_cancel) {
        this.ip_address = ip_address;
        this.port_number = Integer.parseInt(port_number);
        this.message_client = message_client;
        this.button_cancel = button_cancel;
        this.button_send = button_send;
    }

    @Override
    protected Void doInBackground(Void... params) {

        try {
            Socket socket = new Socket(ip_address, port_number);

            if (LoggerConfig.TAG) {
                Log.d(TAG, "the socket is created at " + ip_address);
            }

            DataOutputStream output = new DataOutputStream(socket.getOutputStream());
            while (!cancel )
                publishProgress(output);
//            output.writeUTF("Hello from string");
            if (LoggerConfig.TAG) {
                Log.d(TAG, "I have written and closed the loop.");
            }
            socket.close();
        } catch (IOException e) {
            if (LoggerConfig.TAG) {
                Log.d(TAG, "Could not connect.");
            }
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onProgressUpdate(DataOutputStream... values) {
        super.onProgressUpdate(values);

        button_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                send = true;
            }
        });

        button_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                cancel = true;
            }
        });

        Log.d(TAG, "I am in onProgressUpdate");

            if ( send )
            {
                try {
                    values[0].writeUTF(message_client.getText().toString());
                    Log.d(TAG, "I am in onProgressUpdate try.");

                } catch (IOException e) {
                    e.printStackTrace();
                    Log.d(TAG, "I am in onProgressUpdate catch.");

                }

                send = false;
            }

    }
}

服务器的主要活动:

package com.example.shiza.server;

import android.content.Context;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.format.Formatter;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class MainActivity extends AppCompatActivity {
    TextView ip_address;
    TextView client_message;
    TextView server_status;
    TextView show_client_message;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ip_address = (TextView) findViewById(R.id.ip_address);
        client_message = (TextView) findViewById(R.id.get_client_message);
        server_status = (TextView) findViewById(R.id.server_status);
        show_client_message = (TextView) findViewById(R.id.show_client_message);


        WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
        String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());

        ip_address.setText(ip);

//        Making a server socket here


    }

    public void startServer(View view) {
        GetFromClient getFromClient = new GetFromClient(this,server_status,show_client_message);
        getFromClient.execute();
    }

}

class GetFromClient extends AsyncTask<Void, String, Void> {
    Context context;
    TextView server_status;
    TextView show_client_message;
    String TAG = "SERVER_MESSAGE";
    String inputFromClient = null;

    public GetFromClient(Context context,TextView server_status,TextView show_client_message) {
        this.context = context;
        this.server_status = server_status;
        this.show_client_message = show_client_message;
    }

    @Override
    protected Void doInBackground(Void... params) {
        Socket socket;
        try {
            ServerSocket serverSocket = new ServerSocket(8080);
            Log.d(TAG, "Server Socket is starting....");
//            server_status.setText("The server is running");


            publishProgress("okay");
            socket = serverSocket.accept();

            DataInputStream input = new DataInputStream(socket.getInputStream());

//            Calling the second background task for handling input from server

//            Log.d(TAG, "Server Socket is started....");
            do
            {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException ie) {
                    ie.printStackTrace();
                }
                inputFromClient = input.readUTF();
                publishProgress(inputFromClient);
            }
            while ( inputFromClient != "bye" );

//            publishProgress(2);
            socket.close();

        } catch (IOException e) {
            Log.d(TAG, "I am in catch.");
            e.printStackTrace();

        }

        return null;
    }

    @Override
    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);
        Log.d(TAG, "I am in onProgress update.");
        if ( values[0].equals("okay") )
        {
            server_status.setText("Server has been started");
            server_status.setTextColor(context.getResources().getColor(R.color.green));
        }
        else
        {
            show_client_message.setText(values[0]);
        }


    }

    protected void onPostExecute(Void inputFromClient)
    {
        Log.d(TAG, "I am in onPostExecute.");

        server_status.setText("Server is not running");
        server_status.setTextColor(context.getResources().getColor(R.color.red));
    }
}

我可以发送消息,但以下循环阻止了一切:

 do
                {
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException ie) {
                        ie.printStackTrace();
                    }
                    inputFromClient = input.readUTF();
                    publishProgress(inputFromClient);
                }
                while ( inputFromClient != "bye" );

【问题讨论】:

  • I am successfully getting data from client and displaying it to the server.。并且令人困惑:above code gets data from server and write it to the text view. 。 ?????
  • tried to use onProgressUpdate but it didn't work either. 。那么这应该工作。请添加该代码。
  • @greenapps 我只是粘贴...我只是混合了客户端/服务器..我认为没关系...
  • 当然很重要。我会无缘无故提到它吗?请编辑您的帖子并写出体面一致的文字。
  • 你在 onProgressUpdate 中调用 writeUTF。那是不可能的。您应该在 doInBackground 中进行读写操作。更新文本视图应该在 onProgressUpdate 中完成。删除 DataOutputStream 参数并将其替换为字符串。将要显示的消息放入 String 参数中。

标签: android sockets


【解决方案1】:

您可以使用 RunUiThread 在 doInBackground 方法中更新您的 TextView。从服务器接收数据后,只需调用

runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //here you update the views
                        }
                    });

【讨论】:

  • 感谢您的回复。让我检查一下。
  • AsyncTask 类有一个带有 onProgressUpdate 的 publishProgress。
猜你喜欢
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多