之前一直采用.Net编写服务端程序,最近需要切换到Linux平台下,于是尝试采用Java编写数据服务器。TCP异步连接在C#中很容易实现,网上也有很多可供参考的代码。但Java异步TCP的参考资料较少,网上例程多是阻塞多线程方法,由于线程的开销较大,当客户端较多时系统资源的消耗也较大。

综合网上和书本的相关知识,本文给出一个Java TCP异步接收数据的代码示例,并给出相关的注释。

/**
* TcpAsyncServer.java
*/ import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.net.*;
import java.util.Iterator; public class TcpAsyncServer { /*监听端口*/
int port = 6000;
/*缓冲区大小*/
ByteBuffer buffer = ByteBuffer.allocate(1024);
/*其它相关定义*/
Selector selector;
ServerSocketChannel channel;
ServerSocket socket; /*启动*/
public void Start() throws Exception {
/*初始化一个Selector*/
selector = Selector.open();
/*打开通道*/
channel = ServerSocketChannel.open();
/*非阻塞模式*/
channel.configureBlocking(false);
/*本机IP*/
//InetAddress ip = InetAddress.getByName("127.0.0.1");
InetAddress ip = InetAddress.getLocalHost();
System.out.println(ip.toString());
/*绑定IP和端口*/
InetSocketAddress address = new InetSocketAddress(ip,port);
socket = channel.socket();
socket.bind(address);
/*启动监听*/
System.out.println("TCP服务器开始监听...");
Listen();
} /*停止*/
public void Stop() throws Exception {
channel.close();
selector.close();
} /*监听*/
public void Listen() throws Exception {
/*注册接收事件*/
channel.register(selector,SelectionKey.OP_ACCEPT);
/*无限循环*/
while (true) {
selector.select();
/*轮询事件*/
Iterator iter = selector.selectedKeys().iterator();
while (iter.hasNext()) {
SelectionKey key = (SelectionKey)iter.next();
iter.remove();
/*事件分类处理*/
if (key.isAcceptable()) {
ServerSocketChannel ssc = (ServerSocketChannel)key.channel();
SocketChannel sc = ssc.accept();
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ);
System.out.println("新终端已连接:"+ sc.getRemoteAddress());
}
else if (key.isReadable()) {
SocketChannel sc = (SocketChannel)key.channel();
int recvCount = sc.read(buffer);
if (recvCount > 0) {
byte[] arr = buffer.array();
System.out.println(sc.getRemoteAddress() + "发来数据: "+ new String(arr));
buffer.flip();
}
else {
sc.close();
}
buffer.clear();
} else { } } } } }
/**
* server.java
*/ public class server { public static void main(String[] args) throws Exception { TcpAsyncServer tcpServer = new TcpAsyncServer();
tcpServer.Start(); }
}

效果演示:

1. 利用TCP工具发送数据

3. 接收数据

Java TCP异步数据接收的更多相关文章

  1. Java TCP发送与接收

    IP地址?端口号?主机名? 什么是Socket? 什么是UDP? 什么是TCP? UDP和TCP区别? 以上问题请自行百度,有标准解释,此处不再赘述,直接上干货! 实例: 发送端: public cl ...

  2. 项目总结22:Java UDP Socket数据的发送和接收

    项目总结22:Java UDP Socket数据的发送和接收 1-先上demo 客户端(发送数据) package com.hs.pretest.udp; import java.io.IOExcep ...

  3. 网络编程--使用TCP协议发送接收数据

    package com.zhangxueliang.tcp; import java.io.IOException; import java.io.OutputStream; import java. ...

  4. jquery的ajax异步请求接收返回json数据

    http://www.jb51.net/article/51122.htm jquery的ajax异步请求接收返回json数据方法设置简单,一个是服务器处理程序是返回json数据,另一种就是ajax发 ...

  5. 页面ajax请求传参及java后端数据接收

    js ajax请求传参及java后端数据接收 Controller: package com.ysl.PassingParameters.controller; import java.util.Li ...

  6. vue父组件异步数据子组件接收遇到的坑

    大家都知道父组件给子组件传值,子组件给父组件传值,两者通信并不难,官网上也有给案例,但是如果子组件想拿到父组件的异步数据,常规的写法是不行的,下面我记录我常用的两者写法: 方法1: 子组件用v-if, ...

  7. tcp输入数据 慢速路径处理 && oob数据 接收 && 数据接收 tcp_data_queue

    大致的处理过程 TCP的接收流程:在tcp_v4_do_rcv中的相关处理(网卡收到报文触发)中,会首先通过tcp_check_urg设置tcp_sock的urg_data为TCP_URG_NOTYE ...

  8. TCP同步传送数据示例以及可能出现问题分析

    TCP传送数据可以分为同步传送和异步传送,首先这里使用了TCP的同步传送方式,学习了TCP同步传送数据的原理. 同步工作方式是指利用TCP编写的程序执行到监听或者接受数据语句的时候,在未完成当前工作( ...

  9. 一种C# TCP异步编程中遇到的问题

    最近在维护公司的一个socket服务端工具,该工具主要是提供两个socket server服务,对两端连接的程序进行数据的透明转发. 程序运行期间,遇到一个问题,程序的一端是GPRS设备,众所周知,G ...

随机推荐

  1. zabbix 修改输出web前端图片的日期格式

    zabbix并没有给定一个全局或者用户级别的时间格式定义方式. 实在看不惯的话,可以自己修改源代码来实现修改. 暂时研究了半小时,先把展示图片修改了. 后续有更严谨的方案,再更新此文吧. ------ ...

  2. 关于BEA-000402和BEA-000438

    OS:rh5 64位 JDK:1.5 64位 weblogic:9.2.3 jar 应用程序部署后,启动受管服务器报如下警告和错误: 这个问题导致系统性能下降,打开weblogic控制台各项功能和应用 ...

  3. window上Python环境的搭建

    python下载地址:https://www.python.org/ 下载安装 安装完成后配置环境变量,在我的电脑右键属性点高级设置 双击 环境变量 里面第二框找到 path双击     在pytho ...

  4. Hdfs增量导入小文件合并的思路

    1.使用mr进行合并 2.使用getmerge 将文件拉取到本地,再上传到hdfs,注意nl参数 3.使用appendToFile 4.使用hadoop提供的打包压缩技术 Usage: hadoop ...

  5. 《Code Complete》ch.15 使用条件语句

    WHAT? 条件语句指if.else.case.switch,循环语句指for.while WHY? 不用条件语句你写得出代码吗? HOW? if-then 正常情况放在异常情况之前 执行频率高的情况 ...

  6. 使用django表单,使网页添加上传文件,并分析文件。

    开发环境是: apache + python + django+ eclipse(开发环境) 欲达到目的: 在网页上,添加上传文件控件.然后读取csv文件,并分析csv文件. 操作步骤: django ...

  7. Win2008远程多用户登陆的配置方法 另附详细设置: Windows server 2008 R2实现多用户远程连接

    Win2008远程多用户登陆的配置方法     在使用Windows 2008远程登录功能时,如果需要进行多用户登录,可以采用以下配置方法: 首先要启用远程桌面这一功能:右击“我的电脑”→ 属性 → ...

  8. 一点点seo

    Search Engine Optimization(搜索引擎优化 ),是较为流行的网络营销方式. 主要目的是增加特定关键字的曝光率.有站外SEO和站内SEO.通过了解各类搜索引擎如何抓取互联网页面. ...

  9. POJ1298_The Hardest Problem Ever_最难的问题_Caesar 密码_C++

    题目:http://poj.org/problem?id=1298 好吧,给了题目也看不懂……给出翻译(题目名翻译是:最难的问题,233333) 这一看就是老师给出题解: 然而没有什么用哈 最快的办法 ...

  10. git添加文件过滤

    操作流程 touch .gitignore vi .gitignore,添加需要过滤的文件或目录 git commit 出现问题 假如.gitignore里面添加file,而git库中已经存在file ...