无法通过 TCP 连接连接到 Android

Unable to connect via TCP connection to Android

我目前正在制作一个 Android 应用程序,它需要通过 TCP/IP 连接到 Windows PC,其中 Windows PC 是 服务器和Android是一个客户端。问题出在连接的某个地方!每当我尝试启动连接时,它都会为客户端保持 Waiting,当在客户端中单击连接按钮时,什么都没有发生!

我正在使用的服务器端代码是,

TcpListener listner = new TcpListener(IPAddress.Any, 8126);
    NetworkStream netstream;
    TcpClient client;
    byte[] datalength = new byte[4];

    public void btnstart_Click(object sender, EventArgs e)
    {

        Thread startconnection = new Thread(new ThreadStart(connect));
        startconnection.Start();

    }

    public void connect()
    {


        try
        {
            listner.Start(); //Starts Listening to any IP with port 8126

            //Invoked Just because of CrossThreading Error

            Invoke(new MethodInvoker(delegate
            {
                this.lbl_status.Text = "Status : Waiting for Client";
            }));

            //Invoke Complete.



            listner.Server.Listen(1);
            client = listner.AcceptTcpClient();


            if (client.Connected)
            {
                Invoke(new MethodInvoker(delegate
                {
                    this.lbl_status.Text = "Status : Connected Successfully";
                }));
                //serverReceive();
            }


        }
        catch (Exception ex)
        {

            //lbl_status.Text = "Status : " + ex.Message;
            MessageBox.Show(ex.Message);
        }
    }

客户端代码为,

        TcpClient tcpclient;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        SetContentView(Resource.Layout.Main);
        Button btnConnectClick = FindViewById<Button>(Resource.Id.btnConnect);
        btnConnectClick.Click += BtnConnectClick_Click;


    }

    private void BtnConnectClick_Click(object sender, System.EventArgs e)
    {
        Toast.MakeText(this, "Connection waiting", ToastLength.Long);
        try
        {
           IPAddress ip = IPAddress.Parse(Resource.Id.ipadd.ToString()); //Ip from textbox

            tcpclient.Connect(ip, 8126);
            if (tcpclient.Connected)
            {
                Toast.MakeText(this, "Connected Successfully!", ToastLength.Long);
            }

        }
        catch (System.Exception ex)
        {
            Toast.MakeText(this, ex.Message, ToastLength.Long);

        }

    }

我不知道具体问题出在哪里!

你知道什么是Resource.Id.ipadd.ToString() returning吗?它是一个像 2130968576 这样的数字。你的 OnCreate 方法必须是

EditText ipadd;

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);

    SetContentView(Resource.Layout.Main);
    Button btnConnectClick = FindViewById<Button>(Resource.Id.btnConnect);.
    ipadd = FindViewById<EditText>(Resource.Id.ipadd); // Create object of textbox
    btnConnectClick.Click += BtnConnectClick_Click;


}

然后使用

IPAddress ip = IPAddress.Parse(ipadd.Text);

它将 return IP 地址。

我在 PC 站点上使用 WPF 应用程序作为服务器测试了您的代码,在真实设备上使用 Xamarin.Android 应用程序作为客户端测试了您的代码。

在我身边工作正常。我在您的代码中发现的唯一问题是,在您的客户端,您没有初始化 tcpclient,当您编写 tcpclient.Connect(ip, 8126); 时,tcpclient 为空(但它不会抛出一个例外),我只是像这样修改了你的代码:

IPAddress ip = IPAddress.Parse("..."); //Ip from textbox
tcpclient = new TcpClient();
tcpclient.ConnectAsync(ip, 8126);

您可以试一试,如果还是不行,请确保您的设备在同一网络中。

我在这里得到了答案,我正在执行的代码是正确的,并且一直成功建立 TCP 连接,但问题出在这个地方,

if (client.Connected) { Invoke(new MethodInvoker(delegate { this.lbl_status.Text = "Status : Connected Successfully"; })); }

每次连接时 Client.Connected 返回 False 我不知道为什么。 有没有其他方法可以检查客户端是否已连接?