現在針對阻塞,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); } }}