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

04-11-17 etlin
我调试的是第一章的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 );

}

}

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

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

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

etlin
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);

}

}

猜你喜欢