Estoy haciendo un programa en 2 partes.Socket - Java Client, C# Server
Parte 1: C-server-socket Aplicación que se ejecuta en PC, escucha los comandos y actúa en consecuencia.
Parte 2: aplicación de socket de cliente de Java que se ejecuta en el teléfono, que envía un comando a la PC, cuando se presiona un botón.
Actualmente, puedo enviar comandos desde el cliente al servidor, y todo está bien. Pero mi problema es este: cuando envío un comando específico al servidor, quiero que el servidor responda al cliente y el cliente lo lea.
Lo único es que, cuando el cliente intenta leer, se agota el tiempo de espera.
programa Java cliente:
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());
}
}
}
esto se le llama con:
Thread cThread = new Thread(new ClientThread());
cThread.start();
y utiliza la variable global "Comando", que contendrá información diferente, dependiendo de qué botón se ha pulsado.
El programa falla en la línea "String answer = in.readline();" con la excepción "java.net.SocketTimeoutException".
Esta es la parte C# servidor del programa:
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();
}
Llamado con lo siguiente, en el Form1()
this.tcpListener = new TcpListener(IPAddress.Any, 4532);
this.listenThread = new Thread(new ThreadStart(ListenForClients));
this.listenThread.Start();
El C# servidor parece funcionar bien, y sí muestra la messagebox "programa cliente pedido respuesta"
¿Alguien que puede detectar el error?
¿Tiene algún problema con que el cliente no parezca recibir una respuesta del servidor? SocketTimeoutException se lanza cuando el socket no recibe respuesta dentro del tiempo de espera dado, 5 segundos en su ejemplo. ¿Estás seguro de que el servidor está enviando la respuesta? – Kerry
Bueno, no estoy 100% seguro, pero el 99% # Programa C: si (Entrada == "CMD: getOptions ") { byte [] buffer = encoder.GetBytes (" CMD: Aceptado"); clientStream.Write (buffer, 0, buffer.Length); clientStream.Flush(); MessageBox.Show ("Oh, quería opciones de zeh"); } Esto se ejecuta después de recibir un mensaje. También muestra el messageBox al final, así que estoy bastante seguro de que envía la respuesta –
user1285334