【问题标题】:Java Socket Write ErrorJava 套接字写入错误
【发布时间】:2013-03-15 08:09:00
【问题描述】:

我收到“套接字写入错误”。在 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)

【问题讨论】:

  • 请完整的堆栈跟踪。
  • 你的意思是把剩下的代码贴出来吗?什么是完整的堆栈跟踪?
  • 抛出异常的整个错误消息。并把它放在你的问题中。
  • 我添加了错误。它在上面的问题中。
  • 看起来是客户端问题,可以发一下客户端代码吗?

标签: java sockets tcp client client-server


【解决方案1】:

您将立即关闭服务器中的连接:

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

所以很明显,一旦服务器读取了客户端的第一行并发送了响应,连接就关闭了,客户端不能再发送任何内容了。

【讨论】:

  • 我取出了connSocket.close(),但是现在我得到了如下错误:
  • 线程“主”java.net.ConnectException 中的异常:连接超时:在 java.net.PlainSocketImpl.doConnect(未知来源)处的 java.net.PlainSocketImpl.socketConnect(本机方法)处连接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.(Unknown Source) at java.net.Socket.(Unknown Source) at TCPClient.main(TCPClient.java:17)跨度>
  • 您一定更改了其他内容。您的程序之前没有出现连接失败,否则您不可能收到写入错误。
【解决方案2】:

应该在服务器代码中进行以下更改:

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 流,而服务器为每次迭代都创建一次,因此无法建立连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多