Java套接字写错误

时间:2013-03-25 18:04:38

标签: java sockets tcp client client-server

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

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后刷新(),但在第二次使用时它失败了。我猜这是客户端问题。有帮助吗?谢谢。这是服务器代码:

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)

2 个答案:

答案 0 :(得分: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();

很明显,只要服务器读取了客户端的第一行并且响应已经发送,连接就会关闭,客户端就无法再发送任何内容了。

答案 1 :(得分: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流,而服务器在每次迭代时都执行此操作,因此无法建立连接。