2017-05-06 4 views
1

Ich habe seit einiger Zeit in dieser Angelegenheit untersucht. Ich habe das Grundkonzept und versuche jetzt, die Socket-Kommunikation zwischen ASP.NET und Android zu implementieren. Ich benutze die grundlegenden Windows System.Net.Sockets, um dies auszuarbeiten. Ich bekomme eine Verbindung, während ich versuche, meine Anwendung Zeile für Zeile zu debuggen, die sagt, dass mein Server funktioniert, aber das Problem ist, dass die C# -Leitung bei sender.Receive(bytes) stecken bleibt.C# (ASP.NET) zu Android-Kommunikation über Sockets

Das ist mein android Seite Server-Code für 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); 
    } 
} 

Dies ist, wie ich es von meiner Haupttätigkeit nennen derzeit eine einfache Schaltfläche mit dem Server zu initiieren, wie dies

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

      } 
     }); 

hören Jetzt für die C# oder ASP.NET Ich habe gerade eine einfache Schaltfläche auf Webforms Seite hinzugefügt, um Dinge zu testen, und das ist der Code dafür

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

Jetzt teste ich es erst, bevor ich es zu etwas sinnvollem hinzufüge, aber ich stecke fest in diesem int byteRec = sender.Receive(bytes); und ich bin mir nicht sicher, was ich tun soll, denn wie Sie sehen können, versuche ich auch eine Antwort vom Android-Client zu senden. Es ist so, als würde es bei dieser Zeile hängenbleiben und auf eine Antwort warten, die es nie empfängt. Außerdem wird das Textfeld auf der Android-Seite nicht aktualisiert.

Antwort

0

Ich habe versucht, den richtigen Weg, dies zu tun, aber das Problem war, dass ich sicher sein musste, die Codierung beider Sprachen und sicher sein, die Bytes auf beiden Seiten vor dem Empfangen der Daten zu erhalten. This Frage war sehr hilfreich und ich war in der Lage, den Code Arbeit

Folgende Änderungen wurden vorgenommen, zu machen und es funktionierte

C# Seite

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

Android Side

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

Der oben genannte Android-Code wurde in der TCPServer-Klasse im Methodenablauf aktualisiert.