java传送字符到前端_mina实现服务器与客户端传送对象或字符串
NIO是Java New IO的簡稱,在JDK1.4版本中引入該API,從那時起,就被廣泛的應用。通過使用她,可以通過非阻塞的方式進行IO操作。
具體當你需要比較多的并發,而且并發的需要做長連接時,傳統的連續池可能會滿足不了你的需求,必竟如果連接池維護過多的連接 時,對于虛擬機的要求比較高,但如果過少連接的話,阻塞的線程會讓程序處理的非常慢,這時,你就可以考慮一下使用NIO框架MINA。
服務端代碼:
package cn.mina;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
/**
* @author html580
* @site http://www.html580.com
*/
public class MainServer {
// 設置端口
public static int PORT = 8991;
/**
* @param args
* @throws IOException
* @author html580
*/
public static void main(String<> args) throws IOException {
System.out.println("服務創建中");
// 創建一個非阻塞的的server端socket,用NIO
SocketAcceptor acceptor = new NioSocketAcceptor();
// 創建接收數據的過濾器
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
/*
* 這里注意點: 1:TextLineCodecFactory設置這個過濾器一行一行(/r/n)的讀取數據
* 2.ObjectSerializationCodecFactory一般接收的是對象等形象,以對象形式讀取
*/
// chain.addLast("chain", new ProtocolCodecFilter(new
// TextLineCodecFactory()));
chain.addLast("chain", new ProtocolCodecFilter(
new ObjectSerializationCodecFactory()));
// 設定服務器端消息處理器.:就是我們創建的TimeServerHandler對象
acceptor.setHandler(new MinaServerHandler());
acceptor.bind(new InetSocketAddress(PORT));
System.out.println("MINS 服務器監聽的服務端口為" + PORT);
}
}類似于客戶端,用于處理客戶端請求的類為MinaServerHandlerpackage cn.mina;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
/**
* @author html580
* @site http://www.html580.com
*/
public class MinaServerHandler extends IoHandlerAdapter {
/****
* session打開時,調用
*/
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("服務端sessionOpened..." + session.getRemoteAddress());
}
/***
* 連接關才時調用
*/
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("服務端sessionClosed...........");
}
/**
* 如果出異常,就關閉session
*/
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
cause.printStackTrace();
session.close(true);
}
/**
* 收到客戶端信息時調用
*/
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
System.out.println("服務端收信息...");
Message msg = (Message) message;
System.out.println("服務端->收到客戶機發來的消息: " + msg.getMsgBody());
msg.setMsgBody("服務端回應客戶機發來的消息" + msg.getMsgBody());
session.write(msg);
System.out.println("服務端回寫信息...");
}
/***
* 空閑時調用
*/
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
System.out.println("服務端 sessionIdle " + session.getIdleCount(status));
}
}客戶端代碼
package cn.mina;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
/**
* @author html580
* @site http://www.html580.com
*/
public class MinaClient {
private static int PORT = 8991;
/**
* @param args
* @throws IOException
*/
public static void main(String<> args) throws IOException {
System.out.println("開始接服務器");
// 創建TCP/IP的連接
NioSocketConnector connector = new NioSocketConnector();
// 創建接收數據的過濾器
DefaultIoFilterChainBuilder chain = connector.getFilterChain();
/*
* 這里注意點:
* 1:TextLineCodecFactory設置這個過濾器一行一行(/r/n)的發送/讀取數據
* 2.ObjectSerializationCodecFactory一般發送/接收的是對象等形象,以對象形式讀取
*/
//chain.addLast("myChain",new ProtocolCodecFilter(new TextLineCodecFactory()));
chain.addLast("myChain", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
Message msg = new Message("TObject");
// 設置處理的類
connector.setHandler(new MinaClientHandler(msg));
// 設置時間
connector.setConnectTimeoutMillis(300000);
// 開始連接服務器
ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",PORT));
// 等待連接結束
cf.awaitUninterruptibly();
cf.getSession().getCloseFuture().awaitUninterruptibly();
connector.dispose();
}
}客戶端用MinaClientHandler來處理發送的信息,MinaClientHandler類必須繼承IoHandlerAdapter,類似于Struts中處理action的類必須繼承Actionpackage cn.mina;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
/**
* @author html580
* @site http://www.html580.com
*/
public class MinaClientHandler extends IoHandlerAdapter {
public MinaClientHandler() {
}
private Object msg;
public MinaClientHandler(Object message) {
this.msg = message;
}
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("客戶端->sessionOpened");
System.out.println("客戶端->" + ((Message) msg).getMsgBody());
session.write(msg);
}
@Override
public void sessionClosed(IoSession arg0) throws Exception {
System.out.println("客戶端->sessionClosed");
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
Message msg = (Message) message;
System.out.println("處理完的結果為" + msg.getMsgBody());
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
// session.write(strC);
// super.messageSent(session, message);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
cause.printStackTrace();
session.close(true);
}
}傳送對象類:
package cn.mina;
import java.io.Serializable;
/**
* @author html580
* @site http://www.html580.com
*/
public class Message implements Serializable{
private static final long serialVersionUID = 1L;
private String msgBody;
public Message(String msgBody) {
this.msgBody = msgBody;
}
public String getMsgBody() {
return msgBody;
}
public void setMsgBody(String msgBody) {
this.msgBody = msgBody;
}
}測試結果如下:
啟動服務端:
服務創建中
MINS 服務器監聽的服務端口為8991
啟動客戶端:
開始接服務器
客戶端->sessionOpened
客戶端->http://www.html580.com
處理完的結果為服務端回應客戶機發來的消息http://www.html580.com
服務端一直監控輸出:
服務端sessionOpened.../127.0.0.1:61837
服務端收信息...
服務端->收到客戶機發來的消息: http://www.html580.com
服務端回寫信息...
總結
以上是生活随笔為你收集整理的java传送字符到前端_mina实现服务器与客户端传送对象或字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在大城市租房,什么时候才能实现“整租自由
- 下一篇: 南方夏天有没有什么可以自制的除湿防潮好物