我的服务器中有一种服务架构,可以监听TCP-IP-socked。
messageType = protocolHandler.getMessageType();
ITaskProtocol serviceProtocol = serverServices.get(messageType);
if (p != null) {
String result = serviceProtocol.handleTask(protocolHandler);
}
我正在哈希映射中存储特定任务的协议。 我的问题是,应该处理任务的协议没有在inputStream中找到任何字节。 inputStream和socked在“protocolHandler”中。
示例:
public class ProtocolHandler implements ITaskProtocolHandler {
@Override
public int getMessageType() throws IOException {
return new DataInputStream(stream).readInt();
}
但是,我可以看到(因为调试)消息已被发送。并且在地图中找到了协议(服务),并且调用了服务的“handleTask(...)”方法。但是,该服务没有消息,因为字节丢失且协议正在等待彼此。
我的猜测是搜索服务需要的时间太长而且消息同时丢失。
重要信息: 有时它有时不起作用。客户端和服务器在同一台PC上运行,这可能是线程问题。
客户端协议:
clientWorker.send(ServerProtocol.MessageRequestType.JoinTopicRequest.getRequestNumber());
clientWorker.send("some xml-message");
服务器服务协议:
public String handleTask(ITaskProtocolHandler protocolHandler) throws Exception {
Message m = protocolHandler.getMessage());
架构中有什么问题?
非常感谢!
答案 0 :(得分:1)
这是一个疯狂的猜测,但它可能是你的问题。您的线程是否被阻止并等待数据?
如果是这样,那么你需要修改你在套接字上要求流的顺序,你需要从套接字获取FIRST的inputStream,然后请求outputStream,否则你最终会线程被阻塞并等待数据。
我希望这能解决你的问题。
请参阅此帖子:Stackoverflow java socket question以获取完整说明。
答案 1 :(得分:0)
int size = readInt();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead = 0;
int totalRead = 0;
byte[] data = new byte[1024];
while (totalRead < size) {
int read;
if (data.length <= (size - totalRead))
read = data.length;
else
read = (size - totalRead);
if ((nRead = inputStream.read(data, 0, read)) == -1)
throw new IOException("End of stream");
buffer.write(data, 0, nRead);
totalRead += nRead;
}