2017-05-06 12 views
1

私は今この問題をしばらく見てきました。私は基本的な考え方を持っていて、今はASP.NETとAndroidの間のソケット通信を実装しようとしています。 私は基本的なウィンドウSystem.Net.Socketsを使用してこれを解決しています。私は私のサーバが動作していることを伝える行ごとにアプリケーションをデバッグしようとしているが、C#の行がsender.Receive(bytes)になっているという問題がある。C#(ASP.NET)からソケット経由のアンドロイド通信へ

これはこれは私が現在、この

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

      } 
     }); 

のように待機するようにサーバーを開始するための簡単なボタンを使用して、私の主な活動からそれを呼び出す方法ですTCPServerの

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

のための私のアンドロイド側サーバコードですさて、C#またはASP.NETの場合は、Webフォームページにシンプルなボタンを追加してテストしました。これはそのコードです。

 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);に固執しています。私はあなたが見ることができるので、私はアンドロイドクライアントからの応答も送信しようとしているからです。それは、それがアンドロイド側のテキストボックスが受信されたものを更新することはありませんまた、それを受信しない応答を待ってこの行に立ち往生のようです。

答えて

0

私はこれを行う正しい方法を見つけようとしていましたが、両方の言語のエンコーディングを確認し、データを受け取る前に両側のバイトを確実に受け取る必要があるという問題がありました。 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(); 

を働きました上記のアンドロイドコードは、メソッド実行時にTCPServerクラスで更新されました。

関連する問題