Me estoy poniendo un «Socket Error de Escritura». Mientras que el escultismo alrededor en StackOverflow he encontrado algunas sugerencias para el uso de flush(); método de envío de bytes a través de la corriente. El problema que estoy teniendo es que después de usar el flush(); el método, me sigue apareciendo el error. No estoy seguro de lo que está causando el problema. Alguna idea? Este es el código de cliente:

import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.Scanner;
public class TCPClient {
public static void main(String[] args) throws Exception {
String origSentence;
String modifiedSentence;
boolean win = false;
boolean lose = false;
//BufferedReader inFromUser;
//inFromUser = new BufferedReader(new InputStreamReader(System.in));
Scanner inFromUser = new Scanner(System.in);
Socket clientSocket = new Socket("10.64.121.145", 6784);
boolean first = true;
DataOutputStream outToServer =
new DataOutputStream(clientSocket.getOutputStream());
origSentence = inFromUser.nextLine();
outToServer.writeBytes(origSentence + '\n');
outToServer.flush();
Scanner inFromServer = new Scanner(clientSocket.getInputStream());
modifiedSentence = inFromServer.nextLine();
GUI gui = new GUI(Integer.parseInt(modifiedSentence));
System.out.println("The word is " + modifiedSentence + " letters long. Pick a letter!");
gui.isNotSolved();
while (win != true && lose != true) {
origSentence = inFromUser.nextLine();
System.out.println(origSentence);
outToServer.writeBytes(origSentence + '\n'); //The failure is on this line
outToServer.flush();
modifiedSentence = inFromServer.nextLine();
if (modifiedSentence.equals(""))//guess not in word so add a miss
{
if (gui.addMiss(origSentence) == false) {
lose = true;
}
}
if (!modifiedSentence.equals(""))//guess is in word so display where letter occurs
{
ArrayList<Character> list = new ArrayList<Character>();
int length = modifiedSentence.length();
for (int i = 0; i < length; i++) {
list.add(modifiedSentence.charAt(i));
}
for (char c : list) {
if (c == ' ') {
list.remove(c);
}
}
for (int i = 0; i < list.size(); i++) {
String s = list.get(i).toString();
gui.addLetter(origSentence.charAt(0), Integer.parseInt(s));
}
}
if (gui.isNotSolved() == false)//game won send server "won" message to terminate connection
{
String won = "won";
outToServer.writeBytes(won);
outToServer.flush();
}
if (lose == true)//game lost send server "lost" message to
{            //have server send the word to display for player
String lost = "lost";
outToServer.writeBytes(lost);
gui.setWord(modifiedSentence);
outToServer.flush();
}
}
clientSocket.close();
}
}

… el código continúa, pero no parece hacer que el resto del código de todos modos. Estoy un poco perdido en cuanto a por qué se mantiene en su defecto. Yo flush() después del primer uso de outToServer pero en el segundo uso se produce un error. Supongo que se trata de un Cliente del lado del problema. Alguna ayuda? Gracias. Aquí está el Código del Servidor:

import java.io.*;
import java.net.*;
import java.util.Scanner;
public class TCPServer {
public static void main(String[] args) throws Exception {
String clientSentence;
Word word = new Word();
int wordLen = word.getLength();
ServerSocket welcomeSocket = new ServerSocket(6784);
System.out.println(InetAddress.getLocalHost());
boolean begin = true;
while (true) {
Socket connSocket = welcomeSocket.accept();
Scanner inFromClient = new Scanner(connSocket.getInputStream());
clientSentence = inFromClient.nextLine(); //cap would go after this
DataOutputStream outToClient =
new DataOutputStream(connSocket.getOutputStream());
if (begin == true) {
//DataOutputStream outToClient =
//new DataOutputStream(connSocket.getOutputStream());
System.out.println("begin " + word.getWord());
outToClient.writeBytes("" + word.getLength());
outToClient.flush();
}
if (begin == false) {
System.out.println("hello");
//DataOutputStream outToClient =
//new DataOutputStream(connSocket.getOutputStream());
String pos = word.getSpots(clientSentence.charAt(0));
outToClient.writeBytes(pos);
outToClient.flush();
}
if (clientSentence.equals("lost")) {
outToClient.writeBytes(word.getWord());
outToClient.flush();
}
if (clientSentence.equals("won")) {
connSocket.close();
}
begin = false;
connSocket.close();
}
}
}

Aquí está el error:

Exception in thread "main" h //Ignore the 'h', it's just a print statement checking input
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.DataOutputStream.writeBytes(Unknown Source)
at TCPClient.main(TCPClient.java:35)
The error now is:
Exception in thread "main" java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at TCPClient.main(TCPClient.java:17)
  • Completo seguimiento de la pila, por favor.
  • ¿Te refieres a publicar el resto del código? ¿Qué es un completo seguimiento de la pila?
  • Todo el mensaje de error de excepción que se produce. Y la puso en su pregunta.
  • He añadido el error. Es en la pregunta anterior.
  • Se parece a un cliente de problema en el lado bueno, puedes publicar el código de cliente?
  • El cliente completo de código está publicado anteriormente. Gracias por tu ayuda.
  • ¿pusiste el ServerSocket aceptar() dentro del bucle while ? una de las posibilidades ya que no podemos ver su código de servidor de arriba!
  • Servidor de Código añadido a la pregunta anterior. Gracias por la ayuda a todos.

InformationsquelleAutor user1767061 | 2013-03-25

2 Comentarios

  1. 2

    Estás cerrando la conexión en el servidor de forma inmediata:

    Socket connSocket = welcomeSocket.accept();
    Scanner inFromClient = new Scanner(connSocket.getInputStream());
    clientSentence = inFromClient.nextLine(); //cap would go after this
    DataOutputStream outToClient =
    new DataOutputStream(connSocket.getOutputStream());
    [...]
    connSocket.close();

    Tan obvio, tan pronto como la primera línea del cliente ha sido leído por el servidor y la respuesta ha sido enviada, la conexión se cierra, y el cliente no puede enviar nada más.

    • Saqué el connSocket.close(), pero ahora me sale el siguiente error:
    • Excepción en el thread «main» java.net.ConnectException: Conexión agotado: conectar en java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(Unknown Source) at java.net.PlainSocketImpl.connectToAddress(Unknown Source) at java.net.PlainSocketImpl.conectar(Unknown Source) at java.net.SocksSocketImpl.conectar(Unknown Source) at java.net.Zócalo.conectar(Unknown Source) at java.net.Zócalo.conectar(Unknown Source) at java.net.Zócalo.<init>(Unknown Source) at java.net.Zócalo.<init>(Fuente Desconocida) en TCPClient.principal(TCPClient.java:17)
    • Usted debe de haber cambiado algo más. Su programa no obtener errores de conexión antes, de lo contrario no podría haber conseguido el error de escritura.
  2. 0

    Debe trabajar con los siguientes cambios en el código del servidor:

    Socket connSocket = welcomeSocket.accept();
    Scanner inFromClient = new Scanner(connSocket.getInputStream());
    DataOutputStream outToClient = new DataOutputStream(connSocket.getOutputStream());
    while (inFromClient.hasNext()) {
    clientSentence = inFromClient.nextLine(); //cap would go after this
    System.out.println("received from client: "+clientSentence);
    }
    .
    .
    .
    .
    connSocket.close();

    Su cliente crea IO corriente sólo una vez, mientras que el servidor lo hizo para cada iteración para la conexión no puede ser establecida.

Dejar respuesta

Please enter your comment!
Please enter your name here