在消息以单个字节开头的客户端服务器之间发送消息



我在如何实际发送消息并检查开头的单个字节是否是特定字节方面遇到了问题。

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

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

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

好吧,我建议创建一个仅用于连接的类。也许它看起来像这样:

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。当您向Connection添加DataListener时,您可以对opcode执行检查。

最新更新