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)