2016-09-25 16 views
1

私は、Webソケットテクに基づいて、サーバーとクライアントを実装しようとしていますが、私はTCPDataServerクラスを実行すると、私は次のエラーを取得しています:接続がリセット()

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) 

私が取得するために除外次の出力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

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

「127.0.1」ではなく「127.0.0.1」でなければなりませんか? – SOFe

+0

はい、私はそれを変更しましたが、今は 'java.net.SocketException:Connection reset \t java.net.SocketInputStream.read(Unknown Source)で \t java.net.SocketInputStream.read(Unknown Source) org.server.ClientWorker.run(TCPDataServer.java:65)java.lang.Thread.runで \t(不明なソース) ' –

+0

でjava.io.DataInputStream.read(不明なソース)で \t \tこの行でrun()メソッド... din.read(ini​​tilize、0、initilize.length); –

答えて

-1

のverあなたは、JVMが終了したときので、あなたのOSがそれらをリセットされ、ソケットをクローズされていません。

+0

回答ありがとうございました!私はこのようなソケットを閉じた '\t \t \tバイト[]バッファ= obj.createDataPacket("こんにちは、私はアレックス! \t \t \t dout.write(buffer); \t \t \t din.close(); \t \t \t dout.close(); \t \t \t obj_client.close(); 'しかし、私はまだ' java.net.SocketException:java.net.SocketInputStream.read(Unknown Source)のjava.net.SocketInputStream.readで接続をリセットしています。 java.lang.Thread.runのorg.server.ClientWorker.run(TCPDataServer.java:65)のjava.io.DataInputStream.read(不明なソース) –

関連する問題