我无法实际发送消息并检查开头的单个字节是否是特定字节。
例如0x03
表示该消息是一条保存消息,因此以下消息将只是存储在服务器上的文本。
我创建了一个新的字节数组byte[] save = new byte[] { 0x03 };
现在我不确定如何发送和检查消息是否实际包含该字节。
我无法实际发送消息并检查开头的单个字节是否是特定字节。
例如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
立即拥有一个操作码。当您将 a 添加DataListener
到您的Connection
时,您可以对opcode
.