您的位置:首页 > 其它

nio/mina(四)客户端socket与mina服务端通信

2012-08-23 10:37 316 查看
客户端socket传对象给mina服务端暂时不通,可能跟下面传中文字符串有些类似.

应该和mina端过滤器的相关设置有关.

服务端:

1 MinaServer.java

package com.nafio.server;

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.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class MinaServer {
private static MinaServer minaServer = null;
//创建一个非阻塞的Server端Socket
private SocketAcceptor acceptor = new NioSocketAcceptor();
//创建接收数据的过滤器
private DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
private int bindPort = 8888;

//单例
public static MinaServer getInstances() {
if (null == minaServer) {
minaServer = new MinaServer();
}
return minaServer;
}
private MinaServer() {
//设定这个过滤器将按对象读取数据

//单例模式----------------------------------------
//		chain.addLast("myChin", new ProtocolCodecFilter(
//				new ObjectSerializationCodecFactory()));
//设定服务器端的消息处理器:一个MinaServerHandler对象,
//		acceptor.setHandler(ServerHandler.getInstances());

//非单例模式---------------------------------------
//接收文字
chain.addLast("myChin", new ProtocolCodecFilter(
new TextLineCodecFactory()));
//接收对象
//		chain.addLast("myChin", new ProtocolCodecFilter(
//				new ObjectSerializationCodecFactory()));

acceptor.setHandler(new ServerHandler());
try {
//绑定端口,启动服务器
acceptor.bind(new InetSocketAddress(bindPort));

} catch (IOException e) {
e.printStackTrace();
}
System.out.println("服务端:监听端口--->" + bindPort);
}
public static void main(String[] args) throws Exception {
MinaServer.getInstances();
//new MinaServer();
}
}


2 ServerHandler.java

package com.nafio.server;

import org.apache.mina.core.filterchain.IoFilterAdapter;
import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

import com.nafio.obj.TransferObj;
//下面两种写法应该等同,不确定?
//public class ServerHandler extends IoHandlerAdapter {
public class ServerHandler extends IoFilterAdapter implements IoHandler {
private static ServerHandler samplMinaServerHandler = null;
public static ServerHandler getInstances() {
if (null == samplMinaServerHandler) {
samplMinaServerHandler = new ServerHandler();
}
return samplMinaServerHandler;
}
public ServerHandler() {
}
public void sessionOpened(IoSession session) throws Exception {
System.out.println("服务端:会话打开");
}
public void sessionClosed(IoSession session) {

}

public void messageReceived(IoSession session, Object message)throws Exception {
//接收字符串
String str = (String)message;
System.out.println("服务端:收到客户端发来的信息--->"+str);
//System.out.println("服务端:收到信息");
//接收对象
//		if (message instanceof TransferObj) {
//			TransferObj obj = (TransferObj) message;
//			System.out.println("服务端:收到客户端数据--->"+obj.getDate());+
//		}
}
public void exceptionCaught(IoSession arg0, Throwable arg1)throws Exception {
}
public void messageSent(IoSession arg0, Object arg1) throws Exception {

}
public void sessionCreated(IoSession arg0) throws Exception {
System.out.println("服务端:会话创建");
}
public void sessionIdle(IoSession arg0, IdleStatus arg1) throws Exception {

}
}


socket客户端

SocketClient.java

package com.nafio.socketclient;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import com.nafio.obj.TransferObj;

public class SocketClient {

private Socket s;
private DataOutputStream out;
private DataInputStream in;
public SocketClient() throws IOException {
}

public static void main(String[] args) throws Exception {
SocketClient c = new SocketClient();
c.talk();
}
//  发送对象
//	ObjectOutputStream oos;
//	TransferObj obj;
public void sendMessage(Socket s) {
try {

//socket传字符串
out = new DataOutputStream(s.getOutputStream());
byte[] bt="中文\n".getBytes();
out.write(bt);
out.writeBytes("nafio_date\n");
//out.writeUTF("中文\n");//by nafio这么写不行

//socket传对象
//			oos = new ObjectOutputStream(s.getOutputStream());
//			obj=new TransferObj();
//			obj.setDate("socketDateToMina");
//			oos.writeObject(obj);
//			oos.flush();

} catch (IOException e) {
e.printStackTrace();
}

}

public void receiveMessage(Socket s) {
try {
in = new DataInputStream(s.getInputStream());
} catch (Exception e) {
e.printStackTrace();
}
}

public void talk() throws Exception {
/*while (true)*/ {
try {
//发送对象
//oos.close();
s = new Socket("localhost", 8888);
System.out.println("客户端:发送信息");
sendMessage(s);
System.out.println("发送信息完毕!");
//发字符串
//receiveMessage(s);
out.close();
//in.close();
}
catch(Exception e){
e.printStackTrace();
}
finally {
try{
if(s!=null)s.close();  //断开连接
}catch (IOException e) {e.printStackTrace();}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: