2015-02-18 5 views
0

Я пытаюсь отправить массив ByteBuffer над сокетом на порт 25565 на адрес «localhost». Но по какой-то причине Java бросает исключение сброса соединения при выполнении input.read(). Может кто-нибудь, пожалуйста, скажите мне, что происходит?Исключение сбрасывания Socket - Java

Отправитель:

private static Socket socket; 

public static void main(String[] args) throws IOException { 
    socket = new Socket("localhost", 25565); 
    String Password = "1234"; 
    ByteBuffer Buffer = ByteBuffer.allocate(1 + Password.getBytes().length); 
    Buffer.put((byte) 0x00); 
    Buffer.putShort((short) Password.getBytes().length); 
    Buffer.put(Password.getBytes()); 
    DataOutputStream output = new DataOutputStream(socket.getOutputStream()); 
    output.write(Buffer.array()); 
} 

public static void sendBytes(byte[] myByteArray) throws IOException { 
    DataOutputStream output = new DataOutputStream(socket.getOutputStream()); 
    output.write("LOL".getBytes()); 
    output.flush(); 
} 

Приемник:

public static void main(String[] args) { 
    try { 
     ServerSocket ServerSocket = new ServerSocket(25565); 
     System.out.println("Waiting for connection..."); 
     Socket socket = ServerSocket.accept(); 
     DataInputStream Input = new DataInputStream(new BufferedInputStream(socket.getInputStream())); 
     System.out.println(Input.read()); 
     ServerSocket.close(); 
     socket.close(); 
    } catch (Exception e) { 
     if(e instanceof SocketTimeoutException) { 
      System.out.println("THE SOCKET TIMED OUT!"); 
     } 
     else { 
      e.printStackTrace(); 
     } 
    } 
} 

Стек след:

java.net.SocketException: Connection reset 
at java.net.SocketInputStream.read(SocketInputStream.java:189) 
at java.net.SocketInputStream.read(SocketInputStream.java:121) 
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) 
at java.io.BufferedInputStream.read(BufferedInputStream.java:265) 
at java.io.FilterInputStream.read(FilterInputStream.java:83) 
at net.networking.Receiver.main(Receiver.java:17) 

ПРИМЕЧАНИЕ: Да, я знаю, что только с помощью input.read() не получит весь массив ByteBuffer, который я пытаюсь отправить. Но сейчас я просто хочу прочитать первый байт и распечатать его на консоли.

ответ

1
  1. Вы не закрываете соединение в отправителе, поэтому он возвращается в исходное состояние при выходе из процесса.

    private static Socket socket; 
    
    public static void main(String[] args) throws IOException { 
        socket = new Socket("localhost", 25565); 
        String Password = "1234"; 
        sendBytes(Password.getBytes()); 
        output.close(); 
    } 
    
    public static void sendBytes(byte[] myByteArray) throws IOException { 
        ByteBuffer Buffer = ByteBuffer.allocate(3 + myByteArray.length); 
        Buffer.put((byte) 0x00); 
        Buffer.putShort((short) myByteArray.length); 
        Buffer.put(myByteArray); 
        DataOutputStream output = new DataOutputStream(socket.getOutputStream()); 
        output.write(Buffer.array()); 
        output.flush(); 
    } 
    
  2. Вы читаете только один байт, а затем закрываете соединение. Вам нужно прочитать всю передачу. Если вы закроете сокет с еще непрочитанными данными, соединение будет сброшено. Кроме того, если вы хотите обрабатывать исключения отдельно, поймать их отдельно. Не используйте instanceof.

    public static void main(String[] args) { 
        try { 
         ServerSocket ServerSocket = new ServerSocket(25565); 
         System.out.println("Waiting for connection..."); 
         Socket socket = ServerSocket.accept(); 
         DataInputStream Input = new DataInputStream(new BufferedInputStream(socket.getInputStream())); 
         byte b = Input.readByte(); 
         short dataLen = Input.readShort(); 
         byte[] data = new byte[dataLen]; 
         Input.readFully(data); 
         // use data as needed... 
         System.out.println("Data received"); 
         Input.close(); 
         ServerSocket.close(); 
        } catch (SocketTimeoutException e) { 
         System.out.println("THE SOCKET TIMED OUT!"); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
    } 
    
+0

Хорошо будет попробовать. – Whirvis

+0

Все еще не работает, попробовал то, что вы сказали. Не могли бы вы выслать мне точное исправление кода, которое вы предлагали? Я просто хочу убедиться, что я ставлю то, что вы имеете в виду. – Whirvis

+0

Как и в, скопируйте и вставьте код. – Whirvis