TCP:如何从Android客户端的Vb.net服务器获得响应?

时间:2015-03-09 18:08:38

标签: java android vb.net tcp tcpclient

这不是一个可能的重复。本网站上没有任何答案可以充分回答或解决我的问题。

我正在尝试通过TCP套接字连接到VB.NET服务器并在Android应用程序中获取响应。响应始终为null作为字符串或-1作为字节。

我必须连接并获得多个平台的响应,但目前我只想专注于Android应用。也许如果我弄明白的话,向前推进到其他平台会更容易。

我无权编辑VB.NET live服务器中的任何代码。系统已经相当陈旧,直到现在才向其他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 Dummy服务器项目的类,开发人员已经发送给我看看如何以代码方式设置实时服务器。我可以看到它将字符串作为unicode但我对VB不知道我的Java代码出错了。

当我打开项目并在localhost上启动服务器时,无论如何我无法从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服务器获得响应。

希望能帮助我朝着正确的方向前进。

此外,我向开发人员询问响应是否有换行符。它没有,而且看起来他们似乎愿意混淆代码,因为它服务了很多年的目的。所以我必须找到它。

如果您需要我提供更多信息,请询问。

1 个答案:

答案 0 :(得分:0)

要从Java发送到VB.NET服务器,您必须将字符串作为单字节字节发送。首先发送字节长度,然后发送主数据并刷新。您必须确切地知道服务器期望的内容,以便相应地格式化和编码数据以准备发送它。

在调试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;

    }
}