【问题标题】:Receive Stream of data from Socket Connection -- Android从套接字连接接收数据流 - Android
【发布时间】:2016-08-04 09:09:44
【问题描述】:

我想要达到的目标:

步骤 1 >> 打开一个套接字连接:

Socket socket = new Socket(IPADDRESS, PORTNUMBER);

Step 2 >> 开始从 Socket 发送和接收数据:

PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
pw.write(dataForSocket + "\n");//Sending Data to socket....

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String translatedMessage = br.readLine();
Log.d(TAG, "Translated Message = "+translatedMessage);//Recieving data from Socket...

第 3 步 >> 从 Socket 接收数据并继续更新 UI...

到目前为止我尝试了什么:

public class AsyncThread extends AsyncTask<String, String, String> {

//High priority UI variables goes below....
private PrintStream out;
private Socket socket;
private BufferedReader in;


//Medium priority NON-UI variables goes below.....
public static final String SERVER_IP = "203.197.xx.xxx";
public static final int SERVER_PORT = 4xxx;


//Least priority variables goes below.....
private final String TAG = "AsyncThread";


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

    try {
        socket = new Socket(SERVER_IP, SERVER_PORT);
        String dataForSocket = "A_LARGE_STRING_OF_DATA_SEPERATED_AND_END_WITH_\n";

        /////////////---------CODE TO READ & WRITE------------\\\\\\\\\\\\\\\\\\\\\\\\\

//            out = new PrintStream(socket.getOutputStream(), true);
//            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//
//
//            out.write(dataForSocket.getBytes());
//            String message = in.readLine();
//            Log.d(TAG, "Message from Socket == "+message);



        PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        // Send first message - Message is being correctly received
              pw.write(dataForSocket + "\n");
//            pw.write(dataForSocket);
        // Send off the data



        String translatedMessage = br.readLine();
        Log.d(TAG, "Translated Message = "+translatedMessage);//In every case this comes null....


//            pw.flush();
//            pw.close();


    }
    catch(Exception e){
        e.printStackTrace();
    }

    return null;
}//doInBackground
}//async task class closes here.....

但 BufferedReader 始终为空。所以,我不知道出了什么问题。

因此作为结论:

如果有人能给我确切的步骤并指导我完成这个场景,那么我将非常感谢你。

附: : 直到现在我什至无法连接到 Socket :-( 我试过在设备上运行,在模拟器上运行,在 Genymotion 上运行,都没有。

另外,如果有人可以为我提供某种在线测试仪,那么请提供给我。

【问题讨论】:

  • “到目前为止没有教程成功运行”不是问题描述。您需要提供具体问题和导致该问题的代码。
  • @EJP :问题已更新,并且 BufferedReader 始终为空。 (这是我的问题)
  • 无法使用您发布的代码。症状是什么?您要解决的实际问题是什么?请在“来自BufferedReader 的数据始终为空”和“BufferedReader 始终为空”之间做出决定。它们不是一回事。
  • @EJP :我想连接到一个套接字,向套接字发送一些数据并从该套接字接收字节流是我的目标。
  • 这并没有回答我提出的问题。

标签: android sockets websocket stream inputstream


【解决方案1】:

最终得到的解决方案为:

public class AsyncThread extends AsyncTask<String, String, String>
{

    //High priority UI variables goes below....
    private PrintStream out;
    private Socket socket;
    private BufferedReader in;


    //Medium priority NON-UI variables goes below.....
    public static final String SERVER_IP = "203.xxx.xx.xxx";
    public static final int SERVER_PORT = 4xxx;


    //Least priority variables goes below.....
    private final String TAG = "AsyncThread";


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



    StringBuilder buffer = null;

    try {
        socket = new Socket(SERVER_IP, SERVER_PORT);
        String dataForSocket = "A LARGE STRING TO SERVER";

    /////////////---------CODE TO READ & WRITE------------\\\\\\\\\\\\\\\\\\\\\\\\\

    InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
    Log.i("ClientActivity", "Connecting...");
    Socket socket = new Socket(serverAddr, SERVER_PORT);


        Log.i("ClientActivity", "Sending command.");
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
        // where you issue the commands
        out.println(dataForSocket);
        Log.i("ClientActivity", "Sent.");

        final BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        buffer = new StringBuilder();

        buffer.append(input.readLine());
        Log.d(TAG, "Inside thread : input.readLine() == " + input.readLine());
        Log.d(TAG, "Inside thread : buffer == "+buffer);

}//TRY closes here....
catch(Exception e){
    e.printStackTrace();
}//catch closes here.....

return buffer.toString().trim();
 }//doInBackground CLOSES HERE.....
}//AsyncThread class closes here.....

参考来自: how to read socket input stream in Android

现在,我只需要使用服务而不是异步,我的问题就解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2018-11-07
    • 1970-01-01
    • 2020-09-17
    • 2019-01-26
    • 2012-12-28
    相关资源
    最近更新 更多