现在针对阻塞,java有专门的nio概念。 如果是框架来实现,可以用netty或者apache的mina。这两个都是nio的框架。
⑵ Apache的mina的服务端,接收到帧数据后,怎么向客户端反馈新的数据包
include <QtCore/QCoreApplication>
#include <QAxObject>
#include <Windows.h>
int main(int argc, char *argv[])
{
//OleInitialize(0);
//CoInitialize(0);
QCoreApplication a(argc, argv);
QAxObject *asdfg = new QAxObject("Excel.Application");
return a.exec();
}
⑶ java.nio相关及apache的mina框架求助
你就别置顶了 这么多天了!花点时间花点时间自己也就做出来了!
不就是socket通讯嘛,网上类似 java.nio断点续传的没发现的话,那其他语言的断点续传的多的是啊? 原理就是 比如说客户端读取一段文件 1000字节 同时建立一个记录文件 记录传输状态
比如说 传输中 已完成之类的状态
服务端接收文件,写到一个临时文件里,并建立一个记录文件,记录接收到哪儿了。
如此循环,一直到完成。 然后将这临时文件改为目标文件名
如果通讯有中断,客户端再发起socket连接,第一步就是读取记录文件,如果有未完成的文件传输,就请求服务端返回服务端接收文件的位置。 客户端就知道需要从哪儿开始读。继续读 继续发送
⑷ apache mina 是长连接还是短连接
长短都有。给你示例:
1长连接客户端
使用java.net.Socket来实现向服务端建立连接。Socket建立后一直保持连接,从服务端接收到数据包后直接将原文返回。
public class TcpKeepAliveClient {
private String ip;
private int port;
private static Socket socket = null;
private static int timeout = 50 * 1000;
public TcpKeepAliveClient(String ip, int port) {
this.ip = ip;
this.port = port;
}
public void receiveAndSend() throws IOException {
InputStream input = null;
OutputStream output = null;
try {
if (socket == null ||socket.isClosed() || !socket.isConnected()) {
socket = new Socket();
InetSocketAddress addr = new InetSocketAddress(ip, port);
socket.connect(addr, timeout);
socket.setSoTimeout(timeout);
System.out.println("TcpKeepAliveClientnew ");
}
input = socket.getInputStream();
output = socket.getOutputStream();
// read body
byte[] receiveBytes = {};// 收到的包字节数组
while (true) {
if (input.available() > 0) {
receiveBytes = new byte[input.available()];
input.read(receiveBytes);
// send
System.out.println("TcpKeepAliveClientsend date :" +new String(receiveBytes));
output.write(receiveBytes, 0, receiveBytes.length);
output.flush();
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("TcpClientnew socket error");
}
}
public static void main(String[] args) throws Exception {
TcpKeepAliveClient client = new TcpKeepAliveClient("127.0.0.1", 8002);
client.receiveAndSend();
}
}
2短连接客户端
服务启动
public class MinaShortClient {
private static final int PORT = 8001;
public static void main(String[] args) throws IOException,InterruptedException {
IoConnector connector = new NioSocketConnector();
connector.getSessionConfig().setReadBufferSize(2048);
connector.getFilterChain().addLast("logger", new LoggingFilter());
connector.getFilterChain().addLast("codec", newProtocolCodecFilter(newTextLineCodecFactory(Charset.forName("UTF-8"))));
connector.setHandler(new MinaShortClientHandler());
for (int i = 1; i <= 10; i++) {
ConnectFuture future = connector.connect(new InetSocketAddress("127.0.0.1",PORT));
future.awaitUninterruptibly();
IoSession session =future.getSession();
session.write(i);
session.getCloseFuture().awaitUninterruptibly();
System.out.println("result=" + session.getAttribute("result"));
}
connector.dispose();
}
}
消息处理
public class MinaShortClientHandler extends IoHandlerAdapter{
private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());
public MinaShortClientHandler() {
}
@Override
public void sessionOpened(IoSession session) {
}
@Override
public void messageReceived(IoSession session, Object message) {
logger.info("Messagereceived in the client..");
logger.info("Message is:" + message.toString());
session.setAttribute("result", message.toString());
session.close(true);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) {
session.close(true);
}
}
通过本文中的例子,Apache Mina在服务端可实现TCP协议长连接和短连接。在客户端只实现了短连接模式,长连接模式也是可以实现的(在本文中还是采用传统的java Socket方式)。两个服务端之间通过共享内存的方式来传递连接对象也许有更好的实现方式。
⑸ 使用Apache mina sshd构建sftp server如何托管配置文件
1. 介绍
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。
2. sftp搭建
2.1查看openssl的版本
ssh -V
###使用ssh –V命令来查看openssh的版本,版本必须大于4.8p1,低于这个版本需要升级。
2.2创建sftp组
groupadd sftp
2.3创建一个sftp用户,用户名为mysftp,密码为mysftp
useradd –g sftp –s /bin/false mysftp //该用户不能通过sshd登陆到系统
passwd mysftp
2.3sftp组的用户的home目录统一指定到 chaodiquan.com /data/sftp下,按用户名区分,这里先新建一个mysftp目录,然后指定mysftp的home为/data/sftp/mysftp
mkdir -p /data/sftp/mysftp
usermod –d /data/sftp/mysftp mysftp
2.4配置sshd_config
文本编辑器打开 /etc/ssh/sshd_config
vi /etc/ssh/sshd_config
找到如下这行,用#符号注释掉。
# Subsystem sftp /usr/libexec/openssh/sftp-server
在文件最后面添加如下几行内容,然后保存。
Subsystem sftp internal-sftp
###配置一个外部子系统(例如,一个文件传输守护进程)。仅用于SSH-2协议。值是一个子系###统的名字和对应的命令行(含选项和参数)。比如"sftp /usr/libexec/openssh/sftp-server"。,###这里配置为内部的
Match Group sftp
#限定只有sftp组的才能访问
ChrootDirectory /data/sftp/%u
###设定属于用户组sftp的用户访问的根文件夹
ForceCommand internal-sftp
###强制执行这里指定的命令而忽略客户端提供的任何命令。这个命令将使用用户的登录###shell执行(shell -c)。这可以应用于 shell 、命令、子系统的完成,通常用于 Match 块中。###这个命令最初是在客户端通过 SSH_ORIGINAL_COMMAND 环境变量来支持的。
AllowTcpForwarding no
###是否允许TCP转发,默认值为"yes", 禁止TCP转发并不能增强安全性,除非禁止了用户###对shell的访问,因为用户可以安装他们自己的转发器。
X11Forwarding no
###是否允许进行 X11
转发。默认值是"no",设为"yes"表示允许。如果允许X11转发并且sshd(8)代理的显示区被配置为在含有通配符的地址(X11UseLocalhost)上监听。那么将可能有额外的信息被泄漏。由于使用X11转发的可能带来的风险,此指令默认值为"no"。需要注意的是,禁止X11转发并不能禁止用户转发X11通信,因为用户可以安装他们自己的转发器。
如果启用了 UseLogin ,那么X11转发将被自动禁止。
2.5设定Chroot目录权限
chown root:sftp /data/sftp/mysftp
chmod 755 /data/sftp/mysftp
2.6建立SFTP用户登入后可写入的目录
照上面设置后,在重启sshd服务后,用户mysftp已经可以登录。但使用chroot指定根目录后,根应该是无法写入的,所以要新建一个目录供mysftp上传文件。这个目录所有者为mysftp,所有组为sftp,所有者有写入权限,而所有组无写入权限。命令如下:
mkdir /data/sftp/mysftp/upload
chown mysftp:sftp /data/sftp/mysftp/upload
chmod 755 /data/sftp/mysftp/upload
2.7重启sshd服务
service sshd restart
⑹ Apache Mina 可以传输list集合对象么
试试byte流
⑺ apache mina 怎么接受xml文件 TextLineCodecFactory 只能接受一行
自定义decode与encode
或者发送前把回车换行替换
⑻ java mina 数据发送前怎样判断连接状态
1 Mina基本开发知识
1.1 非阻塞模式
JavaNIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源(传统socket通讯服务器设计模式)的。
Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。
Java NIO出现不只是一个技术性能的提高,你会发现网络上到处在介绍它,因为它具有里程碑意义,从JDK1.4开始,Java开始提高性能相关的功能,从而使得Java在底层或者并行分布式计算等操作上已经可以和C或Perl等语言并驾齐驱。
如果你至今还是在怀疑Java的性能,说明你的思想和观念已经完全落伍了,Java一两年就应该用新的名词来定义。从JDK1.5开始又要提供关于线程、并发等新性能的支持,Java应用在游戏等适时领域方面的机会已经成熟,Java在稳定自己中间件地位后,开始蚕食传统C的领域。
NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,放心,包准能够读到,接着我们可以处理这些数据。Selector内部原理实际是在做一个对所注册的channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个channel有所注册的事情发生,比如数据来了,他就会站起来报告,交出一把钥匙,让我们通过这把钥匙(SelectionKey表示 SelectableChannel 在 Selector 中的注册的标记。 )来读取这个channel的内容.
1.2 什么是mian
现在已经是World Wide Web的时代,无数的web应用框架被创造出来从而大大的提高了web开发的速度。抛开WWW的这个优势,我们知道还有很多协议是HTTP协议所无法替代的。有时,我们仍然需要构造c/s应用来实现适当的协议。
你有没有曾经使用java或者其他语言实现过某个协议栈?就像你所经历过的那样,编写网络应用即使对于有经验的开发者也不是容易的事情。这归咎于以下几个方面:
* 没有为开发者设计的合适的网络应用框架.
* 使你无法在有限的时间内创建你的应用.
* 网络I/O编码,消息的编/解码,业务逻辑常常纠缠在一起.
* 使程序失去可维护性和可复用性
* 网络应用难于进行单元测试
* 你失去了敏捷性
MINA是一个网络应用框架,在不牺牲性能和可扩展性的前提下用于解决上面的所有问题。
1.3 几个接口
IoAcceptor执行所有底层IO,将他们翻译成抽象的IO事件,并把翻译
⑼ 如何使用Java的网络库Mina
(1)package mina.client;import java.net.InetSocketAddress;import java.nio.charset.Charset;import java.util.Scanner;import mina.common.BaseConfig;import org.apache.mina.core.future.ConnectFuture;import org.apache.mina.core.service.IoConnector;import org.apache.mina.core.session.IoSession;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.prefixedstring.PrefixedStringCodecFactory;import org.apache.mina.filter.logging.LoggingFilter;import org.apache.mina.transport.socket.nio.NioSocketConnector;public class MinaTimeClient { public static void main(String[] args) { //用于TCP/TP连接的NioSocketConnector类 IoConnector connector = new NioSocketConnector(); //增加日志过滤链 connector.getFilterChain().addLast("logger", new LoggingFilter()); //增加协议过滤链,一个Filter用于转换二进制数据或者特定的协议数据为消息对象 connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter(new PrefixedStringCodecFactory(Charset .forName("UTF-8")))); //设置会处理所有被service管理的连接的handler connector.setHandler(new TimeClientHander()); //连接到特定的remote地址,InetSocketAddress封装IP和port,Java网络编程规范, //不提供直接的ip地址和端口的connect方法 ConnectFuture connectFuture = connector.connect(new InetSocketAddress( "127.0.0.1", BaseConfig.PORT)); // 等待建立连接 connectFuture.awaitUninterruptibly(); System.out.println("连接成功"); //返回代表两端连接的一个对象,有读写方法以及获取本端网络设置的相关方法 IoSession session = connectFuture.getSession(); Scanner sc = new Scanner(System.in); boolean quit = false; //一直读取输入,并发送到对端(服务端),直到输入quit while (!quit) { String str = sc.next(); if (str.equalsIgnoreCase("quit")) { quit = true; }//利用session写出数据 session.write(str); } // 关闭 if (session != null) { if (session.isConnected()) { session.getCloseFuture().awaitUninterruptibly(); } //Releases any resources allocated by this service connector.dispose(true); } }}