最近将我以前用socket+socketServer+mysql做的小说阅读器从新移植了一下,现在客户端有三个.一个是http(get)方式,一个是http(post)方式.一个是socket方式,服务器是用MINA2.0-M3来实现的,可以同时解析这三种客户端.下面来简单讲述一下,希望对大家有点帮助.
第一种是http(get)方式.http(get)是种不安全的传输方式.他传统是URL+数据来实现的.也就是说URL后面的参数便是你要给服务器的数据.这样就很不安全,而且据说GET方式传输的数据大小会有限制,不推荐使用.其方法大至为:
String url="http://"+Gamedata.server_address+":"+Gamedata.server_port+"?"+this.Param;
System.out.println("url="+url);
hpc = (HttpConnection)Connector.open(url);
hpc.setRequestMethod(HttpConnection.GET);
int status = hpc.getResponseCode();
if(status==HttpConnection.HTTP_OK){
...
Gamedata.server_address为服务器地址.Gamedata.server_port为服务器端口.this.Param为你要传的数据
GET方式不用发送Content-Length.已经包括了
第二种是http(post)方式.因为socket只能在midp2.0中使璿所以http现在还是主流网络传输协议.而且post方法.数据没有大小限制.安全性也比GET好,所以一般通用网络都是使用此方式
其方法大至为:
if(cmwap){
hpc=(HttpConnection)Connector.open("http://10.0.0.172:80/",Connector.READ_WRITE,true);
hpc.setRequestProperty("X-Online-Host",Gamedata.server_address+":"+Gamedata.server_port);
hpc.setRequestProperty("Accept", "*/*");
}
else{
hpc = (HttpConnection)Connector.open("http://"+Gamedata.server_address+":"+Gamedata.server_port,Connector.READ_WRITE);
}
hpc.setRequestMethod(HttpConnection.POST);
hpc.setRequestProperty("Content-Length",String.valueOf(Param.getBytes().length));//给服务器发送数据长度
//打开输出流
dos=hpc.openDataOutputStream();
dos.write(Param.getBytes());//给服务器发送数据
int status = hpc.getResponseCode();
if(status==HttpConnection.HTTP_OK){
....
第三种是socket方式.midp2.0使用.其性能好速度快不用像HTTP那样请求一次链一次,嘿嘿.大至方法为:
//建立Socket
socketConnection=(SocketConnection)Connector.open("socket://"+Gamedata.server_address+":"+Gamedata.server_port);
socketConnection.setSocketOption(SocketConnection.KEEPALIVE,0);
//打开Socket输出流
dos=socketConnection.openDataOutputStream();
//打开Socket输入流
dis=socketConnection.openDataInputStream();
dos.writeInt(Gamedata.下载小说目录命令.getBytes().length);//发送数据长度
dos.write(Gamedata.下载小说目录命令.getBytes());//发送数据内容
//从服务器接收数据
int length=dis.readInt();
小说目录名字=new String[dis.readInt()];
.....
服务器端是MINA2.0-M3最新版实现的.需要apache下载MINA2.0-M3包.还有SJF4J日志包.MINA采用的是sjf4j日志系统
acceptor = new NioSocketAcceptor();
chain = acceptor.getFilterChain();
chain.addLast("codec",new ProtocolCodecFilter(new CodecFactory()));//增加自己实现的Filter
chain.addLast("logger", new LoggingFilter());//增加日志Filter
acceptor.setHandler(new ServerHandler());//设置ServerHandler工作类
acceptor.bind(new InetSocketAddress(Gamedata.server_port));//启动.server_port为端口
这样便可开启服务.CodecFactory是自己实现的Filter.包括注册编码器.解码器.
ServerHandler是extends IoHandlerAdapter的.里面主要的有下面几个方法
sessionOpened//打开时调用
messageReceived//监听接受数据
sessionClosed//关闭时调用
messageSent//消息发送给客户端时调用
exceptionCaught//异常处理.
还有几个方法,就不一一例出
MINA大至的过程是:
启动->监听.有链接.创建打开->调用解码器(检查数据完整,解析数据,得到数据体)->服务器逻辑处理->调用编码器(对于不同客户端处理,比如http.socket要不同处理)->发送数据
以前做一个网游客户端时.同事Redduke写的服务器留下了编码器.解码器.嘿嘿.拿来用用..
数据库是用MYSQL建的.链接MYSQL想必大家都会链.几个查询更新语句也会写...就不多嘴了.
发表于 @ 2008年11月20日 19:56:00 | 评论( loading... ) | 举报| 收藏