首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > flex >

flex与JAVA的SOCKET通讯

2012-10-29 
flex与JAVA的SOCKET通信来自javaEye上善若水的文章http://cloud21.iteye.com/blog/607169一、准备: 服务端:

flex与JAVA的SOCKET通信
来自javaEye上善若水的文章
http://cloud21.iteye.com/blog/607169




一、准备:
服务端:JDK1.5 (这个不用介绍了吧?)
服务端IDE:eclipse (它的主页)

客户端:FLEX 3 (Adobe® Flex® 3 是用于构建和维护在所有主要浏览器、桌面和操作系统一致地部署的极具表现力的 Web 应用程序的高效率的开放源码框架。)
客户端IDE:Flex Builder 3 (它的官方摘要页)

二、缘分的相遇(建立连接):


既然是通信,当然第一步就是要建立连接啦。我们还是用最简单的看代码的方式来开始我们的连接。

==========================================
==服务端代码:Jserver1.java
==========================================
Java代码
  
import java.net.*; 
import java.io.*; 
public class Jserver1 { 
public static void main(String[] args) { 
ServerSocket server=null; 
try{ 
  server=new ServerSocket(719);//在端口719建立一个服务器套接字对象 
  System.out.println("服务端等待"); 
  while(true){ 
   System.out.println("等待客户机"); 
   Socket newSocket=server.accept();//客户端向我们建立的服务器套接字发送连接请求,则向下执行 
   System.out.println("已与客户机连接"); 
  } 
}catch(IOException ie) 

  System.out.println(ie); 
}finally{ 
  try 
  { 
   if(server!=null) server.close();//关闭服务器套接字。为什么要用finally关键字来做这个事呢?HOHO thinking in java里大师已经说得很清楚了,就是无论出现什么异常,都保证我们的服务端套接字能被关闭。 
  }catch(IOException ie){} 




嘎嘎,怎么样 注释写得够清楚了吧?OK 让我们编译运行,得到的结果应该如图:


OK 再让我们来看看客户端的代码是怎么样的:
==========================================
==客户端代码:Jclient1.mxml
===================================================
Java代码
  
<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"r />internal function initApp():void 

socket.connect("localhost",719); //连接服务器 
socket.addEventListener(Event.CONNECT,funConnect); //监听是否连接 
socket.addEventListener(Event.CLOSE,funClose); //监听连接关闭 

internal function funConnect(event:Event):void 

myText.text+="连接已建立 \n"; 

internal function funClose(event:Event):void 

myText.text+="连接已关闭 \n"; 

 
internal function sendMessage(msg:String):void//发送数据对应按钮click事件 

var message:ByteArray=new ByteArray();//新建一个ByteArray存放数据 
message.writeUTFBytes(msg +"\r\n");//写入数据,writeUTFBytes方法,以utf-8格式传数据避免中文乱码 
socket.writeBytes(message);  //写入Socket的缓冲区 
socket.flush();  //调用flush方法发送信息 
myText.text+=msg+"\r\n";  //在客户端屏幕上输出发送的内容 
myInput.text=""; //清空发言框 

]]> 
</mx:Script> 
<mx:TextArea x="10" y="10" width="703" height="263" id="loveText"/> 
<mx:TextInput x="10" y="297" width="605" id="loveInput"/> 
<mx:Button x="648" y="297" label="发送情书" id="sendBtn" click="sendMessage(loveInput.text)"/> 
</mx:Application> 


嘎嘎,情书的做法就上面那面简单,注释已经写得很清楚了,就不多说了。

OK,客户端GG的情书倒是送出去了,我们就来看看服务端MM是怎么接受这封情书的呢?
==========================================
==服务端代码:Jserver2.java
==========================================
Java代码
import java.net.*; 
import java.io.*; 
public class Jserver2{ 
private BufferedReader reader; //负责输入 
private ServerSocket server;   //服务器套接字 
private Socket socket;      //套接字 
public Server2(){}  //缺省构造函数 
void startServer()  //启动服务器 

try 

server=new ServerSocket(719);    //创建服务器套接字 
System.out.println("服务器套接字建立完毕"); 
while(true) 

  System.out.println("等待客户端GG"); 
  socket=server.accept(); //若客户端GG提出连接请求,与socket连接 
  System.out.println("完成与客户端的连接"); 
reader=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8")); //获取socket输入流,“utf-8”这个编码设置是为了更好显示中文  
getMessage();//读取来自客户端的数据,并输出至画面上 

}catch(Exception e) 

System.out.println(e); 
}finally{ 
try 

if(server!=null) server.close();//关闭服务器套接字。 
}catch(IOException ie){} 


void getMessage()  //读取来自套接字的信息 

try 

while(true)    //循环 

System.out.println("客户端GG说:"+reader.readLine()); 

}catch(Exception e){} 
finally{ 
System.out.println("客户端中断连接"); 
try 

if(reader!=null) reader.close(); //关闭套接字的输入流 
if(socket!=null) socket.close();  //关闭套接字 
reader=null; 
socket=null; 
}catch(Exception e){} 


public static void main(String[] args) 

Server2 server=new Server2(); 
server.startServer(); 

 

哈哈,我们运行来看看,我们的客户端GG的情书能否顺利到达服务端MM的手中呢?
运行结果如下:


HOHO 看样子我们的客户端GG的情书,服务端MM是顺利接受到啦。

四、服务端MM的心思(多客户端通信)

在服务端MM收到客户端GG的情书以后,突然发现自己原来还是蛮受欢迎的呢。但是有句俗话说的好,那就是“不能为了一棵树放弃一片森林”。所以服务端MM就想,能不能多接受几个客户端GG的情书呢?(真TMD贱。。。)

OK,既然服务端MM有了这个需求(虽然是很贱的需求),那我们就要来满足她!

来看服务端的代码:
=========================================
==Jserver3.java
=========================================
Java代码
import java.net.*; 
import java.io.*; 
import java.util.*; 
 
public class Jserver3 { 
private ServerSocket server; 
List sManager = new ArrayList(); 
 
public Jserver3(){} 
void startServer() //运行服务器 

try 

server=new ServerSocket(719); 
System.out.println("服务器套接字已创建成功!"); 
while(true) 

Socket socket=server.accept(); 
System.out.println("已经与客户端连接"); 
new J_Thread(socket).start(); 
sManager.add(socket); 
System.out.println("当前客户端连结数:"+sManager.size()); 

}catch(Exception e){}finally 

try 

server.close(); 
}catch(Exception e){} 


public static void main(String[] args) { 
 
Jserver3 server=new Jserver3(); 
server.startServer(); 

class J_Thread extends Thread  //与客户端进行通信的线程类 

Socket socket;   //套接字引用变量 
private DataInputStream reader;   //套接字输入流 
private DataOutputStream writer;  //套接字输出流 
J_Thread(Socket socket)   //构造函数 

this.socket=socket; 

public void run() 

try 

 
reader=new DataInputStream(socket.getInputStream());//获取套接字的输入流 
writer=new DataOutputStream(socket.getOutputStream());//获取套接字的输出流 
String msg; 
while((msg=reader.readUTF())!=null)//如果收到客户端发来的数据 

//向客户端发送信息 
writer.writeUTF("您的情书已经收到"); 
writer.flush(); 
System.out.println("来自客户端:"+msg); 
 

}catch(Exception e){}finally 

try 

sManager.remove(socket);  //删除套接字 
//关闭输入输出流及套接字 
if(reader!=null)reader.close(); 
if(writer!=null)writer.close(); 
if(socket!=null)socket.close(); 
reader=null; 
writer=null; 
socket=null; 
 
System.out.println("客户端离开");//向屏幕输出相关信息 
System.out.println("当前客户端的连接数:"+sManager.size()); 
}catch(Exception e){} 



 

嘎嘎 在这段代码里,服务端MM为每一个连接的客户端GG分配一个单独的线程,而每一个线程里都持有对应的客户端GG的Socket对象。SO,通过这些多线程,服务端MM就练就了一心N用的功力,可以同时接受N个客户端GG发来的情书了(,真的太贱了。。。。)

客户端的代码和上面的客户端代码一模一样的,这里就不多说啦!



好了,在这里就简单的给大家介绍了如何实现java和flash(flex)实现socket通信的简单功能。有时间的话,再给大家来个简单的聊天室实现(那个时候的服务端MM就更贱了,不仅收着N多客户端GG的情书,竟然还把情书广播给所有的客户端GG,BS!)。嘎嘎 其实原理就是上面所说的这些,大家自己都可以尝试下。

热点排行