2012-06-22 2 views
6

Я делаю программу в 2 частях.Socket - Java Client, C# Server

Часть 1: Сервер-сокет C# Приложение, выполняющееся на ПК, прослушивание команд и выполнение соответствующих действий.

Часть 2: приложение клиентского сокета Java, работающее на телефоне, которое отправляет команду компьютеру при нажатии кнопки.

В настоящее время я могу отправлять команды от клиента на сервер, и все это хорошо. Но моя проблема заключается в следующем: когда я отправляю на сервер определенную команду, я хочу, чтобы сервер ответил клиенту, и клиент прочитал этот ответ.

Вещь просто есть, когда клиент пытается прочитать, это тайм-ауты.

программа Java-клиент:

class ClientThread implements Runnable 
{ 
    public void run() 
    { 
     try 
     { 
      Socket socket = new Socket(serverIpAddress, serverPort); 
      socket.setSoTimeout(5000); 

      while (true) 
      { 
       try 
       { 
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
        Log.d("Nicklas", "Out it goes"); 
        out.println(Command); 

        if (Command == "CMD:GetOptions<EOF>") 
        { 
         Log.d("Nicklas", "Getting options"); 
         try 
         { 
          Log.d("Nicklas", "Line 1"); 
          BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
          Log.d("Nicklas", "Line 2"); 
          String answer = in.readLine(); 
          Log.d("Nicklas", "answer = " + answer); 
         } 
         catch (Exception ee) 
         { 
          Log.d("Nicklasasasas", ee.toString()); 
         } 
        } 
        break; 

       } 

       catch (Exception e) 
       { 
        Log.d("Nicklas", "CAE = " + e.toString()); 
        break; 

       } 
      } 
      socket.close(); 
     } 
     catch (ConnectException ee) 
     { 
      Log.d("Nicklas", "Kunne ikke forbinde"); 

     } 
     catch (Exception e) 
     { 
      Log.d("Nicklasssssss", e.toString()); 
     } 
    } 
} 

Это называется с:

Thread cThread = new Thread(new ClientThread()); 
     cThread.start(); 

И использует глобальную переменную "Command", который будет содержать различную информацию, в зависимости от того, что кнопка была нажата.

Программа выходит из строя на линии «Строковый ответ = in.readline();» за исключением «java.net.SocketTimeoutException».

Это часть C# Сервер программы:

private void ListenForClients() 
    { 
     this.tcpListener.Start(); 

     while (true) 
     { 
      //blocks until a client has connected to the server 
      TcpClient client = this.tcpListener.AcceptTcpClient(); 

      //create a thread to handle communication 
      //with connected client 
      Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); 
      clientThread.Start(client); 
     } 
    } 

    private void HandleClientComm(object client) 
    { 
     TcpClient tcpClient = (TcpClient)client; 
     NetworkStream clientStream = tcpClient.GetStream(); 

     byte[] message = new byte[4096]; 
     int bytesRead; 

     while (true) 
     { 
      bytesRead = 0; 

      try 
      { 
       //blocks until a client sends a message 
       bytesRead = clientStream.Read(message, 0, 4096); 
      } 
      catch 
      { 
       //a socket error has occured 
       break; 
      } 

      if (bytesRead == 0) 
      { 
       //the client has disconnected from the server 
       break; 
      } 

      //message has successfully been received 
      ASCIIEncoding encoder = new ASCIIEncoding(); 
      //System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead)); 
      string Input = (encoder.GetString(message, 0, bytesRead)); 
      Input = Input.Trim(); 
      object[] obj = new object[1]; 
      obj[0] = Input; 
      if (Input == "CMD:GetOptions<EOF>") 
      { 
       try 
       { 
        byte[] buffer = encoder.GetBytes("CMD:Accepted"); 
        clientStream.Write(buffer, 0, buffer.Length); 
        clientStream.Flush(); 
        MessageBox.Show("Client program asked for reply"); 
       } 
       catch (Exception e) 
       { 
        MessageBox.Show("Oh it no work!: " + e.ToString()); 
       } 
      } 
      else 
      { 
       Udfor(Input); 
      } 


     } 

     tcpClient.Close(); 
    } 

Вызывается со следующим, в Form1()

this.tcpListener = new TcpListener(IPAddress.Any, 4532); 
this.listenThread = new Thread(new ThreadStart(ListenForClients)); 
this.listenThread.Start(); 

C# Сервер кажется, работает хорошо, и делает показать messagebox "клиентская программа запросила ответ"

Любой, кто может обнаружить ошибку?

+0

Не проблема, что клиент не получил ответ от сервера? SocketTimeoutException генерируется, когда сокет не получает ответа в течение заданного тайм-аута, в вашем примере - 5 секунд. Вы уверены, что сервер отправляет ответ? – Kerry

+0

Ну, им не уверен на 100%, но 99% программа C#: , если (входные == "CMD: GetOptions ") { байт [] буфера = encoder.GetBytes (" CMD: Принятое"); clientStream.Write (буфер, 0, buffer.Length); clientStream.Flush(); MessageBox.Show («О, он хотел zeh options»); } Это выполняется после получения сообщения. В конце он также показывает messageBox, поэтому я уверен, что он отправляет ответ – user1285334

ответ

1

Я понял! Проблема была в C#. Когда сервер отправил обратно команду «CMD: Accepted», он никогда не закрывал сокет, поэтому приложение Android не имело представления о том, было ли это прочитано! Закрытие гнезда сразу после промывки +, конечно, не закрывая его снова, если я уже это сделал, сделал трюк!