Android Сообщение TCP-сервера на рабочий стол C# Клиент - PullRequest
0 голосов
/ 24 апреля 2020

Я создаю приложение SMS Sender с приложением Android. Android Приложение работает как сервер, а настольное приложение работает как Клиент. Я успешно соединил оба. Сервер получает сообщения от Клиента. Теперь я хочу, чтобы сервер (т. Е. Android App) отправил обратно некоторую базовую c информацию об устройстве клиенту (т. Е. Приложение для настольных компьютеров), но не могу понять, как это сделать. Мой 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 голосов
/ 25 апреля 2020

наконец-то нашел решение:

1-й определил класс упаковки

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;
        }


    }

, затем дождался Syn c Data

/// <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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...