【问题标题】:Unable to connect via TCP connection to Android无法通过 TCP 连接连接到 Android
【发布时间】:2018-02-05 01:18:19
【问题描述】:

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

我正在工作的服务器端代码是,

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

        }

    }

我不知道问题出在哪里!

【问题讨论】:

  • 您是否使用像 WireShark 这样的数据包嗅探器来验证数据包是否已发送?
  • 你检查我的答案了吗?有更新吗?

标签: c# tcp server xamarin.android connection


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我试过这个解决方案,但它不起作用!!!您能否发送您尝试过的解决方案?我的设备也在同一个网络上!
    • @KuldeepThakre,代码和你的一样。检查我的demo
    • 谢谢!这段代码工作得很好,我会尽快检查我的代码并在这里更新有什么问题!再次感谢!
    【解决方案3】:

    你知道Resource.Id.ipadd.ToString()返回的是什么吗?它是一个类似于 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);
    

    它会返回 IP 地址。

    【讨论】:

    • var ip = IPAddress.Parse(3232235786.ToString()); 有什么问题?它等于192.168.1.10
    • 不,它不等于192.168.1.10。 3232235786 指向您的 EditText 及其常量(参见 Resource.Designer.cs 中的 Resource.Id,有一个 public const int ipadd = 3232235786)。
    • No, it isn't equal to 192.168.1.10。您是否尝试过运行 1 行代码?看看你在 ip 中得到了什么
    • 好吧,现在我试了一下,它奏效了,抱歉。但是你从哪里得到号码 3232235786?是Resource.Id.ipadd吗?
    • 这只是一个例子,表明您的假设可能不正确。这是 google 的 dns 服务器 134744072 或 stackoverflow.com 2539979077
    猜你喜欢
    • 2019-10-17
    • 2012-04-26
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多