簡體   English   中英

我的套接字沒有發送或接收字節數組

[英]My socket isn't sending or receiving bytearrays

我正在嘗試發送字節並通過我的套接字連接接收它們,但他們也沒有這樣做。 我不確定這是否與我發送字節和字符串的方式有關,或者因為我不知道如何從服務器和客戶端讀取。

客戶

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();   
}


}

服務器處理程序

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 和輸出流快得多。

你永遠不會在你的 run 方法中調用 Socket#read ......如果你不讀任何東西,你就沒有任何東西可以在你的循環中使用,即使你已經連接!

看看這個關於套接字的教程:

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

您的服務器代碼應該使用ServerSocket而不是 Socket。 Socket 用於表示 Java 中的 Client Socket 對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM