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

时间:2013-10-08 03:17:50

标签: java client-server bytearray

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

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

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

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

1 个答案:

答案 0 :(得分: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。当您向DataListener添加Connection时,您可以对opcode执行检查。