Исключение в потоке main java.net.SocketException: сброс соединения на java.io.BufferedReader.readLine (неизвестный источник)

Я написал базовый код, в котором отправитель отправляет сообщение получателю, а получатель его печатает. Я наивный программист сокетов. Я просмотрел различные сообщения, но до сих пор не смог решить эту проблему. Вот мой код:

TCPServer.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.net.*;
import java.io.*;
import java.util.*;


import org.omg.CORBA.Any;


public class TCPServer {

    public static void main(String args[]) throws IOException{
        TCPServer tcpServer=new TCPServer();
        ServerSocket serverSocket=new ServerSocket(8777);
        Socket sock=serverSocket.accept();
        BufferedReader inputSenderBuffer=new BufferedReader(new InputStreamReader(sock.getInputStream()));
        DataOutputStream outputToSenderBuffer=new DataOutputStream(sock.getOutputStream());
        outputToSenderBuffer.flush();
        //outputToSenderBuffer.close();
        char[] inputArray=new char[2000];

        int i,lengthMessage;
        int a=1;
        System.out.println("We are here");
        while(a<1000)
        {
            System.out.println("Inside this while loop");
            String inputSender=inputSenderBuffer.readLine();
            lengthMessage=inputSender.length();
        for(i=0;i<lengthMessage;i++)
        {
            System.out.println("putting the received message into buffer");
            inputArray[i]=inputSender.charAt(i);
            System.out.println(inputArray[i]);
        }
        }
    }
}

TCPClient.java

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.*;

public class TCPClient {

    public static void main(String args[])
    {

        try {
            Socket sock=new Socket("localhost",8777);
            DataOutputStream outputToReceiverBuffer=new DataOutputStream(sock.getOutputStream());
            System.out.println("Sending test message");
            int i=1000;
            while(i<1000)
            {
            outputToReceiverBuffer.writeBytes("1AAAAAAAAAA");
            outputToReceiverBuffer.flush();
            //outputToReceiverBuffer.close();
            }


        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

Exception at the TCPServer.java console

Exception in thread "main" java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at TCPServer.main(TCPServer.java:31)

Пожалуйста, помогите мне решить это.


person Sid    schedule 25.02.2016    source источник
comment
Возможно, вы захотите указать, клиент или сервер генерирует ошибку.   -  person Andrew Jenkins    schedule 25.02.2016
comment
Сервер генерирует исключение.   -  person Sid    schedule 25.02.2016


Ответы (1)


Вы ничего не пишете:

int i=1000;
while(i<1000)

и вы никогда не закрываете сокет. Поэтому, когда отправитель выходит, соединение сбрасывается, и вуаля.

Когда вы это исправите, вы читаете строки:

String inputSender=inputSenderBuffer.readLine();

но вы не пишете строки:

outputToReceiverBuffer.writeBytes("1AAAAAAAAAA");
outputToReceiverBuffer.flush();

Вместо использования DataOutputStream.writeBytes() вы должны использовать BufferedWriter.write()/newLine().

Вы также не проверяете результат readLine() на значение null, что указывает на то, что одноранговый узел закрыл соединение, поэтому вам следует прекратить чтение и закрыть сокет. Вы должны полагаться на это, а не на произвольный счетчик для управления циклом чтения.

person user207421    schedule 25.02.2016