apahce mina的客户端可以直接用socket吗? 您好,我想问一下怎么设置MINA的协议,比如把UDP改成TCP 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 您好,我想问一下怎么设置MINA的协议,比如把UDP改成TCP 不好意思最近很少上csdn了。太忙了 。mina支持很多协议,tcp和udp都支持。当需要通过socket和mina进行通讯的时候不能用mina自带的过滤器进行转码,因为mina的过滤器必须成对出现。如果你在server/client端用了mina的过滤器。那么在client/server端必须也得用过滤器。我用mina做的那个项目已经完工了。感觉mina不是很好。性能问题跟不上。其中最不好的地方就是在客户端在创佳连接的时候SocketConnector connector = new NioSocketConnector();无法将connector对象释放。如果你做过压力测试的话,你会发现如果connector对象不释放对程序的性能影响是很大的。我到目前为止还没找到适合的方法去完善它。用了个下下策就是只用mina开发服务器,客户端就用socket做。哈哈哈。实在是没办法。 小弟,正在用mina 正在苦恼中,项目也是手机和mina通信,手机端的 DataInputStream , DataOutputStream,传数据到服务器中,messageReceived接受不到,不知你是如何解决的,能否给发个代码片段,或指点一下,也可以!谢谢了! 这些方法可以帮助你在不使用mina filter的情况下进行转码!如果你手机上直接用socket的话,mina server就不能用filter。所以说下面的方法对你来说很有用的。你可以把你的代码弄出来大家看看。那样会更好的帮你找出问题的所在 /** * 将byte[]转换成string * @param butBuffer */ public static String byteToString(byte [] b) { StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i < b.length; i++) { stringBuffer.append((char) b [i]); } return stringBuffer.toString(); } /** * 将bytebuffer转换成string * @param str */ public static IoBuffer stringToIoBuffer(String str) { byte bt[] = str.getBytes(); IoBuffer ioBuffer = IoBuffer.allocate(bt.length); ioBuffer.put(bt, 0, bt.length); ioBuffer.flip(); return ioBuffer; } /** * 将IoBuffer转换成string * @param str */ public static IoBuffer byteToIoBuffer(byte [] bt,int length) { IoBuffer ioBuffer = IoBuffer.allocate(length); ioBuffer.put(bt, 0, length); ioBuffer.flip(); return ioBuffer; } /** * 将IoBuffer转换成byte * @param str */ public static byte [] ioBufferToByte(Object message) { if (!(message instanceof IoBuffer)) { return null; } IoBuffer ioBuffer = (IoBuffer)message; byte[] b = new byte[ioBuffer.limit()]; ioBuffer.get(b); return b; } /** * 将IoBuffer转换成string * @param butBuffer */ public static String ioBufferToString(Object message) { if (!(message instanceof IoBuffer)) { return ""; } IoBuffer ioBuffer = (IoBuffer) message; byte[] b = new byte [ioBuffer.limit()]; ioBuffer.get(b); StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i < b.length; i++) { stringBuffer.append((char) b [i]); } return stringBuffer.toString(); } 手机端: try { socket = (SocketConnection) Connector.open("socket://127.0.0.1:9123"); dis = socket.openDataInputStream(); dos = socket.openDataOutputStream(); String str = "111111"; dos.writeUTF(str); } catch (IOException ex) { ex.printStackTrace(); }将字符串:111111发给服务器端服务器端:如何得到数据呢? acceptor = new NioSocketAcceptor(); acceptor.getFilterChain().addLast("logger", new LoggingFilter()); //创建接收数据的过滤器 DefaultIoFilterChainBuilder chain = acceptor.getFilterChain(); //设定这个过滤器将一行一行(/r/n)的读取数据 chain.addLast("myChin",new ProtocolCodecFilter(new TextLineCodecFactory())); chain.addLast("ddd", new StreamWriteFilter()); acceptor.setHandler(new TimeServerHandler(this));//指定业务逻辑处理器 acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT));//设置端口号 try { //设置端口号 acceptor.bind(); //启动监听 } catch (IOException ex) { }如果设置:chain.addLast("myChin",new ProtocolCodecFilter(new TextLineCodecFactory())); TimeServerHandler根本就执行不到:messageReceived,如果设置: chain.addLast("ddd", new StreamWriteFilter()); TimeServerHandler的messageReceived能得到数据:message.toString() = "HeapBuffer[pos=0 lim=8 cap=2048: 00 06 31 31 31 31 31 31]"是不是要自己写个filter呀!如何写!我总不能简单的从上面得到的字符串中,取几位再转换吧!谢谢userdaye,你的转换代码应该用的上,各位是如何解决的,手机端用什么发的数据! 如果按照userdaye的方法,肯定能实现解码,得到的字符串很有规律呀!”00 06 31 31 31 31 31 31“ 00 06 是长度,后面是内容,再用userdaye的方法,就解决了,但是如果手机所发字符串:“111111222222高3”,返回的串就是"HeapBuffer[pos=0 lim=18 cap=2048: 00 10 31 31 31 31 31 31 32 32 32 32 32 32 E9 AB...]"没有了高后面的3,还存在中文问题!是否有更好的方法? userdaye 手机socket是否也是openDataOutputStream?还是用其他的! 解码问题我没碰到,因为我做的那个系统没的中文。全部是数字和字母,还有个原因就是那个程序要在linux系统下面运行,所以基本没的中文。你自己解决一下吧,filter可以自己写一个,网上有这方面的例子。手机开发我没弄过不好意!! 客户端socket怎么写才能连接到mina服务器的,服务器应该怎么修改呢? 把手机端和mina端的代码贴出来晒下。我们也学习学习! 关于正则表达式 jsp+mysql 中文转码乱码 JAVA讨论群,可以给大家提供一个良好的互动方式 越详细越好 请教Spring的编程规范 weblogic连接池测试 win2k下装不了weblogic怎么回事?? 我是初学者,在开发ejb中,请问update、add和delete 的操作 ,在session bean中直接写sql来updat、add、delete语句对库操作,还是在entiy JDBC的excute 请帮忙看看Axis2的Eclipse的插件使用中的错误 dwr+dtree做一个动态菜单的问题。
/**
* 将byte[]转换成string
* @param butBuffer
*/
public static String byteToString(byte [] b)
{
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < b.length; i++)
{
stringBuffer.append((char) b [i]);
}
return stringBuffer.toString();
} /**
* 将bytebuffer转换成string
* @param str
*/
public static IoBuffer stringToIoBuffer(String str)
{ byte bt[] = str.getBytes(); IoBuffer ioBuffer = IoBuffer.allocate(bt.length);
ioBuffer.put(bt, 0, bt.length);
ioBuffer.flip();
return ioBuffer;
}
/**
* 将IoBuffer转换成string
* @param str
*/
public static IoBuffer byteToIoBuffer(byte [] bt,int length)
{ IoBuffer ioBuffer = IoBuffer.allocate(length);
ioBuffer.put(bt, 0, length);
ioBuffer.flip();
return ioBuffer;
}
/**
* 将IoBuffer转换成byte
* @param str
*/
public static byte [] ioBufferToByte(Object message)
{
if (!(message instanceof IoBuffer))
{
return null;
}
IoBuffer ioBuffer = (IoBuffer)message;
byte[] b = new byte[ioBuffer.limit()];
ioBuffer.get(b);
return b;
}
/**
* 将IoBuffer转换成string
* @param butBuffer
*/
public static String ioBufferToString(Object message)
{
if (!(message instanceof IoBuffer))
{
return "";
}
IoBuffer ioBuffer = (IoBuffer) message;
byte[] b = new byte [ioBuffer.limit()];
ioBuffer.get(b);
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < b.length; i++)
{ stringBuffer.append((char) b [i]);
}
return stringBuffer.toString();
}
try {
socket = (SocketConnection) Connector.open("socket://127.0.0.1:9123");
dis = socket.openDataInputStream();
dos = socket.openDataOutputStream();
String str = "111111";
dos.writeUTF(str);
} catch (IOException ex) {
ex.printStackTrace();
}
将字符串:111111发给服务器端
服务器端:如何得到数据呢?
acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
//创建接收数据的过滤器
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
//设定这个过滤器将一行一行(/r/n)的读取数据
chain.addLast("myChin",new ProtocolCodecFilter(new TextLineCodecFactory()));
chain.addLast("ddd", new StreamWriteFilter());
acceptor.setHandler(new TimeServerHandler(this));//指定业务逻辑处理器
acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT));//设置端口号
try {
//设置端口号
acceptor.bind(); //启动监听
} catch (IOException ex) { }如果设置:chain.addLast("myChin",new ProtocolCodecFilter(new TextLineCodecFactory())); TimeServerHandler根本就执行不到:messageReceived,
如果设置: chain.addLast("ddd", new StreamWriteFilter()); TimeServerHandler的messageReceived能得到数据:message.toString() = "HeapBuffer[pos=0 lim=8 cap=2048: 00 06 31 31 31 31 31 31]"是不是要自己写个filter呀!如何写!我总不能简单的从上面得到的字符串中,取几位再转换吧!谢谢userdaye,你的转换代码应该用的上,各位是如何解决的,手机端用什么发的数据!
把手机端和mina端的代码贴出来晒下。我们也学习学习!