簡體   English   中英

使用套接字將字符串從android發送到C#

[英]send string from android to C# using socket

我從android向C#和從C#向android發送字符串,它在模擬器上有效,但在實際的android設備上不起作用

我的手機使用android 2.3

這是我在Android上的代碼:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    hienthi_lv_tab2 = (ListView) findViewById(R.id.lvhienthi);

    chuoi = (EditText) findViewById(R.id.string);
    ipserver = (EditText) findViewById(R.id.ipserver);

    txt = (TextView) findViewById(R.id.Show);

    quit = (Button) findViewById(R.id.quit);
    connect = (Button) findViewById(R.id.Connect);
    send = (Button) findViewById(R.id.Send);

    quit.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            finish();
        }
    });

    send.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            OUT_message = chuoi.getText().toString();


            new Thread(new Runnable() {


                final Handler handler = new Handler();

                final Runnable updateUI2 = new Runnable() {

                    public void run() {
                        // TODO Auto-generated method stub
                        OUT_message = "Android: " + OUT_message;
                        add_chuoi(OUT_message);

                    }
                };

                public void run() {
                    // TODO Auto-generated method stub

                    PrintWriter out;
                    try {
                        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())), true);
                        out.println(OUT_message);
                        out.flush();

                        handler.post(updateUI2);

                        out.close();


                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }).start();

           Thread C_thread = new Thread(new ClientThread());
            C_thread.start();
}
    });

    connect.setVisibility(1);
    connect.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            // TODO Auto-generated method stub
            connect.setVisibility(v.GONE);
            Thread C_thread = new Thread(new ClientThread());
            C_thread.start();
        }
    });

}
        public class ClientThread implements Runnable {

    final Handler handler = new Handler();

    final Runnable updateUI = new Runnable() {

        public void run() {
            // TODO Auto-generated method stub
            txt.setText(IN_message);
            IN_message = "Server: " + IN_message;
            add_chuoi(IN_message);
        }
    };

    public void run() {
        // TODO Auto-generated method stub

        try {

            IP = ipserver.getText().toString();
            serverAddr = InetAddress.getByName(IP);
            state_connnect = true;

            Scanner in;

            while (state_connnect) {

                s = new Socket(serverAddr, 4444);

                in = new Scanner(s.getInputStream());
                IN_message = in.nextLine();


                handler.post(updateUI);

                in.close();
                s.close();

            }

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
public void add_chuoi(String chuoi) {
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, array_operator);
    array_operator.add(chuoi);
    hienthi_lv_tab2.setAdapter(adapter);
    adapter.notifyDataSetChanged();
}

}

這是我在C#上的代碼:

private void Form1_Load(object sender, EventArgs e)
    {
        CheckForIllegalCrossThreadCalls = false;
        String hostname = "";
        System.Net.IPHostEntry ip = new IPHostEntry();
        hostname = System.Net.Dns.GetHostName();
        ip = System.Net.Dns.GetHostByName(hostname);

        lblhostname.Text = "Tên Server : " + ip.HostName;
        foreach (System.Net.IPAddress listip in ip.AddressList)
        {
            lblip.Text ="Địa Chỉ IP Server : "+listip.ToString();

            IPAddress ipAd = IPAddress.Parse(listip.ToString());
            myList = new TcpListener(ipAd, 4444);
            myList.Start();
        }
    }

    void connect()
    {
        txt_show.Text="Waitting for connect from android...";
        while (true)
        {
            server_socket = myList.AcceptSocket();


            byte[] data_rec = new byte[1024];
            int k = server_socket.Receive(data_rec);


                char cc;
                String mes = null;
                for (int i = 0; i < k - 1; i++)
                {
                    cc = Convert.ToChar(data_rec[i]);
                    mes += cc.ToString();
                }
                if (mes != null)
                {
                    string_rec = mes.ToString();
                    txt_show.Text += Environment.NewLine + "Android: " + mes;
                }
        }
    }

    private void btn_send_Click(object sender, EventArgs e)
    {


        String data_send = txt_send.Text;
        ASCIIEncoding asen = new ASCIIEncoding();
        server_socket.Send(asen.GetBytes(data_send));
        txt_show.Text += Environment.NewLine + "Server : " + txt_send.Text;
        txt_send.Text = "";
    }

    private void button1_Click(object sender, EventArgs e)
    {
        S_thread = new Thread(connect);
        S_thread.Start();
    }

這是logcat:

FATAL EXCEPTION:Thread-10 java.util.NoSuchElementException 
at java.util.Scanner.nextLine(Scanner.java:1417) 
at iNET.Android.Thread_TCP.ThreadActivity$ClientThread.run(ThreadActivity.java:207) 
at java.lang.Thread.run(Thread.java:1019) 

謝謝大家!

不能完全確定,但是我想您正在Mobile和PC中使用不同的專用網絡。 這就是為什么您可以在使用模擬器時發送數據的原因(因為兩者均在pc中),但無法使用移動設備發送。

發表您的評論后,我認為您的電腦位於專用網絡中。 因此,您無法使用輸入的ip從android應用程序發送消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM