2017-10-04 146 views
0

你好,我有一个客户端服务器程序,服务器端工作,而客户端有问题。客户端连接后会打印出一条消息,但是在用户输入(尚未使用)后,我收到此错误消息。服务器打印出一个带有行号和序号的文本文件(序号不太正确),并且应该将行号,序号和文本行发送到客户端。Java客户端/服务器错误:连接重置

服务器:

public class STSServer { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String argv[]) throws Exception 
{ 
    String startLineFromClient; 
    String endLineFromClient; 
    String stringLineNumber; 
    String stringSeqNumber; 
    String test = "hello"; 
    int convertStart; 
    int convertEnd; 
    int subtractStartEnd; 
    int temp; 
    int byteTransfer; 
    int lineNumber = 0; 
    int sequenceNumber; 



    ServerSocket welcomeSocket = new ServerSocket(6789); 
    Socket connectionSocket = welcomeSocket.accept(); 
    BufferedReader inFromClient = 
      new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
    DataOutputStream outToClient = 
      new DataOutputStream(connectionSocket.getOutputStream()); 

     try{ 
      File myFile = new File("alice.txt"); 
      FileReader fileReader = new FileReader(myFile); 
      BufferedReader bufferedReader = new BufferedReader(fileReader); 
      StringBuffer stringBuffer = new StringBuffer(); 
      String line; 

      startLineFromClient = inFromClient.readLine(); 
      endLineFromClient = inFromClient.readLine(); 

      convertStart = Integer.parseInt(startLineFromClient); 
      convertEnd = Integer.parseInt(endLineFromClient); 

      while((line = bufferedReader.readLine()) != null) 
      { 


       sequenceNumber = line.length(); 

       System.out.print(lineNumber); 
       stringLineNumber = Integer.toString(lineNumber); 
       outToClient.writeBytes(stringLineNumber); 

       System.out.print(" "); 

       System.out.print(sequenceNumber); 
       stringSeqNumber = Integer.toString(sequenceNumber); 
       outToClient.writeBytes(stringSeqNumber); 


       System.out.print(" "); 

       System.out.print(line); 
       outToClient.writeBytes(line); 
       System.out.println(""); 

       lineNumber++; 

       //stringLineNumber = Integer.toString(lineNumber); 
       //stringSeqNumber = Integer.toString(sequenceNumber);*/ 
       // outToClient.writeBytes(test); 

      } 
      fileReader.close(); 
     } 
     catch(IOException e) 
     { 
      e.printStackTrace(); 
     } 

}  

}

客户: 公共类STSClient {

public static void main(String argv[])throws Exception 
{ 
    String startLine; 
    String endLine; 
    String lineNumber; 
    String seqNumber; 
    String line; 

    BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
    Socket clientSocket = new Socket("localhost", 6789); 
    DataOutputStream outToServer = 
      new DataOutputStream(clientSocket.getOutputStream()); 
    BufferedReader inFromServer = 
      new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

    while (true) 
    { 
     System.out.println("+++++++++++++++++++++++++++++++++++++++++++++"); 
     System.out.println("+++++++++++++++ Simple TCP Service (STS)+++++"); 
     System.out.println("+++++++++++++++++++++++++++++++++++++++++++++"); 
     System.out.println("Command allowed by the server for this client:"); 
     System.out.println("download [starting line #] [ending line #]"); 
     System.out.print("Command: "); 
     startLine = inFromUser.readLine(); 
     endLine = inFromUser.readLine(); 

     outToServer.writeBytes(startLine + '\n'); 
     outToServer.writeBytes(endLine + '\n'); 


     lineNumber = inFromServer.readLine(); 
     seqNumber = inFromServer.readLine(); 
     line = inFromServer.readLine(); 

     System.out.print(lineNumber); 
     System.out.print(seqNumber); 
     System.out.print(line); 
     System.out.println(""); 
    } 
} 

}

错误:

Exception in thread "main" java.net.SocketException: Connection reset 
at java.net.SocketInputStream.read(SocketInputStream.java:209) 
at java.net.SocketInputStream.read(SocketInputStream.java:141) 
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) 
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) 
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) 
at java.io.InputStreamReader.read(InputStreamReader.java:184) 
at java.io.BufferedReader.fill(BufferedReader.java:161) 
at java.io.BufferedReader.readLine(BufferedReader.java:324) 
at java.io.BufferedReader.readLine(BufferedReader.java:389) 
at stsclient.STSClient.main(STSClient.java:42) 

回答

0
  • 您的客户正在阅读线路。

  • 您的服务器没有发送线路。

  • 您的服务器在不关闭套接字的情况下退出,这会在Windows上重置套接字。

  • 您的客户仍然卡在第一个readLine()等待行终止符。

  • 取而代之的是重置连接。

解决方法:发送线路,不关闭套接字时不退出。

+0

我以为服务器中的outToClient发送线路给客户端 – mrAnderson

+0

不,它调用'writeBytes()'。请注意客户端*是*发送线路到服务器,并注意为什么。 – EJP

相关问题