您的位置:首页 > 编程语言 > Java开发

flex与JAVA的SOCKET通信

2015-07-19 16:10 344 查看
建立连接

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

==========================================

==服务端代码:Jserver1.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

===================================================

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creati f width="349" height="326">

<mx:Script>

<![CDATA[

import flash.net.Socket;

private var socket:Socket;

internal function initApp():void

{

socket=new Socket();//创建Socket对象

socket.connect("localhost",719);  //连接服务器

socket.addEventListener(Event.CONNECT,connectFun);//监听是否连接上服务器

socket.addEventListener(Event.CLOSE,closeFun);//监听套接字连接是否关闭

}

private function connectFun(event:Event):void

{

jText.text+="已经成功连接到服务器!\n";

}

private function closeFun(event:Event):void

{

jText.text+="和服务器断开!\n"

}

]]>

</mx:Script>

<mx:TextArea x="10" y="10" width="327" height="309" id="jText"/>

</mx:Application>

界面非常简单啦,其实就是一个TextArea来显示连接的结果而已,运行的结果如下图(注意,服务端也应该在运行!):

在as3.0中,所有和网络通信有关的类都位于flash.net包中,这里使用的是Socket类对象。

==========================================

==我们来详细说明一下上面用到的Socket类:

==========================================

Socket对象的常用创建方法有下面2种:

var socket:Socket=new Socket();//例一

或者

var socket:Socket=new Socket("localhost",719);//例二.这条语句设置了服务器地址为localhost 端口是719

当指定了了服务器地址和端口,Socket对象将自动开始连接服务器。如果不指定,则需要条用connect方法才开始执行连接动作,意思就是,例二的代码和下面的代码是等效的:

var socket:Socket=new Socket();

socket.connect("localhost",719);

完成连接动作后,接下来要获取服务端得返回信息。

Socket对象和URLLOADER啊之类的对象都是一样,利用事件机制来处理服务器端的信息,我们只要给Socket对象添加相关的事件监听函数就可以捕捉到服务器端的信息,Socket对象的事件主要有:

1 Event.CLOSE 连接中断事件。

2 Event.CONNECT 连接状态事件,表示已经成功连接了服务器。

3 IOErrorEvent.IO_ERROR 信息传递错误事件,一般是由服务器地址错误引起的。

4 ProgressEvent.SOCKET_DATA 服务器信息事件,当收到服务器的新信息时被触发。

==========================================

哈哈,经过上面的代码,我们的服务端MM和客户端GG终于通过Socket这个缘分宿命的相遇了!接下来会发生什么?我们继续往下看~~

三、第一封情书(客户端发送消息,服务端接受消息)

客户端GG在遇到服务端MM以后,终日变得茶饭不思,在折磨掉了无数根头发以后,客户端GG终于下定决心,要向服务端MM送出第一封情书啦!

既然是客户端GG送出情书,那我们先来看他到底是怎么做的:

==========================================

==客户端代码:Jclient2.mxml

==========================================

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12" creationComplete="initApp()">

<mx:Script>

<![CDATA[

import flash.net.Socket;

import flash.utils.ByteArray;

private var socket:Socket=new Socket(); //定义Socket,准备好情书的信封

//初始化程序

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是怎么接受这封情书的呢?

OK,客户端GG的情书倒是送出去了,我们就来看看服务端MM是怎么接受这封情书的呢?

==========================================

==服务端代码:Jserver2.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

=========================================

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!)。嘎嘎 其实原理就是上面所说的这些,大家自己都可以尝试下。

转载自


The NoteBook of EricKong

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: