62,634
社区成员




public String buildSocket4Sync(SocketConn sm, HostVO address, String cmd)
{
BufferedReader br = null;
InputStream in = null;
String result = "";
try
{
socket = new Socket(address.getIp(), address.getPort());
OutputStream socketOut = socket.getOutputStream();
socketOut.write(cmd.getBytes());
socketOut.write("\r\n".getBytes());
in = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(in, "utf-8"));
String re;
StringBuffer sbf = new StringBuffer();
while ((re = br.readLine()) != null)
{
sbf.append(re);
}
if (sbf.length() != 0)
{
result = new String(Base64.decode(sbf.toString()), "utf-8");
// System.out.println(result);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if (null != br)
{
br.close();
}
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
return result;
}
对的,nio会有粘包发生的 使用MINA也需要约定 数据的格式吗? 比如 数据总长度+字节数 ?
package com.net.base.action;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.util.concurrent.TimeUnit;
import org.apache.mina.core.RuntimeIoException;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.future.ReadFuture;
import org.apache.mina.core.future.WriteFuture;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import com.net.exception.BusinessException;
import com.net.util.Logger;
import com.net.test.minaSocket.Base64;
/**
*
* <code>NioConnection.java</code> Desc: 获取mina连接(单例)
*/
public class NioConnection
{
private static final Logger logger = Logger.getLogger(NioConnection.class);
public static Long DEFAULT_READ_OUT_TIME = 10000L;
// 初始化一个NioSocketConnector的常量
public static final NioSocketConnector ioConnector = new NioSocketConnector();
// 初始化静态块
static
{
logger.debug("初始化NioSocketConnector开始");
// 设置NioSocketConnector的相关信息
ioConnector.setConnectTimeoutMillis(DEFAULT_READ_OUT_TIME);
ioConnector.getFilterChain().addFirst("logger", new LoggingFilter());
ioConnector.getFilterChain().addLast("exceutor", new ExecutorFilter());
TextLineCodecFactory textLineCodecFactory = new TextLineCodecFactory(Charset.forName("UTF-8"));
textLineCodecFactory.setDecoderMaxLineLength(1000000);
textLineCodecFactory.setEncoderMaxLineLength(1000000);
ioConnector.getFilterChain().addLast("codec", new ProtocolCodecFilter(textLineCodecFactory));
ioConnector.setHandler(new ClientHandler());// 此处可能不对
ioConnector.getSessionConfig().setUseReadOperation(true);
logger.debug("初始化NioSocketConnector结束");
}
/**
*
* @Title: NioConnection
* @Description: 发送消息
* @param @param host
* @param @param port
* @param @param value
* @return @throws Exception
* @throws
*/
public static String sendMsg(String host, int port, String value) throws Exception
{
String retStr = "";
try
{
String returnValue = null;
ConnectFuture cf = ioConnector.connect(new InetSocketAddress(host, port));
cf.awaitUninterruptibly();
IoSession ioSession = cf.getSession();
WriteFuture writeFuture = ioSession.write(value);
writeFuture.awaitUninterruptibly(DEFAULT_READ_OUT_TIME, TimeUnit.MILLISECONDS);
ReadFuture readFuture = ioSession.read();
readFuture.awaitUninterruptibly(DEFAULT_READ_OUT_TIME, TimeUnit.MILLISECONDS);
returnValue = (String) readFuture.getMessage();
if (ioSession.isConnected())
{
ioSession.close(true);
}
retStr = new String(Base64.decode(returnValue == null ? "" : returnValue.toString()), "utf-8");
logger.info("返回值:" + retStr);
}
catch (Exception e)
{
e.printStackTrace();
}
return retStr;
}
public NioConnection() {
}
public static void main(String[] args) throws Exception
{
String value = "TakeCustomers|5|100|" + "20141210" + "|" + "20150410";
for (int i = 0; i < 1; i++)
{
NioConnection.sendMsg("192.168.188.10", 9002, value);
}
}
}
class ClientHandler extends IoHandlerAdapter
{
private static final Logger logger = Logger.getLogger(ClientHandler.class);
private void releaseSession(IoSession session) throws Exception
{
logger.debug("releaseSession");
if (session.isConnected())
{
session.close(true);
}
}
@Override
public void sessionOpened(IoSession session) throws Exception
{
logger.debug("sessionOpened");
}
@Override
public void sessionClosed(IoSession session) throws Exception
{
logger.debug("sessionClosed");
}
@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception
{
logger.debug("sessionIdle");
try
{
releaseSession(session);
}
catch (RuntimeIoException e)
{
logger.error(BusinessException.ACCESS_NUMBER_ERROR, e);
}
}
@Override
public void messageReceived(IoSession session, Object message) throws Exception
{
logger.debug("Receive Server message " + message);
super.messageReceived(session, message);
releaseSession(session);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception
{
logger.info("exceptionCaught");
logger.error(BusinessException.ACCESS_NUMBER_ERROR, cause);
releaseSession(session);
}
@Override
public void messageSent(IoSession session, Object message) throws Exception
{
logger.debug("messageSent");
super.messageSent(session, message);
}
}
class ReturnFuture
{
private String returnValue;
public String getReturnValue()
{
return returnValue;
}
public void setReturnValue(String returnValue)
{
this.returnValue = returnValue;
}
}
数据量打出来这些:
VBOSS:<INFO>:2015-04-14 11:08:41,468[NioProcessor-3]>>CREATED
VBOSS:<INFO>:2015-04-14 11:08:41,468[NioProcessor-3]>>OPENED
VBOSS:<INFO>:2015-04-14 11:08:41,476[NioProcessor-3]>>SENT: HeapBuffer[pos=0 lim=0 cap=0: empty]
VBOSS:<INFO>:2015-04-14 11:08:47,322[NioProcessor-3]>>RECEIVED: HeapBuffer[pos=0 lim=2048 cap=2048: 50 44 39 34 62 57 77 67 64 6D 56 79 63 32 6C 76...]
VBOSS:<INFO>:2015-04-14 11:08:47,323[NioProcessor-3]>>RECEIVED: HeapBuffer[pos=0 lim=4096 cap=4096: 50 53 49 78 49 69 42 6A 63 6D 56 68 64 47 56 55...]
VBOSS:<INFO>:2015-04-14 11:08:47,324[NioProcessor-3]>>RECEIVED: HeapBuffer[pos=0 lim=8192 cap=8192: 50 53 49 31 49 69 42 76 63 6D 52 6C 63 6C 4E 30...]
VBOSS:<INFO>:2015-04-14 11:08:47,325[NioProcessor-3]>>RECEIVED: HeapBuffer[pos=0 lim=3040 cap=16384: 76 5A 45 69 49 48 4E 30 59 57 35 6B 59 58 4A 6B...]
VBOSS:<INFO>:2015-04-14 11:08:47,326[NioProcessor-3]>>CLOSED
VBOSS:<INFO>:2015-04-14 11:08:47,365[main]>>desc=[返回值:]
不知道啥意思。。使用MINA也需要约定 数据的格式吗? 比如 数据总长度+字节数 ?