title: Java Socket Write Error
body: <p>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:</p>
  
  <pre><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 &amp;&amp; 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&lt;Character&gt; list = new ArrayList&lt;Character&gt;();
              int length = modifiedSentence.length();
              for (int i = 0; i &lt; length; i++) {
                 list.add(modifiedSentence.charAt(i));
              }
              for (char c : list) {
                 if (c == ' ') {
                    list.remove(c);
                 }
              }
              for (int i = 0; i &lt; 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();
  
     }
  }
  </code></pre>
  
  <p>... 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:</p>
  
  <pre><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();
        }
  
  
     }
  }
  </code></pre>
  
  <p>Here is the error:</p>
  
  <pre><code>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.&lt;init&gt;(Unknown Source)
  at java.net.Socket.&lt;init&gt;(Unknown Source)
  at TCPClient.main(TCPClient.java:17)
  </code></pre>