2017-10-05 14 views
-1

バイトを送信してソケット接続で受信しようとしていますが、どちらもしていません。私はバイトや文字列を送信する方法と問題があるかどうか、またはサーバーとクライアントから読み取る方法がわからないためにわからない。ソケットが送受信していません

クライアント

public class Client implements Runnable { 

private Socket socket; 
private ByteArrayOutputStream buffer; 
private OutputStream output; 
private Stage stage; 

public Client() { 
    try { 
     this.socket = new Socket("localhost", 1337); 
     this.socket.setTcpNoDelay(true); 
     this.socket.setKeepAlive(true); 
     this.output = this.socket.getOutputStream(); 
     InputStream input = this.socket.getInputStream(); 
     this.buffer = new ByteArrayOutputStream(); 
     Thread connection = new Thread(this); 
     connection.start(); 
     this.sendPacket(0, ByteBuffer.allocate(16 + "TEST".length()).putInt("TEST".length()).put("TEST".getBytes(Constants.UTF8)).array()); 
     System.out.println("[CLIENT] Successfully connected to server."); 
    } catch (Exception e) { 
     IOUtils.output("[CLIENT] Error when connecting to server."); 
     System.exit(1337); 
    } 
} 

@Override 
public void run() { 
    try { 
     while (this.connected()) { 
      byte[] bytes = this.buffer.toByteArray(); 
      Constants.received += bytes.length; 
      if (bytes.length < 8) return; 
      ByteBuffer cbuf = ByteBuffer.wrap(bytes); 
      int size = cbuf.getInt(); 
      int id = cbuf.getInt(); 
      if (bytes.length < size + 8) continue; 
      byte[] data = Arrays.copyOfRange(bytes, 8, 8 + size); 
      this.processPacket(id, data); 
      this.buffer.close(); 
      (this.buffer = new ByteArrayOutputStream()).write(bytes, 8 + size, bytes.length - 8 - size); 
     } 
     System.out.println("[CLIENT] Disconnected from server."); 
     System.exit(1337); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private void processPacket(int id, byte[] bytes) { 
    ByteBuffer data = ByteBuffer.wrap(bytes); 
    if (id == 0) { 
    System.out.println("Received packet from server with id 0"); 
    } else if (id == 1) { 
    System.out.println("Received packet from server with id 1"); 
    } 
} 

private void sendPacket(int id, byte[] data) { 
    try { 
     ByteBuffer bytebuffer = ByteBuffer.allocate(8 + data.length); 
     bytebuffer.putInt(data.length); 
     bytebuffer.putInt(id); 
     bytebuffer.put(data); 
     byte[] bytes = bytebuffer.array(); 
     Constants.sent += bytes.length; 
     this.output.write(bytes); 
     this.output.flush(); 
    } catch (IOException e) { 
     try { 
      socket.close(); 
     } catch (IOException io) { 
      IOUtils.output("[CLIENT] Error with client."); 
      System.exit(1337); 
     } 
    } 
} 

private boolean connected() { 
    return this.socket.isConnected() && !this.socket.isInputShutdown() && !this.socket.isOutputShutdown() && !this.socket.isClosed(); 
} 


} 

ServerHandler

public class Handler implements Runnable { 

private Socket socket; 
private ByteArrayOutputStream buffer; 
private OutputStream output; 

public Handler(Socket socket) { 
    this.socket = socket; 
    try { 
     this.output = this.socket.getOutputStream(); 
     InputStream input = this.socket.getInputStream(); 
     this.buffer = new ByteArrayOutputStream(); 
     Thread connection = new Thread(this); 
     connection.start(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void run() { 
    try { 
     IOUtils.output("[HANDLER] Connection from " + socket.getInetAddress()); 
     while (connected()) { 
      byte[] bytes = this.buffer.toByteArray(); 
      if (bytes.length < 8) return; 
      ByteBuffer buffer = ByteBuffer.wrap(bytes); 
      int size = buffer.getInt(); 
      int id = buffer.getInt(); 
      if (bytes.length < size + 8) continue; 
      byte[] data = Arrays.copyOfRange(bytes, 8, 8 + size); 
      this.processPacket(id, data); 
      this.buffer.close(); 
      (this.buffer = new ByteArrayOutputStream()).write(bytes, 8 + size, bytes.length - 8 - size); 
     } 
     IOUtils.output("[HANDLER] Client ended connection - " + socket.getInetAddress()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private void sendPacket(int id, byte[] data) { 
    try { 
     ByteBuffer bytebuffer = ByteBuffer.allocate(8 + data.length); 
     bytebuffer.putInt(data.length); 
     bytebuffer.putInt(id); 
     bytebuffer.put(data); 
     byte[] bytes = bytebuffer.array(); 
     this.output.write(bytes); 
     this.output.flush(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

private void processPacket(int id, byte[] bytes) { 
    ByteBuffer data = ByteBuffer.wrap(bytes); 
    if (id == 0) { 
     IOUtils.output("Recieved packet with id 0"); 
    } else if (id == 1) { 
     //TODO: authenticate user. 
    } 
} 

private boolean connected() { 
    return this.socket.isConnected() && !this.socket.isInputShutdown() && !this.socket.isOutputShutdown() && !this.socket.isClosed(); 
} 

} 

サーバー

public class Server implements Runnable { 

private int port; 
private ServerSocket sock; 

public Server(int port) { 
    this.port = port; 
    launch(); 
} 

private void launch() { 
    this.run(); 
} 

@Override 
public void run() { 
    try { 
     sock = new ServerSocket(port); 
     System.out.println("[SERVER] Server started"); 
     while(!sock.isClosed()) { 
      new Handler(sock.accept()); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

} 

私はこの問題はByteArrayOutputStreamとなるかもしれないと思います。 ByteBufferは、通常のDataInputおよび出力ストリームよりもはるかに高速だと聞いたので、私はByteBufferを使いたいと思っていました。

答えて

1

あなたの実行方法の中で読んでSocket#を呼び出すことは決してありません...もし何かを読んでいなければ、あなたが接続されているときでも、あなたのループでは何もできません!

は、ソケットについては、このチュートリアルを見てみましょう:

https://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html

+0

私は何を意味するのですか?私は何を読むことができますか?整数ではなくバイトを送信しています。 inputstream.readはintを返します。 –

+0

@OmarAhmedはメソッドの説明を見ています。read()はバイトを読み込み、intを使ってそれを表現します。メソッドread(byte [])は数字バイトを返します。 – user902383

+0

@ user902383バイトでないバイトを取得する必要があります –

0

お使いのサーバーのコードではなく、ソケットのServerSocketを使用する必要があります。 Socketは、JavaでClient Socketオブジェクトを表すために使用されます。

+0

ServerSocketを使用しています。ハンドラ内の他のソケットはクライアント情報を取得するために使用されます(問題なく接続します)。 –

+0

投稿したコードはどこでもServerSocketを使用しません。サーバーとクライアントの実際のコードを投稿すると、より迅速にヘルプが表示されます。 – SCCC

+0

私はちょうどそこにあるはずの投稿を更新しました –

関連する問題