【问题标题】:C# (ASP.NET) to android communication via SocketsC# (ASP.NET) 通过 Sockets 与 android 通信
【发布时间】:2017-05-09 15:19:04
【问题描述】:

我已经研究这个问题有一段时间了。我有基本概念,现在尝试实现 ASP.NET 和 android 之间的套接字通信。 我正在使用基本的窗口System.Net.Sockets 来解决这个问题。当我尝试逐行调试我的应用程序时,我得到了一个连接,这告诉我我的服务器正在工作,但问题是 C# 行卡在sender.Receive(bytes)

这是我用于 TCPServer 的 android 端服务器代码

public class TCPServer extends Thread {
    public static final int SERVER_PORT = 11000;
    private boolean running = false;
    private PrintWriter mOut;
    private OnMessageReceived messageListener;


    public TCPServer(OnMessageReceived messageListener)
    {
        this.messageListener = messageListener;
    }

    public void sendMessage(String message)
    {
        if(mOut != null && !mOut.checkError())
        {
            mOut.println(message);
            mOut.flush();
        }
    }

    @Override
    public void run()
    {
        super.run();
        running=true;
        try {
            ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
            Socket client = serverSocket.accept();
            try {
                //sends the message to the client
                mOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);

                //read the message received from client
                BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));

                //in this while we wait to receive messages from client (it's an infinite loop)
                //this while it's like a listener for messages
                while (running) {
                    String message = in.readLine();

                    if (message != null && messageListener != null) {

                        messageListener.messageReceived(message);
                        sendMessage("OK Message is received here");
                        //the line above and below is also not helping me with my problem
                        mOut.println("OK: FROM ACOM");
                    }
                }
            }
            catch (Exception e)
            {
                e.getMessage();
            }
            finally {
                client.close();
            }
        }
        catch (Exception e)
        {
            e.getMessage();
        }
    }

    public interface OnMessageReceived {
        public void messageReceived(String message);
    }
}

这就是我从我的主要活动中调用它的方式,目前使用一个简单的按钮来启动服务器以像这样进行监听

btnStartServer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context,"Starting the server",Toast.LENGTH_LONG).show();
               TCPServer tcpServer = new TCPServer(new TCPServer.OnMessageReceived() {
                   @Override
                   public void messageReceived(String message) {
                      txtMessageReceived.setText(message);
                   }
               });
                tcpServer.start();

            }
        });

现在至于 C# 或 ASP.NET,我刚刚在 webforms 页面上添加了一个简单的按钮来进行测试,这就是它的代码

        IPAddress ipAddress;
        IPEndPoint remoteEP;
        Socket sender;
        byte[] bytes;
  private void setUpSockets()
        {
            bytes = new byte[1024];
            try
            {
                ipAddress = IPAddress.Parse("192.168.0.102");
                remoteEP = new IPEndPoint(ipAddress, 11000);
                sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                try
                {
                    sender.Connect(remoteEP);
                    byte[] msg = Encoding.ASCII.GetBytes("This is some Test <EOF>");
                    int byteSent = sender.Send(msg);
                    int byteRec = sender.Receive(bytes);
                    string messageRec = Encoding.ASCII.GetString(bytes, 0, byteRec);

                    sender.Shutdown(SocketShutdown.Both);
                    sender.Close();
                }
                catch (Exception e)
                {
                    string exception = e.Message;
                }
            }
            catch (Exception m)
            {
                string exception = m.Message;
            }
        }
  protected void Button1_Click(object sender, EventArgs e)
        {
            setUpSockets();
        }

现在我只是在将它添加到有意义的东西之前对其进行测试,但我被困在int byteRec = sender.Receive(bytes); 上,我不确定我应该怎么做,因为正如你所看到的,我也在尝试从 android 客户端发送一些响应。就像它卡在这条线上等待它永远不会收到的响应,而且 android 端的文本框也没有更新收到的任何内容。

【问题讨论】:

    标签: c# android asp.net sockets


    【解决方案1】:

    我一直在尝试找出正确的方法来做到这一点,但问题是我需要确定两种语言的编码,并确保在接收数据之前接收到任一端的字节。 This 问题很有帮助,我能够使代码工作

    进行了以下更改并且有效

    C#端

     bytes = new byte[1024];
                try
                {
                    ipAddress = IPAddress.Parse("192.168.0.128");
                    remoteEP = new IPEndPoint(ipAddress, 11000);
                    sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    try
                    {
                        string toSend = TextBox1.Text;
    
                        sender.Connect(remoteEP);
                        //sending
                        int toSendLen = System.Text.Encoding.ASCII.GetByteCount(toSend);
                        byte[] toSendBytes = System.Text.Encoding.ASCII.GetBytes(toSend);
                        byte[] toSendLenBytes = System.BitConverter.GetBytes(toSendLen);
                        //Console.WriteLine("Soccket connected to{0}", sender.RemoteEndPoint.ToString());
                        sender.Send(toSendLenBytes);
                        sender.Send(toSendBytes);
    
                        //Receiving
    
                        byte[] rcvLenBytes = new byte[4];
                        sender.Receive(rcvLenBytes);
                        int rcvLen = System.BitConverter.ToInt32(rcvLenBytes, 0);
                        byte[] rcvBytes = new byte[rcvLen];
                        sender.Receive(rcvBytes);
                        String rcv = System.Text.Encoding.ASCII.GetString(rcvBytes);
                        TextBox1.Text = rcv;
    
    
                        //----------------OLD----------------------------
                        //  byte[] msg = Encoding.ASCII.GetBytes("This is some Test.");
                        //  TextBox1.Text = msg.ToString();
                        //  int byteSent = sender.Send(msg);
                        //  TextBox1.Text += "Bytes Sent = " + byteSent;
    
                        ////  System.Threading.Tasks.Task.Delay(1000).Wait();
                        //  int byteRec = sender.Receive(bytes);
                        //  string messageRec = Encoding.ASCII.GetString(bytes, 0, byteRec);
                        //  Console.WriteLine("Response from remote Device {0}", messageRec);
                        //  TextBox1.Text += "\nmessageRec = " + messageRec;
                        sender.Shutdown(SocketShutdown.Both);
                        sender.Close();
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                }
                catch (Exception m)
                {
                    Console.WriteLine(m.Message);
                }
    

    安卓端

            ServerSocket serverSocket = new ServerSocket(11000, 10);
            Socket socket = serverSocket.accept();
            InputStream is = socket.getInputStream();
            OutputStream os = socket.getOutputStream();
    
            // Receiving
            byte[] lenBytes = new byte[4];
            is.read(lenBytes, 0, 4);
            int len = (((lenBytes[3] & 0xff) << 24) | ((lenBytes[2] & 0xff) << 16) |
                      ((lenBytes[1] & 0xff) << 8) | (lenBytes[0] & 0xff));
            byte[] receivedBytes = new byte[len];
            is.read(receivedBytes, 0, len);
            String received = new String(receivedBytes, 0, len); 
            // Sending
            String toSend = "Echo: " + received;
            byte[] toSendBytes = toSend.getBytes();
            int toSendLen = toSendBytes.length;
            byte[] toSendLenBytes = new byte[4];
            toSendLenBytes[0] = (byte)(toSendLen & 0xff);
            toSendLenBytes[1] = (byte)((toSendLen >> 8) & 0xff);
            toSendLenBytes[2] = (byte)((toSendLen >> 16) & 0xff);
            toSendLenBytes[3] = (byte)((toSendLen >> 24) & 0xff);
            os.write(toSendLenBytes);
            os.write(toSendBytes);
    
            socket.close();
            serverSocket.close();
    

    上面提到的android代码在方法run的TCPServer类中更新了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2014-07-24
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 2015-03-15
      相关资源
      最近更新 更多