0

我无法实际发送消息并检查开头的单个字节是否是特定字节。

例如0x03表示该消息是一条保存消息,因此以下消息将只是存储在服务器上的文本。

我创建了一个新的字节数组byte[] save = new byte[] { 0x03 };

现在我不确定如何发送和检查消息是否实际包含该字节。

4

1 回答 1

0

好吧,我建议为连接创建一个类。也许它可能看起来像:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.LinkedList;
import java.util.List;

public class Connection extends Thread implements Runnable{

    private final Socket socket;
    private final DataOutputStream output;
    private final DataInputStream input;

    private final List<DataListener> listeners;

    public Connection(final Socket socket) throws IOException {
        this.socket = socket;

        listeners = new LinkedList<>();

        output = new DataOutputStream(socket.getOutputStream());
        output.flush();

        input = new DataInputStream(socket.getInputStream());

        setPriority(MAX_PRIORITY);
        start();
    }

    public void addDataListener(final DataListener l){
        listeners.add(l);
    }

    public void send(final byte opcode, final String message) throws IOException{
        output.writeByte(opcode);
        final byte[] bytes = message.getBytes("UTF-8");
        output.writeInt(bytes.length);
        output.write(bytes);
    }

    public boolean close(){
        try{
            output.close();
            input.close();
            socket.close();
        }catch(IOException ex){
            ex.printStackTrace();
        }finally{
            return socket.isConnected();
        }
    }

    private void fireDataListeners(final byte opcode, final String message){
        listeners.forEach(l -> l.dataReceived(this, opcode, message));
    }

    public void run(){
        while(true){
            try{
                final byte opcode = input.readByte();
                final byte[] bytes = new byte[input.readInt()];
                input.readFully(bytes);
                final String message = new String(bytes);
                fireDataListeners(opcode, message);
            }catch(IOException ex){
                ex.printStackTrace();
                close();
                break;
            }
        }
    }
}

然后有一个用于监听数据的接口:

public interface DataListener {

    public void dataReceived(final Connection connection, final byte opcode, final String message);
}

我假设您将始终拥有一个操作码,然后String立即拥有一个操作码。当您将 a 添加DataListener到您的Connection时,您可以对opcode.

于 2013-10-08T03:31:15.500 回答