一个很简单,但又很棘手的关于socket问题

tlq2000 2004-04-22 06:43:45
在一个套字节中其代码于下:
public void a(){
while (selector.select() > 0) {

Set selectedKeys = selector.selectedKeys();
Iterator readKeys = selectedKeys.iterator();
while (readKeys.hasNext()) {
selKey = (SelectionKey) readKeys.next();

readKeys.remove();
if (selKey.isAcceptable()) {
ServerSocketChannel ServerClient = (ServerSocketChannel) selKey.
channel();
try {
client = ServerClient.accept();
client.configureBlocking(false);
client.register(selector,
SelectionKey.OP_READ | SelectionKey.OP_WRITE);

}
catch (Exception e) {
e.printStackTrace();
}

}
}
}
}
如果有3个客户段同时连接,则产生3个client我想每一次while循环时在函数a外取得一个client对象但又不想结束循环,大侠,该程序该怎么改(只要是功能不变可以修改程序结构(程序功能:当有客户端和他连接是产生client对象,接着又循环等待)),能想到好方法的,我拜他为师。有用多线和socket编程的请留下联系方式,我的msn为tlq2260@hotmail.com欢迎大家加入。
...全文
62 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
buaaaladdin 2004-04-22
  • 打赏
  • 举报
回复
嗯,同意楼上。
napoleonz 2004-04-22
  • 打赏
  • 举报
回复
老兄,结构做成多线程! 以ServerSocket.accept();为开辟线程的判断标志. 每当有client请求后,就在while()循环里开辟一个单独的线程, 然后在循环while() . 如果没有client请求,在,主线程在ServerSocket.accept()处等待! 当然,开辟的这个线程要接收一个参数,那就是clientsocket=new ServerSocket(Port); 以前我做了一个和你类似的服务器程序,不放参考一下!

/**
* 服务器接收客户端数据的方法,里面是一个无限循环等待被请求的过程
*/
public void ServerClient() {
try {
try{
//创建服务器socket
//声明一个字符串变量存储所取出的服务器端口号的字符串形式
String strserverport=null;
strserverport=Integer.toString(serverport);
//判断从配置文件中读取的服务器端口号是否合法
if(strserverport!=null && strserverport.length()==4){
server = new ServerSocket(serverport); }else{//如果不法,责默认服务器端口号为1234 server=new ServerSocket(1234);
}//判断服务器端口号结束
}catch(Exception e){
//如果设置端口号异常,则提示管理员,重启服务器
System.out.println("设置服务器监听端口号有异常");
e.printStackTrace();
}//end 创建服务器socket

while(true){
//等待客户的连接请求(程序堵塞直到有客户端请求)
Thread.sleep(10);
System.out.println("Wait client request ......");
try{
//这里只接受connect的连接请求,所有数据处理的入口
client = server.accept();

//很关键的一步,给接收的客户端Socket设定接收数据流等待时间的属性
client.setSoTimeout(70000);

//提示客户端的IP地址
System.out.println("ClientIP=: " +client.getInetAddres().getHostAddress()+" connect request");
//声明一个处理客户端传过来的数据处理线程类的实例
receiveMsgFromClient receiveMsgFromClient=new receiveMsgFromClient(client,operatedb);
//启动处理客户端的发送来的数据线程
receiveMsgFromClient.start();
}catch(Exception e){
e.printStackTrace();
}
} //end while(true)
}catch(Exception e){
e.printStackTrace();
System.out.println("Connect client error! Server must be Restart!!!");
//重新启动服务器
}
} //end run()
Acylas 2004-04-22
  • 打赏
  • 举报
回复
接收到一个连接后就将它丢到线程组里面,由多线程处理请求

62,623

社区成员

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

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