0

I'm getting a "Socket Write Error". While scouting around on StackOverflow I found some suggestions for using flush(); method to send bytes through the stream. The problem I'm having is that after using the flush(); method, I still get the error. I'm not sure what is causing the problem. Any ideas? This is the complete client code:

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();

   }
}

... the code continues but it doesn't seem to make it to the rest of the code anyway. I'm a bit lost as to why it keeps failing. I flush() after the first use of outToServer but on the second use it fails. I'm guessing this is a Client-side problem. Any help? Thanks. Here is the Server Code:

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();
      }


   }
}

Here is the 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)
8
  • Full stack trace, please. Commented Mar 25, 2013 at 18:05
  • Do you mean post the rest of the code? What is a full stack trace? Commented Mar 25, 2013 at 18:06
  • The whole error message from the exception that is thrown. And put it in your question. Commented Mar 25, 2013 at 18:07
  • I added the error. It is in the question above. Commented Mar 25, 2013 at 18:09
  • Looks like a client side problem alright, can you post the client code? Commented Mar 25, 2013 at 18:10

2 Answers 2

2

You're closing the connection in the server immediately:

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();

So obviously, as soon as the first line from the client has been read by the server and the response has been sent, the connection is closed, and the client can't send anything more.

Sign up to request clarification or add additional context in comments.

3 Comments

I took out the connSocket.close(), but now I get the following error:
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)
You must have changed something else. Your program didn't get connection failures before, otherwise you couldn't have got the write error.
0

Should work with below changes in the server code:

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();

Your client creates IO stream just once while server did it for every iteration so no connection could be established.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.