Клиент сокета Android работает на сервере Java, но не на сервере C # - PullRequest
1 голос
/ 01 марта 2012

Я новичок в программировании на Android и пытаюсь отправить некоторые текстовые данные на ПК через TCP.

Я создал пример, который нашел в Интернете, который имеет клиент Android и сервер Java..

Сервер работает нормально.

Когда я запускаю Android-клиент на эмуляторе или на телефоне, оба прекрасно работают.

Проблема в том, что он мне нужен для связи с приложением C #, поэтому я создал TCPсервер в C #.

Теперь, если я запускаю Клиент на эмуляторе, он работает, и сервер C # получает данные (немного запутано, но, вероятно, это проблема кодирования текста, которую, я думаю, не составит труда решить).Но в любом случае данные поступают на сервер c #.

Если я пытаюсь запустить тот же клиент на телефоне, я даже не могу подключиться к серверу C #.Я получаю сообщение об ошибке тайм-аута при подключении.

Также я могу пинговать ПК с телефона и пинговать телефон с ПК, поэтому не думаю, что это проблема сети.

У меня есть некоторый опытв C #, но не так много на сокетах и ​​даже меньше на Android.Поэтому я спрашиваю, есть ли разница в протоколах TCP, используемых Java и C #?Извините, если это глупый вопрос, но я гуглил его часами и не нашел подсказки.

Есть идеи о том, что может быть причиной этого?

Код Java-сервера такой:

public class Servidor {
private static boolean executando = true;
private static String mensagem;
private static final int PORTA = 1234;

public static void main(String[] args) {

    try {
        ServerSocket server = new ServerSocket(1234);
        InetAddress addr = InetAddress.getLocalHost();
        System.out.println("----------- SERVER CONNECTED "
                + addr.getHostAddress() + " PORT " + PORTA
                + " -----------");
        System.out.println("Waiting connections.");

        Socket socket = server.accept();

        System.out.println("Server -> Connected Ip "
                + socket.getInetAddress().getHostAddress());
        DataInputStream in = new DataInputStream(socket.getInputStream());

        try {
            while (executando) {
                mensagem = in.readUTF();
                System.out.println("Server-> Received Message: "
                        + mensagem);
            }
            System.out.println("Servidor-> Finalizado.");

            in.close();
            socket.close();
            server.close();
        } catch (Exception e) {
            System.err.println("Server -> Error: " + e.getMessage());
            executando = false;
        }

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

} }

Код сервера C # выглядит следующим образом:

class Server
{
    private TcpListener tcpListener;
    private Thread listenThread;

    public Server()
    {
        Console.WriteLine("\nStarting server...");

        this.tcpListener = new TcpListener(IPAddress.Any, 1234);
        this.listenThread = new Thread(new ThreadStart(ListenForClients));
        this.listenThread.Start();
    }

    private void ListenForClients()
    {
        Console.WriteLine("\nWaiting for clients to connect...");

        this.tcpListener.Start();

        while (true)
        {
            blocks until a client has connected to the server
            TcpClient client = this.tcpListener.AcceptTcpClient();

            create a thread to handle communication
            with connected client
            Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
            clientThread.Start(client);
        }
    }

    private void HandleClientComm(object client)
    {
        Console.WriteLine("\nIncoming from client...");

        TcpClient tcpClient = (TcpClient)client;
        NetworkStream clientStream = tcpClient.GetStream();

        byte[] message = new byte[4096];
        int bytesRead;

        while (true)
        {
            bytesRead = 0;

            try
            {
                blocks until a client sends a message
                bytesRead = clientStream.Read(message, 0, 4096);
            }
            catch
            {
                a socket error has occured
                break;
            }

            if (bytesRead == 0)
            {
                the client has disconnected from the server
                break;
            }

            message has successfully been received
            ASCIIEncoding encoder = new ASCIIEncoding();
            Console.WriteLine("\nReceived: \n\n" + encoder.GetString(message, 0, bytesRead));
        }

        tcpClient.Close();
    }
}

При необходимости код клиента Android в точности совпадает с кодом по следующей ссылке:

http://www.portalandroid.org/comunidade/viewtopic.php?f=7&t=11077&p=127577

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...