到桌面C#客户端的Android TCP服务器消息

时间:2020-04-24 09:48:03

标签: java c# android winforms tcp

我正在使用Android应用程序构建SMS发件人应用程序。 Android应用程序充当服务器,而桌面应用程序充当客户端。我已经成功连接了两者。服务器正在接收来自客户端的消息。现在我希望服务器(即Android App)将一些基本设备信息发送回客户端(即桌面App),但不知道如何执行。我的Android应用代码在这里。

this.serverThread = new Thread(new ServerThread());
    this.serverThread.start();

class ServerThread implements Runnable {

    public void run() {
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(SERVERPORT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (!Thread.currentThread().isInterrupted()) {

            try {

                socket = serverSocket.accept();
                CommunicationThread commThread = new CommunicationThread(socket);
                new Thread(commThread).start();

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

class CommunicationThread implements Runnable {

    private Socket clientSocket;

    private BufferedReader input;

    public CommunicationThread(Socket clientSocket) {

        this.clientSocket = clientSocket;

        try {

            this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));



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

    public void run() {

        while (!Thread.currentThread().isInterrupted()) {

            try {

                String read = input.readLine();
                updateConversationHandler.post(new updateUIThread(read));


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

}
class updateUIThread implements Runnable {
    private String msg;

    public updateUIThread(String str) {
        this.msg = str;
    }

    @Override
    public void run() {

        if(msg.equals("I m Connected"))
        {
            vConn.setText("Connected");
            // Send Back Info
        }


        vClientMsg.setText(vClientMsg.getText().toString()+"Client Says: "+ msg + "\n");
    }
}

1 个答案:

答案 0 :(得分:0)

最终找到了解决方案:

第一个定义了包装类

private class Packet
    {
        public Socket CurrentSocket;
        //public byte[] DataBuffer = new byte[4096];
        public byte[] DataBuffer = new byte[1024];

        /// <summary>
        /// Construct a Packet Object
        /// </summary>
        /// <param name="sock">The socket this Packet is being used on.</param>
        /// <param name="client">The client number that this packet is from.</param>
        public Packet(Socket sock)
        {
            CurrentSocket = sock;
        }


    }

然后等待同步数据

/// <summary>
    /// Start an asynchronous wait for data from the server.  When data is recieved, a callback will be triggered.
    /// </summary>
    private void WaitForData()
    {
        try
        {
            Packet pack = new Packet(_clientSocket);
            _clientSocket.BeginReceive(pack.DataBuffer, 0, pack.DataBuffer.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), pack);
        }

        catch (SocketException se)
        {
            System.Console.WriteLine("Client EXCEPTION in WaitForData: " + se.Message);
            ToFile(se.Message);
        }
    }

然后接收和转换数据

/// <summary>
    /// A callback triggered by receiving data from the server.
    /// </summary>
    /// <param name="asyn">The packet object received from the server containing the received message.</param>
    private void OnDataReceived(IAsyncResult asyn)
    {
        try
        {
            Packet socketData = (Packet)asyn.AsyncState;
            int dataSize = socketData.CurrentSocket.EndReceive(asyn);

            if (_receive != null)
            {
                 byte[] bData = new byte[1024];
                bData = socketData.DataBuffer;
                _lastreceivedata = Encoding.ASCII.GetString(bData, 0, dataSize);
                _receive(socketData.DataBuffer, dataSize);

            }


            WaitForData();
        }

        catch (ObjectDisposedException)
        {
            System.Console.WriteLine("Client EXCEPTION in OnDataReceived: Socket has been closed");
        }

        catch (SocketException se)
        {
            System.Console.WriteLine("Client EXCEPTION in OnDataReceived: " + se.Message);

            if (OnDisconnected != null)
                OnDisconnected();

            ToFile(se.Message);
        }
    }