之前一直采用.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. char 汉字

    Unicode/UCS总结: UCS和Unicode使用最大32bit来表示字符(它的范围很大,但不一定全使用,常使的是UCS-2),它用2~4个字节的空间描述了已知的接近全部的字符(并且仍在更新,还 ...

  2. Java如何获取文件编码格式

    1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK.  按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原 ...

  3. Java中Map的用法

    Map的一般用法 1.声明一个Map : Map map = new HashMap(); 2 .向map中放值 ,注意: map是key-value的形式存放的,如: map.put("s ...

  4. 使用jQuery解析xml时command节点解析失败

    jQuery版本1.8.3 待解析的xml为: <message><user><command>Login</command></message& ...

  5. SQL 语句转换格式函数Cast、Convert 区别

    SQL 语句转换格式函数Cast.Convert CAST和CONVERT都经常被使用.特别提取出来作为一篇文章,方便查找. CAST.CONVERT都可以执行数据类型转换.在大部分情况下,两者执行同 ...

  6. 在Eclipse ee中成功使用jQuery UI插件

    关键代码截图如下:

  7. 在点击HOME键时, 在点击icon回到原来的应用。

    参考资料: http://www.linuxidc.com/Linux/2012-01/51332.htm

  8. ThreadLocal意为变量副本

    http://blog.csdn.net/lufeng20/article/details/24314381

  9. ASP.Net软件工程师基础(三)

    1.多态 答: (1)虚方法 public class Child : Person { public void Speach() { base.Speach(); } public virtual ...

  10. 推荐一个PHP在线代码运行的网站

    地址:http://www.manongjc.com/runcode 该网站可以运行php代码.html代码.js代码, 对于初学者来说,免去了安装环境这一步.