c # и Android tcp связь по публичному ip - PullRequest
0 голосов
/ 03 марта 2019

Я пишу приложение на Android, которое будет общаться с сервером C # по протоколу TCP.Мой код работает нормально, когда я использую Wi-Fi, и теперь я хочу изменить его, чтобы он работал, даже если клиент Android будет использовать мобильный сервер данных в C # (только принимать и отправлять данные):

static void Main(string[] args)
    {
        //setup
        Program prog = new Program();//to run non-static void from static context

        //main server 
        try
        {
            IPAddress ipAd = IPAddress.Parse("192.168.x.xxx");
            // Initializes the Listener 
            TcpListener myList = new TcpListener(ipAd, 11000);
            /* Start Listeneting at the specified port */
            myList.Start();

            //label com
            com:
            //accept connection
            Socket s = myList.AcceptSocket();
            Console.WriteLine("Connection accepted from " + s.RemoteEndPoint);
            //recive data
            byte[] b = new byte[100];
            int k = s.Receive(b);

            char cc = ' ';
            string text = null;//wil produce recived text
            Console.Write("Recieved: ");
            for (int i = 0; i < k - 1; i++)
            {
                Console.Write(Convert.ToChar(b[i]));
                cc = Convert.ToChar(b[i]);
                text += cc.ToString();
            }
            Console.WriteLine();
            //analyze text        
            string reply = prog.analyzeText(text);

            //send reply 
            ASCIIEncoding asen = new ASCIIEncoding();//is using to encode reply<string> to possible to send format 
            s.Send(asen.GetBytes(reply));//send
            s.Close();          

            /* clean up */
            goto com;
            s.Close();
            myList.Stop();
            Console.ReadLine();

        }
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.StackTrace);
            Console.ReadLine();
        }
    }

икод клиента Android:

private String connectSocket(String msg) {//send and receive data from server
    try {
        InetAddress serverAddr = InetAddress.getByName("192.168.x.xxx");
        Socket socket = new Socket(serverAddr, 11000);
        //define PrintWriter
        PrintWriter out = null;
        try {              
            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
            final BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out.println(msg);
            String text = "";
            String finalText = "";
            while ((text = in.readLine()) != null) {
                finalText += text;
            }
            socket.close();
            return finalText;

        } catch (Exception e) {
            Toast.makeText(getApplicationContext(),"Something went wrong.\nTry again in few minutes",Toast.LENGTH_SHORT).show();
            return "exception";
        } finally {
            socket.close();
        }

    } catch (UnknownHostException e) {
        return "UnknownHostException";
    } catch (IOException e) {
        return "IOException";
    }
}

PS.извините за мой английский, но я начал изучать его только 1 год назад

1 Ответ

0 голосов
/ 04 марта 2019

Никаких изменений кода не требуется.Возможно, вам потребуется правильно настроить сеть, чтобы на вашем тестовом сервере не было брандмауэров (это может включать в себя общение с вашим провайдером, если у него есть брандмауэр, предотвращающий входящие соединения).Но стандартная связь через сокет работает через Wi-Fi или мобильный телефон.

...