Это не дубликат. Ответ на этот сайт не отвечает или решает мою проблему.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.
Хотелось бы помочь мне подтолкнуть меня в правильном направлении.
Также я поинтересовался разработчиками, если ответ имеет прерывание строки. Это не так, и, похоже, они согласны с кодом, поскольку он служил там цели на протяжении многих лет. Поэтому я должен найти это.
Если вам нужно, чтобы предоставить дополнительную информацию, просто спросите.
Если я не ошибаюсь, вам понадобится 'while (true)' и бесконечно слушать InputStream. Поэтому всякий раз, когда вы получаете некоторую информацию, он будет автоматически прочитан. –
Спасибо за ваш вклад. Я попробую –
Посмотрите [это.] (Http://stackoverflow.com/questions/12592707/android-socket-inputstream-read-followed-by-an-epipe) –