【问题标题】:Android client doesn't show message send by UWP Tcp serverAndroid 客户端不显示 UWP Tcp 服务器发送的消息
【发布时间】:2016-02-03 17:05:45
【问题描述】:

我有一个异步 TCP 服务器,用于在我的电脑上运行的 UWP 和一个 Android TCP 客户端。 服务器收到客户端消息,但仅在我关闭服务器应用程序时才将线路发送回客户端。我已经用另一个 TCP 服务器(我使用了一个 TcpListener 对象)对 Android 客户端进行了 Triend,并且它工作正常。

如何在服务器收到消息后立即将线路发送回客户端?

这里是 TCP 服务器:

        private async void StartServer()
        {
            try
            {
                //Create a StreamSocketListener to start listening for TCP connections.
                StreamSocketListener socketListener  = new StreamSocketListener();

                //Hook up an event handler to call when connections are received.
                socketListener.ConnectionReceived += SocketListener_ConnectionReceived;

                //Start listening for incoming TCP connections on the specified port.
                await socketListener.BindServiceNameAsync("9999");

                TxtServer.Text = " SERVER RUNNNING...";
            }
            catch (Exception e)
            {
                TxtError.Text = e.Message;
            }
        }

        private async void SocketListener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
        {
            //Read line from the remote client.
            Stream inStream = args.Socket.InputStream.AsStreamForRead();
            StreamReader reader = new StreamReader(inStream);
            request = await reader.ReadLineAsync();

            //Send the line back to the remote client.
            Stream outStream = args.Socket.OutputStream.AsStreamForWrite();
            StreamWriter writer = new StreamWriter(outStream);

            await writer.WriteLineAsync(request); 
            await writer.FlushAsync();
        }

这里是 TCP 客户端:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity{

    TextView textResponse;
    EditText editTextAddress, editTextPort;
    Button buttonConnect, buttonClear;

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

        editTextAddress = (EditText)findViewById(R.id.address);
        editTextPort = (EditText)findViewById(R.id.port);
        buttonConnect = (Button)findViewById(R.id.connect);
        buttonClear = (Button)findViewById(R.id.clear);
        textResponse = (TextView)findViewById(R.id.response);

        buttonConnect.setOnClickListener(buttonConnectOnClickListener);

        buttonClear.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                textResponse.setText("");
            }});
    }


    OnClickListener buttonConnectOnClickListener =
            new OnClickListener(){
                String tMsg = "TEST";

                @Override
                public void onClick(View arg0)
                {
                    MyClientTask myClientTask = new MyClientTask(editTextAddress.getText().toString(),Integer.parseInt(editTextPort.getText().toString()), tMsg);
                    myClientTask.execute();
                }};


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

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

        MyClientTask(String addr, int port, String msgTo)
        {
            dstAddress = addr;
            dstPort = port;
            msgToServer = msgTo + "\n";
        }

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

            Socket socket = null;
            DataOutputStream dataOutputStream = null;

            try {
                socket = new Socket(dstAddress, dstPort);
                dataOutputStream = new DataOutputStream(socket.getOutputStream());

                if(msgToServer != null){
                    dataOutputStream.writeBytes(msgToServer);
                }
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);
                byte[] buffer = new byte[1024];

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

                while ((bytesRead = inputStream.read(buffer)) != -1){
                    byteArrayOutputStream.write(buffer, 0, bytesRead);
                    response += byteArrayOutputStream.toString("UTF-8");
                }

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

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

    }

}

【问题讨论】:

    标签: c# android tcp uwp


    【解决方案1】:

    现在发生的情况:您的客户发送一条线路。 服务器读取该行。 服务器发回一条线。 客户端不会尝试读取一行,而是不断地从输入流中读取。

    你应该让客户端读到一行。使用'readLine()'。

    什么是 UWP?

    【讨论】:

    • 谢谢,但我尝试将 'inputStream.read(buffer)' 更改为 'inputStream.readLine(buffer)' 但它没有找到 readLine() 方法.. UWP 代表 Universal Winodws Platform
    • 然后添加一个具有 readLine() 的 BufferedInputReader。你可以在这个网站上找到很多例子。或者制作自己的 readLine。这不是很多工作。请更改帖子的主题,因为您现在知道客户是罪魁祸首。
    • 好吧,我应该已经解决了。问题是客户端中的while循环。我已将其删除并保留了这些指令 bytesRead = inputStream.read(buffer); byteArrayOutputStream.write(buffer, 0, bytesRead);响应 += byteArrayOutputStream.toString("UTF-8");
    猜你喜欢
    • 2013-04-29
    • 2012-06-27
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    相关资源
    最近更新 更多