关于非阻塞Socket的问题,高手请进,解决马上给分!

BrainA 2003-05-26 09:45:49
服务器

package simulation;

import java.io.*;
import java.util.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.channels.spi.*;

public class ServerThread extends Thread
{
FrmMain frm;
Selector selector;
ServerSocketChannel channel;
SocketChannel socket;
int port = 8000;
long dispTime = 0;
public ServerThread(FrmMain frm)
{
this.frm = frm;
try
{
selector = Selector.open();
channel = ServerSocketChannel.open();
channel.configureBlocking(false);
InetAddress localhost = InetAddress.getLocalHost();
InetSocketAddress isa = new InetSocketAddress(localhost, port);
channel.socket().bind(isa);
channel.register(selector, SelectionKey.OP_ACCEPT);
}
catch (IOException e)
{
e.printStackTrace();
}
}

public void run()
{
while (true)
{
try
{
while (selector.select() > 0)
{
Set readyKeys = selector.keys();
Iterator it = readyKeys.iterator();
while (it.hasNext())
{
SelectionKey key = (SelectionKey)it.next();
it.remove();
if (key.isAcceptable())
{
ServerSocketChannel ssc = (ServerSocketChannel)key.channel();
socket = ssc.accept();
socket.configureBlocking(false);
socket.register(selector, SelectionKey.OP_READ);
}
if (key.isReadable())
{
readPkg(key);
}
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
this.yield();
}
}

public void readPkg(SelectionKey key)
{
ByteBuffer buf;
SocketChannel sc = (SocketChannel)key.channel();
try
{
ByteBuffer buf = ByteBuffer.allocate(16);
SocketChannel sc = (SocketChannel)key.channel();
int k = sc.read(buf);
System.out.println(buf.toString());
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

客户端
package client;
import java.net.*;
import java.nio.channels.*;
import java.io.*;
import java.nio.ByteBuffer;

public class Client
{
public SocketChannel client = null;
public InetSocketAddress isa = null;
Head head = new Head();
static Client ct;
FrmClient frm;

public Client(FrmClient frm)
{
frm = frm;
int result = 0;
try
{
client = SocketChannel.open();
isa = new InetSocketAddress("192.168.0.16",8000);
client.connect(isa);
client.configureBlocking(false);
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}

public int sendHead(byte[] pkghead)
{
int nBytes = -1;

try
{
ByteBuffer buffer = ByteBuffer.wrap(pkghead);
nBytes = client.write(buffer);
}
catch (IOException e)
{
e.printStackTrace();
}
return nBytes;
}

public String readHead(String str)
{
byte temp[] = new byte[4];
int nBytes ;

try
{
ByteBuffer buffer = ByteBuffer.wrap(temp);
nBytes = client.read(buffer);
}
catch (IOException e)
{
e.printStackTrace();
}
return str = str +":"+sys_conver.get_int(temp) + "\n";
}

public void readMsg()
{
String str = null;
str = str + readHead("pkgLen");
str = str + readHead("pkgCmd");
str = str + readHead("pkgStatus");
str = str + readHead("pkgSeq");
frm.jTextArea1.append(str);
}


public void sendMsg()
{
try
{
ByteBuffer buf = ByteBuffer.allocate(16);
buf.putInt(10);
buf.putInt(20);
buf.putInt(30);
buf.putInt(40);
buf.flip();
int nbytes = client.write(buf);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

1、客户端程序可以连上来,但发送一次之后,发送第2次,服务器就出问题了,主要是在run()方法中的while (selector.select() > 0)这句上,本来selector.select()应该是阻塞的,但第2次发送后,就不阻塞了,立刻返回,而且为false。请问这是为什么?

2、连第二个客户端的时候,程序也没有检测到,key.isAcceptable()始终为false,是怎么回事?
...全文
334 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hodex 2003-06-15
  • 打赏
  • 举报
回复
吗的,真是不打不相识啊
昨天在篮球场上看见两个队员因范规动作打了一顿,结果散场后两个人然互相拥抱表示歉意。
今天在网上又见一例,呵呵
XKP 2003-05-31
  • 打赏
  • 举报
回复
to meizizi(怪怪) :
在这里我先要谢谢你的夸奖
不过···我这个人的脾气特差······
前几天因为发帖子骂人信誉分被扣了4分····
我正在努力改正中···

to BrainA(小包) :
分数当然不是什么问题,关键是信誉分会被扣得很惨,要是信誉分太低以后别人看到你发贴
还以为你是一个常常不揭帖的人,那就糟糕了,而且那样也会被板柱封帐号,划不来

呵呵,我的油箱是xukaipin@21cn.com不过21cn好像马马虎虎,有的时候
还有问题,所以现在我都不怎么上去了,一上去就是垃圾邮件·····
BrainA 2003-05-31
  • 打赏
  • 举报
回复
哈哈~~~~,算了。

刚才有些生气,看了你写的这个,觉得我的话的确是过分了些,老兄你别往心里去。

不过我原来的程序就是这么写的,已经在select()外面加上了永真循环,问题不是在这里,我已经自己解决了。可能程序太长了,你没看清楚,不过以后最好先看清楚再发言。

sobingman 2003-05-31
  • 打赏
  • 举报
回复
那到底是什么问题为什么不说说
BrainA 2003-05-31
  • 打赏
  • 举报
回复
呵呵,由于工作比较紧张的关系,在写程序的时候发现一个问题,就想很快的得到解决,但看到有人乱跟帖的时候就会很恼火,心情也会变坏,说出来的话可能也会过分些。以后我会注意。

我只是想把工作做好,至于分数,我不在乎,等我有时间的话,把这个问题整理一篇再贴上来。

谢谢各位的关心了。

所谓不打不相识,XKP,交个朋友怎么样?我的EMAIL:bluegate@21cn.com
meizizi 2003-05-31
  • 打赏
  • 举报
回复
我还地一次看见这样问问题的人!不过 XKP(低等下人) 也是好脾气啊! 服了,真服了!
BrainA(小包) 我觉得你是很厉害,但是和人讨论问题的时候不能这样的,别人来这里不管是为了分也好,为了帮你也好,大家都是在讨论问题,想把问题解决了。 你这样伤害人家总是不对的!
XKP 2003-05-31
  • 打赏
  • 举报
回复
很高兴听到你这样说,我也觉得我说话过分了,你也别往心里去····
其实人激动的时候就容易说错话,我也常常容易激动·····

你的问题既然解决了的话,你可以把解决的方法放在这里,然后让班主帮你揭帖,这样
分数可以给你自己,而且同时别人也可以从你的解决办法里面得到帮助
还不会被扣信誉份,何乐而不为?
XKP 2003-05-31
  • 打赏
  • 举报
回复
哦,看来是个大工程哦,那你慢慢整理吧,不急
呵呵·········

嗯嗯,你说得对,分数不是什么东西,这个我也觉得
应该是这样的,不过对于我来说,还要慢慢学习怎么去放下
这个态度······要慢慢改····
BrainA 2003-05-31
  • 打赏
  • 举报
回复
to XKP:呵呵,分数都不是问题,信誉分也不能代表什么,不要太注重这些分数了,不要被表象所迷惑,要透过现象看本质。

问题我需要整理,总不能把牵涉到业务逻辑的程序发上来吧?

我会把能用的程序发上来,并将原来的错误指出,请大家耐心等待。

XKP 2003-05-30
  • 打赏
  • 举报
回复
哦,补充一下,至于你说到的分数如果只有十分我就不会看的问题
我看帖子的习惯是那个问题我接触过,而且回复的人暂时还很少的话
那么我会进去看看,跟分数无关。
XKP 2003-05-30
  • 打赏
  • 举报
回复
其实你说得挺好的,虽然我是被你骂得很不爽,不过我想也应该要承认
你说的有些话是正确的,我的目的里面的确有你的分数,完全没有错,
而且我也承认我看得挺重的这个分数,我想完全是超越于分数之上的人
毕竟是少数,他们是高人,这个我要承认,而我只是一个俗人,我喜欢
分数·····
至于你说的我是纯粹为了骗分数的话,我想说明一下,我的那一小点的
代码不是乱想的,在JDK14 Tutorial这本书里面的86面,中间的那个地方
有一个例子,说的是怎么用select()的,我是从看到的,而且我对于书本
有一种迷信,总是认为他们写得很好,所以我对于这段代码觉得也很可靠
所以就放到这里,我的本意只是想给你参考一下吧

另一个问题,你觉得我是在挑破离间,我觉得我说的话的确可能让你这样
觉得了,我也没办法。不过我的第二个回复之所以那样说,是因为你对于
(骆驼)说话太不客气了,我不太喜欢你说话的语气。他能够回答你的
问题,就算他回答得不好,回答得不对,再怎么说,人家也是一片好心
你却说别人是胡说八道,这样是有点不太好,至少我觉得不太好,所以在
那里要说两句········

BrainA 2003-05-30
  • 打赏
  • 举报
回复
不是我太过分,实在是XKP说话太让人气愤了,象这种人我最看不惯了。

回答问题的人,不要以为自己就是老大,既然是帮人解决问题,那我希望可以将问题看清楚,对这个问题比较了解的,或进行过研究的,那么来解决一下,大家都是非常感激的。但是象XKP这样骗分的人,我相信在现实生活中,也是被人所痛恨的。分我多的是,给10000都行,但到这里连问题都没看清楚,随便写几句,再说几句风凉话,这样的人本身是一种什么态度?他是在为别人解决问题吗?还是在挑拨离间?其实他的目的早就被我看穿,无非是想骗分,我敢打赌,如果我这题只有10分,他来看才怪呢,这种能力不行,动机又不纯的人,根本就不配谈程序。
danceflash 2003-05-30
  • 打赏
  • 举报
回复
楼主有点过分的说
既然是来问问题,何必这样咄咄逼人呢?
唉~~~
BrainA 2003-05-30
  • 打赏
  • 举报
回复
自己搞定了。

TO XKP:
不要以为没你帮忙就搞不定了。再奉劝你一句,不要没看清题目就乱回答别人的问题,别以为这样就能赚点分,象你这样的人我见多了,本事没有,就只会吹牛,靠骗人吃饭,你干脆回家吃软饭算了,就怕你连吃软饭的本钱都没有。KAO!

baba6 2003-05-29
  • 打赏
  • 举报
回复
问问题这么问的,你是头一个
yesry 2003-05-29
  • 打赏
  • 举报
回复
gz
XKP 2003-05-29
  • 打赏
  • 举报
回复
呵呵
你是高手
你是天才
有本事就不要到这里来问
有本事自己写啊
有本事写了有问题不要来这里啊
就你这种态度,问鬼会跟你说
BrainA 2003-05-29
  • 打赏
  • 举报
回复
to lotofu:
对SocketChannel根本就不怎么了解,就说我的程序有问题,你可以问遍天下人,int k = sc.read(buf);这句怎么可能有问题?我来教教你吧,SocketChannel的read(ByteBuffer buf)方法返回读到的字节数,并将读到的内容放到buf中,这个方法可能会有一个IOException产生。

to XKP:
程序没看清楚就别乱发言,好好看看,原来程序的run()方法中,第一句是什么?你给的提示跟原来的有什么不同?
BrainA 2003-05-28
  • 打赏
  • 举报
回复
呵呵,老大,你这写法跟原来的有什么区别?都是判断select()方法返回的值是否大于0。不是这个问题。你们把程序编译一下,然后运行,然后跟例程对照,可能可以找到答案
XKP 2003-05-28
  • 打赏
  • 举报
回复
to lotofu(骆驼):
必须声明一下,我那样说可不是在打击你······
我只是对有些人问问题的态度有点不同认可而已········
加载更多回复(7)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧