发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 CQRS 扩展性 并发编程 事件溯源 分布式 SOA

banq帮帮我,信息发送一条以后就不动了

2004-11-17 10:15
赞助商链接

我调试的是第一章的TCP模式的Socket底层通信,客户端发送出5条消息,服务器端对每条都回复come back。可是运行的时候,客户端发出一条消息之后就不动了。全部程序代码和程序运行结果见
etlin5X703qEC58.zip,麻烦banq帮我看看啊

我用了书中(改了一点)的几个类TCPReactor.java,TCPAcceptor.java,TCPHandler.java,TCPClient.java.
SocketHelper.java是我自己写的:
import java.io.*;
import java.nio.channels.*;
import java.nio.ByteBuffer;

public class SocketHelper
{

public void close(SelectionKey key) throws IOException
{
SocketChannel sc=(SocketChannel)key.channel();
key.cancel();
sc.close();
}

public byte[] readSocket(SelectionKey key) throws IOException
{
SocketChannel sc =(SocketChannel)key.channel();
ByteBuffer buf=ByteBuffer.allocate(1024);
int x=sc.read(buf);
return buf.array();
}

public void writeSocket(byte[] bytes ,SelectionKey key) throws IOException
{

SocketChannel sc =(SocketChannel)key.channel();
ByteBuffer buf=ByteBuffer.wrap(bytes);
//System.out.println("length2:"+buf.array().length);
sc.write( buf );
}
}

2004-11-21 09:47

打印出Log跟踪,基于多线程编程是麻烦的一件事情,只有使用记录跟踪,研究其执行轨迹了。

2004-11-24 10:49

我跟踪了,客户端TCPClient.java在读取服务器端的第一条回复信息时出错java.nio.channels.CancelledKeyException,而TCPHandler.java也出现java.io.Exception:您的主机中的软件放弃了一个已建立的连接。

请问这到底是TCPHandler.java的问题,还是TCPClient.java的问题?这两个类我用的都是书上的代码。

2004-11-25 10:33

我现在把TCPClient.java的sendRequest()和receiveResponse()两个方法改为如下,结果客户端就可以收到服务器端的第一条消息,但之后客户端和服务器端就都找不到自己各自感兴趣的事件了,不知道为什么啊???

private void sendRequest(SelectionKey key) {
try {
Debug.logVerbose("come here to send request",module);
Message request=messageList.removeReqFirst();
String strs=(String)request.getObject();
Debug.logVerbose("send the request to the server="+strs,module);

//写入socket
socketHelper.writeSocket(strs.getBytes(),key);
key.interestOps(SelectionKey.OP_READ);
selector.wakeup();
} catch (Exception ex) {
Debug.logError(ex, module);
}
}

private void readResponse(SelectionKey key) {
try {

byte[] array = socketHelper.readSocket(key);
if(array==null)
{
//key.interestOps(SelectionKey.OP_READ);
//selector.wakeup();
return;
}
Debug.logVerbose("read the response from the server:"+new String(array),module);
key.interestOps(SelectionKey.OP_READ);
selector.wakeup();
//Debug.logVerbose("after wakeup");
} catch (Exception ex) {
Debug.logError(ex, module);
}
}

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系反馈 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com