2016-09-25 3 views
1

Ich versuche, einen Server und Client auf der Basis der Web-Socket-Technologie zu implementieren, aber wenn ich die TCPDataServer Klasse laufen erhalte ich folgende Fehlermeldung:Connection reset bei read()

java.io.IOException: connection reset 
at java.io.DataInputStream.read(Unknown Source) 
at org.server.ClientWorker.run(TCPDataServer.java:67) 
at java.lang.Thread.run(Unknown Source) 

I ausgenommen das bekommt folgenden Ausgabe Hello, I am Alex!

TCPDataClient

package org.client; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class TCPDataClient { 

    public static void main(String[] args) { 
     try { 
      TCPDataClient obj = new TCPDataClient(); 
      Socket obj_client = new Socket(InetAddress.getByName("127.0.1"), 1000); 
      DataInputStream din = new DataInputStream(obj_client.getInputStream()); 
      DataOutputStream dout = new DataOutputStream(obj_client.getOutputStream()); 
      byte[] buffer = obj.createDataPacket("Hello, I am Alex!".getBytes("UTF8")); 
      dout.write(buffer); 

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

    } 

    private byte[] createDataPacket(byte[] data) { 

     byte[] packet = null; 
     try { 
      byte[] initialize = new byte[1]; 
      initialize[0] = 2; 
      byte[] separator = new byte[1]; 
      separator[0] = 4; 
      byte[] data_length = String.valueOf(data.length).getBytes("UIF8"); 
      packet = new byte[initialize.length + separator.length + data_length.length + data.length]; 

      System.arraycopy(initialize, 0, packet, 0, initialize.length); 
      System.arraycopy(data_length, 0, packet, initialize.length, data_length.length); 
      System.arraycopy(separator, 0, packet, initialize.length + data_length.length, separator.length); 
      System.arraycopy(data, 0, packet, initialize.length + data_length.length + separator.length, data.length); 


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

     } 
     return packet; 

    } 

} 

TCPDataSer ver

package org.server; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.Arrays; 
import java.util.logging.Level; 

import com.sun.istack.internal.logging.Logger; 

public class TCPDataServer { 

    public static void main(String[] args) { 

     try { 
      ServerSocket server_socket = new ServerSocket(1000); 
      while (true) { 
       new Thread(new ClientWorker(server_socket.accept())).start(); 
      } 
     } catch (IOException e) { 
       System.err.println("Error"); 
       System.err.println(e); 
       System.err.println("\n2"); 
       System.err.println(e.getMessage()); 
       System.err.println("\n3"); 
       System.err.println(e.getLocalizedMessage()); 
       System.err.println("\n4"); 
       System.err.println(e.getCause()); 
       System.err.println("\n5"); 
       System.err.println(Arrays.toString(e.getStackTrace())); 
       System.err.println("\n6"); 
       e.printStackTrace(); 
     } 

    } 

} 

class ClientWorker implements Runnable { 
    private Socket target_socket; 
    private DataInputStream din; 
    private DataOutputStream dout; 

    public ClientWorker(Socket recv_scket) { 

     try { 
      target_socket = recv_scket; 
      din = new DataInputStream(target_socket.getInputStream()); 
      dout = new DataOutputStream(target_socket.getOutputStream()); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    public void run() { 
     while (true) { 
      byte[] initilize = new byte[1]; 
      try { 
       din.read(initilize, 0, initilize.length); 
       if (initilize[0] == 2) { 
        //This is line 67. 
        System.out.println(new String(readStream())); 

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

    } 

    private byte[] readStream() { 
     byte[] data_buff = null; 

     try { 
      int b = 0; 
      String buff_length = ""; 
      while ((b = din.read()) != 4) { 
       buff_length += (char) b; 
      } 
      int data_length = Integer.parseInt(buff_length); 
      data_buff = new byte[Integer.parseInt(buff_length)]; 
      int byte_read = 0; 
      int byte_offset = 0; 
      while (byte_offset < data_length) { 
       byte_read = din.read(data_buff, byte_read, data_length - byte_offset); 
       byte_offset += byte_read; 

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

     return data_buff; 

    } 

} 
+0

Sollte es "127.0.0.1" statt "127.0.1" sein? – SOFe

+0

ja du bist righz Ich habe es geändert, aber ich bekomme jetzt 'java.net.SocketException: Verbindung zurückgesetzt \t bei java.net.SocketInputStream.read (unbekannte Quelle) \t bei java.net.SocketInputStream.read (unbekannte Quelle) \t bei java.io.DataInputStream.read (Unknown Source) \t bei org.server.ClientWorker.run (TCPDataServer.java:65) \t bei java.lang.Thread.run (Unknown Source) ' –

+0

Diese Zeile in die Methode run() ... din.read (initfilize, 0, initilize.length); –

Antwort

-1

Sie sind die Steckdosen nicht zu schließen, so dass Ihr OS ist das Zurücksetzen sie, wenn die JVM beendet.

+0

Danke für Ihre Antwort! Ich habe den Sockel so geschlossen \t \t \t byte [] buffer = obj.createDataPacket ("Hallo, ich bin Alex!". GetBytes ("UTF-8")); \t \t \t dout.write (Puffer); \t \t \t din.close(); \t \t \t dout.close(); \t \t \t obj_client.close(); 'aber ich bekomme immer noch' java.net.SocketException: Verbindung zurückgesetzt auf java.net.SocketInputStream.read (unbekannte Quelle) bei java.net.SocketInputStream.read (unbekannte Quelle) um java.io.DataInputStream.read (Unbekannte Quelle) bei org.server.ClientWorker.run (TCPDataServer.java:65) bei java.lang.Thread.run (Unknown Source ' –

Verwandte Themen