来自孙卫琴的Java网络编程,第四章,这段代码感觉有问题啊,第45行的 synchronized(gate){}

这句代码怎么理解啊,可以这样写吗?

1.[文件] EchoServer.java ~ 4KB     下载(19)

package thread2;

import java.io.*;

import java.nio.*;

import java.nio.channels.*;

import java.nio.charset.*;

import java.net.*;

import java.util.*;

public class EchoServer{

private Selector selector = null;

private ServerSocketChannel serverSocketChannel = null;

private int port = 8000;

private Charset charset=Charset.forName("GBK");

public EchoServer()throws IOException{

selector = Selector.open();

serverSocketChannel= ServerSocketChannel.open();

serverSocketChannel.socket().setReuseAddress(true);

serverSocketChannel.socket().bind(new InetSocketAddress(port));

System.out.println("服务器启动");

}

public void accept(){

for(;;){

try{

SocketChannel socketChannel = serverSocketChannel.accept();

System.out.println("接收到客户连接,来自:" +

socketChannel.socket().getInetAddress() +

":" + socketChannel.socket().getPort());

socketChannel.configureBlocking(false);

ByteBuffer buffer = ByteBuffer.allocate(1024);

synchronized(gate){

selector.wakeup();

socketChannel.register(selector,

SelectionKey.OP_READ |

SelectionKey.OP_WRITE, buffer);

}

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

}

}

private Object gate=new Object();

public void service() throws IOException{

for(;;){

synchronized(gate){}

int n = selector.select();

if(n==0)continue;

Set readyKeys = selector.selectedKeys();

Iterator it = readyKeys.iterator();

while (it.hasNext()){

SelectionKey key=null;

try{

key = (SelectionKey) it.next();

it.remove();

if (key.isReadable()) {

receive(key);

}

if (key.isWritable()) {

send(key);

}

}catch(IOException e){

e.printStackTrace();

try{

if(key!=null){

key.cancel();

key.channel().close();

}

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

}

}//#while

}//#while

}

public void send(SelectionKey key)throws IOException{

ByteBuffer buffer=(ByteBuffer)key.attachment();

SocketChannel socketChannel=(SocketChannel)key.channel();

buffer.flip(); //把极限设为位置

String data=decode(buffer);

if(data.indexOf("\n")==-1)return;

String outputData=data.substring(0,data.indexOf("\n")+1);

System.out.print(outputData);

ByteBuffer outputBuffer=encode("echo:"+outputData);

while(outputBuffer.hasRemaining())

socketChannel.write(outputBuffer);

ByteBuffer temp=encode(outputData);

buffer.position(temp.limit());

buffer.compact();

if(outputData.equals("bye\r\n")){

key.cancel();

socketChannel.close();

System.out.println("关闭与客户的连接");

}

}

public void receive(SelectionKey key)throws IOException{

ByteBuffer buffer=(ByteBuffer)key.attachment();

SocketChannel socketChannel=(SocketChannel)key.channel();

ByteBuffer readBuff= ByteBuffer.allocate(32);

socketChannel.read(readBuff);

readBuff.flip();

buffer.limit(buffer.capacity());

buffer.put(readBuff);

}

public String decode(ByteBuffer buffer){ //解码

CharBuffer charBuffer= charset.decode(buffer);

return charBuffer.toString();

}

public ByteBuffer encode(String str){ //编码

return charset.encode(str);

}

public static void main(String args[])throws Exception{

final EchoServer server = new EchoServer();

Thread accept=new Thread(){

public void run(){

server.accept();

}

};

accept.start();

server.service();

}

}

/****************************************************

* 作者:孙卫琴 *

* 来源:<> *

* 技术支持网址:www.javathinker.org *

***************************************************/

java.nio包网络编程_Java NIO网络编程相关推荐

  1. java网络编程_Java基础 网络编程

    主要内容 软件架构CS/BS 网络通信三要素 TCP通信 Socket套接字 ServerSocket 教学目标 能够辨别UDP和TCP协议特点 能够说出TCP协议下两个常用类名称 能够编写TCP协议 ...

  2. java的网络功能与编程_Java的网络功能与编程(转载)

    Java的 网络 功能与编程 徐迎晓 (上海大学计算中心25#) 摘  要:Java语言是Internet上最热门的编程语言,本文针对 Java的 网络 功能,对Java从 网络 上获取图象.声音. ...

  3. java 基础包的功能_Java 8的功能基础

    java 基础包的功能 Java 8彻底改变了Java. 它很可能是过去10年中最重要的Java版本. 有很多新功能,包括默认方法,方法和构造函数引用以及lambda, 仅举几例 . 更有趣的功能之一 ...

  4. java.io包对象读写_java.io 包中的____________和____________类主要用于对对象(Object)的读写_学小易找答案...

    [多选题]连铸钢水成分控制的要求有( ). [单选题]起动机用直流电动机将电能转化为 [单选题]下列关于我国少数民族传统禁忌的说法中,错误的是( ). [多选题]下列选项中 , 属于表单控件的是 ( ...

  5. java.lang包怎么用_java.lang.io包的使用

    1 String source = "ABCDEF123456";2 int mid = source.length() / 2;3 4 ByteArrayInputStream ...

  6. Java面向事件编程_Java面向事件编程

    基于Java的基础课程给教师和学生都提出了新的挑战.虽然Java要比C++简单,但Java作为一种具有大量标准库的面向对象语言这一事实既带来了新的复杂性,同时也带来了新的机会.. 本书作为计算机科学基 ...

  7. java链式编程_Java 链式编程 和 lombok 实现链式编程

    一.链式编程定义 链式编程的原理就是返回一个this对象,就是返回本身,达到链式效果. 二.jdk中 StringBuffer 源码 我们经常用的 StringBuffer 就是 实现了链式的写法. ...

  8. java socket接口文档_Java进阶 - 网络编程、Socket、函数式接口、常用的函数式接口...

    1.网络通信协议 网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信.这就好比在道路中行驶的汽车一定要遵守交通规则一样,协议中对数据的传输格式.传输速率.传输步骤 ...

  9. java 高级网络编程_java高级网络编程—客户端与服务器

    [Java] 纯文本查看 复制代码package lesson_2017; import java.io.BufferedReader; import java.io.IOException; imp ...

最新文章

  1. 如果每个人都是一个粒子…… | 从物理学中寻找社会规律
  2. LINQ To DataSet 几个常用示例
  3. 16windows_16_combo组合框
  4. airflow零基础入门
  5. Linux——JDK的部署
  6. Angular - ng-repeat高级用法
  7. word文档被锁定无法编辑的解决方法
  8. Oracle学习 第18天 .NET连接Oracle
  9. 假的!微信上询问商品会被封号 微信朋友圈公布1月份十大谣言
  10. php-ews发送邮件,使用php-ews在特定日期之后收到电子邮件(Exchange Web服务)
  11. java设计模式-State模式
  12. 局域网中的几大分类,包含以太网,FDDI网,令牌环网,ATM网
  13. MATLAB入门学习笔记8
  14. 成本会计的概念、产品成本核算的要求、产品成本核算的对象与成本项目、产品成本的归集和分配(可能考判断)、产品成本计算方法 (三种:产品的品种(品种法),批次(分批法),步骤(分步法))
  15. python给pdf加图片签名_如何在PDF中添加文本和图像(例如签名)?
  16. 2021年茶艺师(初级)考试题库及茶艺师(初级)考试技巧
  17. 光纤熔接机市场现状及未来发展趋势
  18. 2022-2027年中国开采沙石行业发展监测及投资战略研究报告
  19. java调用jacob_使用Java中的JACOB运行个人宏
  20. timer延迟1us_STM32 Systick定时器在实现1us延时的问题与解决

热门文章

  1. 【HDOJ】1005 Number Sequence_天涯浪子_新浪博客
  2. Zabbix通过JMX监控Java应用
  3. UI设计中switch开关设计总结
  4. 关于error: possibly undefined macro: AC_PROG_LIBTOOL问题解决
  5. 如何用强化学习优化广告投放中的A/B Test
  6. sEMG项目总结(1)灵巧手控制系统
  7. 一名优秀的嵌入式软件工程师所具备知识技能
  8. UVA 1001 Say Cheese 奶酪里的老鼠(最短路,floyd)
  9. sketchup 图片转模型_图片转换su模型的速成方法-建筑软件-筑龙建筑设计论坛
  10. python实现多语言语种识别_python langid实现语种识别