2013-03-25 73 views
0

我收到“套接字写入错误”。在探索StackOverflow时,我发现了一些使用flush()的建议;方法通过流发送字节。我遇到的问题是在使用flush()之后;方法,我仍然得到错误。我不确定是什么导致了这个问题。有任何想法吗?这是完整的客户端代码:Java Socket写入错误

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

    } 
} 

...代码继续,但似乎它并没有使它的其余代码反正。我有点失落,为什么它一直失败。我在第一次使用outToServer之后flush(),但第二次使用失败。我猜这是客户端问题。任何帮助?谢谢。这里是服务器代码:

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


    } 
} 

以下是错误:

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) 
+0

完整的堆栈跟踪,请。 – 2013-03-25 18:05:36

+0

你的意思是发布其余的代码?什么是完整的堆栈跟踪? – user1767061 2013-03-25 18:06:22

+0

引发异常的整个错误消息。并把它放在你的问题。 – 2013-03-25 18:07:47

回答

2

您要关闭的立即与服务器的连接:一旦

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

所以,很显然,作为客户端的第一行已被服务器读取,并且响应已发送,连接已关闭,客户端无法发送更多内容。

+0

我拿出connSocket.close(),但现在出现以下错误: – user1767061 2013-03-25 19:26:47

+0

线程“main”异常java.net.ConnectException:连接超时:连接 \t at java.net.PlainSocketImpl.socketConnect(Native Method ) \t在java.net.PlainSocketImpl.doConnect(未知来源) \t在java.net.PlainSocketImpl.connectToAddress(未知来源) \t在java.net.PlainSocketImpl.connect(未知来源) \t在java.net。 SocksSocketImpl.connect(Unknown Source) \t at java.net.Socket.connect(Unknown Source) \t at java.net.Socket.connect(Unknown Sour ce) \t at java.net.Socket。 (Unknown Source) \t at java.net.Socket。 (来源不明) \t在TCPClient.main(TCPClient.java:17) – user1767061 2013-03-25 19:27:03

+0

你一定已经改变了别的东西。你的程序以前没有得到连接失败,否则你不会得到写入错误。 – EJP 2013-03-25 21:52:16

0

应与服务器代码如下修改工作:

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

你的客户端创建IO流只有一次,而服务器没有为它每次迭代所以没有连接可以建立。