2015-03-09 4 views
1

Это не дубликат. Ответ на этот сайт не отвечает или решает мою проблему.TCP: Как получить ответ от сервера Vb.net в Android Client?

Я пытаюсь подключиться к серверу VB.NET через TCP-сокет и получить ответ в приложении Android. Ответ всегда равен null как строка или -1 как байты.

Мне нужно подключиться и получить ответ для нескольких платформ, но на данный момент я просто хочу сосредоточиться на приложении для Android. Возможно, если я это выясню, будет легче продвигаться к другим платформам.

У меня нет доступа для редактирования любого кода на реальном сервере VB.NET. Там система довольно старая и до сих пор отправляет ответы другим клиентам Windows.

Вот мой Android-клиент. Он находится в фоновой задаче, которая вызывается из mainActivity. Нижеследующая командная строка должна возвращать координаты в форме строки с сервера. Ничего не возвращается.

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintStream; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class Client { 


    public static void sendMessage() throws IOException, InterruptedException { 

     Socket socket = null; 
     String host = ""; 
     int port = ; 
     PrintStream stream = null; 
     String command=""; 

     try { 
      Socket s = new Socket(host,port); 
      System.out.println("Socket created"); 

      //outgoing stream redirect to socket 
      OutputStream out = s.getOutputStream(); 

      PrintWriter output = new PrintWriter(out); 
      output.println(command); 
      output.flush(); 
      System.out.println("command sent"); 
      BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 

      //read line(s) 
      System.out.println("Getting response:"); 
      String st = input.readLine(); 
      System.out.println("Response : " + st); 
      //Close connection 
      s.close(); 
     } 

     catch (UnknownHostException e) { 
      System.out.println("Don't know about host : " + host); 
      e.printStackTrace(); 
      System.exit(1); 
     } 

     catch (IOException e) { 
      System.out.println("Couldn't get I/O for the connection to : " + host); 
      e.printStackTrace(); 
      System.exit(1); 
     } 

    } 
} 

Разработчик также прислал мне тестовый клиент в VB, который соединяет, посылает обеспечение и получает без проблем

Вот класс VB: NET пустышки серверного проекта разработчик послал меня, чтобы увидеть, как живой сервер настроен по коду. Я вижу, что он получает строку как unicode, но я не уверен, что VB знает, где мой код Java идет не так.

Когда я открываю проект и запускаю сервер на локальном хосте, я все равно не могу подключиться к нему из java-клиента. Затем я написал еще один клиент на PHP, такую ​​же проблему, соединение установлено, но нет ответа. Я загрузил программное обеспечение тестера сокетов, но он также может подключаться, но не получает ответа.

Option Explicit On 
Imports System 
Imports System.Net 
Imports System.Net.Sockets 
Imports System.Text 
Imports Microsoft.VisualBasic 

Imports System.Net.Dns 
Imports System.Text.UnicodeEncoding 
Imports System.Threading 
Imports System.Data.SqlClient 



Public Enum glenConnectionType 
    ConstantConnection = 1 
    ConnectOnDemand = 2 
    AsyncConnection = 3 
End Enum 

Public Class clsDynaListner 
    Public tcpServer As Socket 
    Public tcpClient As Socket 
    Public tcpPort As Integer 
    Public tcpBilnr As Integer ' was shared SHOULD PROB BE INITIALISED TO 0 
    Public ThreadClient As Thread 
    Public LastKontakt As Date = Nothing 
    Public ConActive As Boolean = False 
    Private tcpClientEndPoint As System.Net.IPEndPoint 
    Private bCommandLength(15), bReplyLength(15) As Byte 
    Private iCommandLength, iReplyLength As Integer 
    Private sReplyLength As String 
    Private sCommand, sReply As String 
    Private theCommandBytes() As Byte 
    Private theReplyBytes() As Byte 
    Private Const AsyncMaxBytes As Integer = 600000 '1024 
    Public Shared AsyncData As String = Nothing 

    Public Sub New(ByVal currentTCPPort As Integer, ByVal theConnectionType As glenConnectionType) 
     tcpPort = currentTCPPort 
     tcpClientEndPoint = New System.Net.IPEndPoint(System.Net.IPAddress.Any, tcpPort) 

     'Select Case theConnectionType 
     ' Case glenConnectionType.ConstantConnection 
     '  ThreadClient = New Threading.Thread(AddressOf ListenForConstantConnection) 
     ' Case glenConnectionType.ConnectOnDemand 

     ThreadClient = New Threading.Thread(AddressOf ListenForConnectOnDemand) 

     ' Case glenConnectionType.AsyncConnection 
     'ThreadClient = New Threading.Thread(AddressOf ListenForAsyncConnection) 
     'End Select 

     ThreadClient.Start() 
    End Sub 


Private Sub ListenForConnectOnDemand() 
     While (True) 
      Try 
       tcpServer = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) 
       tcpServer.SendBufferSize = TCP_BUFFER_SIZE 
       tcpServer.ReceiveBufferSize = TCP_BUFFER_SIZE 
       tcpServer.Blocking = True 
       tcpServer.Bind(tcpClientEndPoint) 
       tcpServer.Listen(0) 
       tcpClient = tcpServer.Accept 

       tcpClient.SendBufferSize = TCP_BUFFER_SIZE 
       tcpClient.ReceiveBufferSize = TCP_BUFFER_SIZE 

       ' Find out how big the command is going to be 
       tcpClient.Receive(bCommandLength) 
       iCommandLength = CType(Unicode.GetString(bCommandLength), Integer) 

       ' Bring that command to daddy 
       Array.Resize(theCommandBytes, iCommandLength + 1) 
       tcpClient.Receive(theCommandBytes) 
       sCommand = Unicode.GetString(theCommandBytes) 
       gInMessage = sCommand 

       ' Get the reply 
       sReply = "Response:" 
       gOutMessage = sReply 

       ' Inform the controller of the length of the reply transmission 
       iReplyLength = (sReply.Length * 2) - 1 
       sReplyLength = iReplyLength.ToString.PadLeft(8, "0") 
       bReplyLength = Unicode.GetBytes(sReplyLength) 
       tcpClient.Send(bReplyLength) 

       ' Send the reply data 
       Array.Resize(theReplyBytes, iReplyLength + 1) 
       theReplyBytes = Unicode.GetBytes(sReply) 
       tcpClient.Send(theReplyBytes) 

       Array.Clear(theCommandBytes, 0, theCommandBytes.Length) 
       Array.Clear(theReplyBytes, 0, theReplyBytes.Length) 

       tcpClient.Close() 
       tcpServer.Close() 
       tcpClient = Nothing 
       tcpServer = Nothing 

      Catch ex1 As Exception 
       Try 
        tcpClient.Close() 
        tcpServer.Close() 
        tcpClient = Nothing 
        tcpServer = Nothing 
        ' ErrMessage = "LisForContr :" & tcpPort.ToString & ex1.Message 
       Catch 
       End Try 
      End Try 
     End While 

    End Sub 

    Protected Overrides Sub Finalize() 
     Try 
      tcpServer.Close() 
      ThreadClient.Abort() 
     Catch 
     End Try 

     MyBase.Finalize() 
    End Sub 

End Class 

Я работаю с этим некоторое время. Приложения, которые я создал, являются завершенными для PHP Web App, Android Native и iPhone Native. Проблема только в получении ответа от сервера VB.

Хотелось бы помочь мне подтолкнуть меня в правильном направлении.

Также я поинтересовался разработчиками, если ответ имеет прерывание строки. Это не так, и, похоже, они согласны с кодом, поскольку он служил там цели на протяжении многих лет. Поэтому я должен найти это.

Если вам нужно, чтобы предоставить дополнительную информацию, просто спросите.

+0

Если я не ошибаюсь, вам понадобится 'while (true)' и бесконечно слушать InputStream. Поэтому всякий раз, когда вы получаете некоторую информацию, он будет автоматически прочитан. –

+0

Спасибо за ваш вклад. Я попробую –

+0

Посмотрите [это.] (Http://stackoverflow.com/questions/12592707/android-socket-inputstream-read-followed-by-an-epipe) –

ответ

0

Чтобы отправить сервер VB.NET с Java, вы должны отправить строку как unicoded байты. Отправьте длину в байтах, чтобы ожидать сначала, а затем отправьте первичные данные и выполните флеш. Вы должны точно знать, что ожидает сервер, чтобы форматировать и кодировать данные соответственно при подготовке к отправке.

Я смог успешно исправить свою проблему после отладки клиента и сервера VB. Этот клиент будет обрабатывать массивы байтов, потоковые расширенные команды sql и получать ответ. Обновление будет получать данные таблицы xml. Любой, кто хочет указать, как сделать этого клиента лучше. Добро пожаловать.

Обновлен мой клиент java следующим образом.

/** 
* MR-TCP Java & VB.NET DataExchange Client 0.95 - Maze Runner 2015 
*/ 

import java.io.ByteArrayOutputStream; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.Socket; 

public class Client { 

    public static String sendCommand(String commandString, Boolean IsID) throws IOException, InterruptedException { 

     String host; 
    int port; 
    String command; 
    byte[] commandBytes; 
    String commandLength; 
    byte[] cmdLengthBytes; 
    Socket s; 
    DataOutputStream stream; 
    String dataString = ""; 

    host = ""; // 
    port = 0; // 

    command = commandString; 
    commandBytes = command.getBytes("UTF-16LE"); // returns byte[18] 

    if(IsID){ 
     commandLength = "00000021"; 
     cmdLengthBytes = commandLength.getBytes("UTF-16LE"); 
    } else { 
     String iCommandLength = command; // Get the command length 
     cmdLengthBytes = iCommandLength.getBytes("UTF-16LE"); 
     int commandNewLength = cmdLengthBytes.length-1; 
     String newLength = "0000" + String.valueOf(commandNewLength); 
     cmdLengthBytes = newLength.getBytes("UTF-16LE"); 

    } 

    try { 
     s = new Socket(host, port); // Connect to server 

     //Send the command to the server 
     stream = new DataOutputStream(s.getOutputStream()); // get ready to send 

     stream.write(cmdLengthBytes); // tell the server how many bytes to expect 

     System.out.println("Command length sent"); 

     stream.write(commandBytes); // Send the command to papa... 

     stream.flush(); // guaranteed sending 

     System.out.println("Command sent"); 

     //Receive the command from the server. 
     DataInputStream is = new DataInputStream(s.getInputStream()); // get ready to receive 

     ByteArrayOutputStream buffer = new ByteArrayOutputStream(); // prepare to get array 

     int nRead; 
     byte[] data = new byte[1024]; 

     while ((nRead = is.read(data, 0, data.length)) != -1) { // read the array byte by byte 
      buffer.write(data, 0, nRead); 
     } 

     byte[] dataBytes = buffer.toByteArray(); // get complete array 

     dataString = buffer.toString("UTF-16LE").substring(8); // get rid of the array length and convert to string 


     stream.close(); // close the dataStream 

     s.close(); // close the connection 

     System.out.println("Disconnected"); 

    } catch (IOException e){ 
     e.printStackTrace(); 
    } 

    System.out.println("Function Complete"); 

    System.out.println("Server response:" + dataString); 


    return dataString; 

    } 
} 
+0

Хорошо. Отлично сработано. Я только видел ваш ответ сегодня. Он очень похож на то, что я пытался. Ты взял сервер, я видел. Хорошо, я могу это понять. – greenapps

+0

Я сделал огромный путь в своем приложении. Я также добился успеха в своем веб-приложении PHP, используя те же принципы, что и в моем ответе. Теперь я могу также анализировать XML-данные через оба приложения. Спасибо за поддержку. –

Смежные вопросы