现在来写一个flash 客户端,这里要解决的问题包括,
如何连接服务器,
如何监听服务器的内容,
如何发送信息服务器,
现在发一段简单的代码,这个代码很简单,功能不完整,为的是能够清晰一点让我们学习flash socket编程。
view plaincopy to clipboardprint?
package
{
import flash.net.Socket;
import flash.events.*;
import flash.display.Sprite;
import flash.errors.*;
import flash.display.SimpleButton;
public class Client extends Sprite
{
private var mysocket:Socket;
private var host:String="localhost";
private var port:int=8001;
public function Client()
{
btn.addEventListener(MouseEvent.CLICK,SendData);
mysocket=new Socket();
mysocket.addEventListener(Event.CONNECT,OnConnect);
mysocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
mysocket.addEventListener(ProgressEvent.SOCKET_DATA , receivedata);
//mysocket.addEventListener(SecurityError
mysocket.connect(host,port);
}
private function OnConnect(e:Event):void
{
trace("连接成功");
mysocket.writeUTFBytes("Test successful2\n");
mysocket.flush();//发送数据
}
private function ioErrorHandler(e:IOErrorEvent):void
{
trace("连接失败");
}
private function receivedata(e:ProgressEvent):void
{
trace("收到的字节数"+mysocket.bytesAvailable);
var msg:String;
while (mysocket.bytesAvailable)
{
msg+=mysocket.readMultiByte(mysocket.bytesAvailable,"utf8");
trace(msg);
}
}
private function SendData(e:MouseEvent):void
{
trace("发送");
mysocket.writeUTFBytes("i am flash\n");
mysocket.flush();//发送数据
}
}
}
package
{
import flash.net.Socket;
import flash.events.*;
import flash.display.Sprite;
import flash.errors.*;
import flash.display.SimpleButton;
public class Client extends Sprite
{
private var mysocket:Socket;
private var host:String="localhost";
private var port:int=8001;
public function Client()
{
btn.addEventListener(MouseEvent.CLICK,SendData);
mysocket=new Socket();
mysocket.addEventListener(Event.CONNECT,OnConnect);
mysocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
mysocket.addEventListener(ProgressEvent.SOCKET_DATA , receivedata);
//mysocket.addEventListener(SecurityError
mysocket.connect(host,port);
}
private function OnConnect(e:Event):void
{
trace("连接成功");
mysocket.writeUTFBytes("Test successful2\n");
mysocket.flush();//发送数据
}
private function ioErrorHandler(e:IOErrorEvent):void
{
trace("连接失败");
}
private function receivedata(e:ProgressEvent):void
{
trace("收到的字节数"+mysocket.bytesAvailable);
var msg:String;
while (mysocket.bytesAvailable)
{
msg+=mysocket.readMultiByte(mysocket.bytesAvailable,"utf8");
trace(msg);
}
}
private function SendData(e:MouseEvent):void
{
trace("发送");
mysocket.writeUTFBytes("i am flash\n");
mysocket.flush();//发送数据
}
}
}
我们首先解决第一个问题:(其实在cookbook那里已经有说的)这里简单演示一下
一.连接服务器:
mysocket=new Socket();
mysocket.addEventListener(Event.CONNECT,OnConnect);
mysocket.connect(host,port);
host :是连接的ip端,这里连接本地所以使用localhost 或者127.0.0.1 就ok
port:端口号只有大于1024的时候基本上可以顺利,小于1024还要进行一些配置
监听连接是否成功:
private function OnConnect(e:Event):void
{
trace("连接成功");
mysocket.writeUTFBytes("Test successful2\n");
mysocket.flush();//发送数据
}
连接成功后,我们可以发送一个简单信息给服务器:
mysocket.writeUTFBytes("Test successful2\n");
mysocket.flush();//发送数据
注意,有个\n没有这个回车符,看看会有一些什么发生呢。
使用writeUTFBytes 是不可能立刻发送数据给服务器的,还要使用flush方法才能发送给服务器。
二.处理错误:
mysocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
private function ioErrorHandler(e:IOErrorEvent):void
{
trace("连接失败");
}
三.接收服务器返回的信息
mysocket.addEventListener(ProgressEvent.SOCKET_DATA , receivedata);
private function receivedata(e:ProgressEvent):void
{
trace("收到的字节数"+mysocket.bytesAvailable);
var msg:String;
while (mysocket.bytesAvailable)
{
msg+=mysocket.readMultiByte(mysocket.bytesAvailable,"utf8");
trace(msg);
}
}
这样我们可以接收到服务器发送来的信息,但是存在一个问题,接收数据会存在一个回车符合的问题,需要我们去解决。这里暂时不多说
看上面的
参考:
bytesAvailable : uint
[read-only] 输入缓冲区中可读取的数据的字节数。
readMultiByte(length:uint, charSet:String):String
使用指定的字符集,从该字节流读取一个多字节字符串。
四,发送信息给服务器
问题:我们希望发送信息给服务器
解决:
使用writeUTFBytes 方法
private function SendData(e:MouseEvent):void
{
trace("发送");
mysocket.writeUTFBytes("i am flash\n");
mysocket.flush();//发送数据
}
在场景上放一个按钮上去,通过点击按钮事件,发送信息给服务器socket端口。
参考:
writeUTFBytes(value:String):void
将一个 UTF-8 字符串写入套接字。
五:服务器程序
这里写一个简单服务器程序,使用一个简单的线程,不过线程并不完善,有缺点,但不影响程序演示:
view plaincopy to clipboardprint?
package com;
import java.net.*;
import java.io.*;
public class Server implements Runnable {
public void run()
{
PrintWriter os=null;
try{
ServerSocket ss=new ServerSocket(8001);
System.out.println("等待连接....");
Socket sk=ss.accept();
System.out.println("连接成功....");
BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream(),"utf-8"));
System.out.println("获取里面的内容......");
//等待接受信息
os = new PrintWriter(sk.getOutputStream());
String word=null ;
//发送信息
while((word=br.readLine())!=null)
{
System.out.println("内容:" + word);
os.println("你好我是服务器");
os.flush();
}
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
public static void main(String[] args) {
new Thread(new Server()).start();
}
}
package com;
import java.net.*;
import java.io.*;
public class Server implements Runnable {
public void run()
{
PrintWriter os=null;
try{
ServerSocket ss=new ServerSocket(8001);
System.out.println("等待连接....");
Socket sk=ss.accept();
System.out.println("连接成功....");
BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream(),"utf-8"));
System.out.println("获取里面的内容......");
//等待接受信息
os = new PrintWriter(sk.getOutputStream());
String word=null ;
//发送信息
while((word=br.readLine())!=null)
{
System.out.println("内容:" + word);
os.println("你好我是服务器");
os.flush();
}
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
public static void main(String[] args) {
new Thread(new Server()).start();
}
}
接收结果:
等待连接....
连接成功....
获取里面的内容......
内容:Test successful2
内容:i am flash
内容:i am flash
内容:i am flash
内容:i am flash
内容:i am flash
为了让程序更加完善,我们可以将程序修改得更加完善
客户端发送的内容:
连接成功
收到的字节数16
null你好我是服务器
注意:出现null这个结果,也许在服务出现一些小毛笔,但基本发送数据的和接收数据都成功了
程序需要完善的地方:
包括客户端和服务器
处理回车符合问题
最后发现原来在var msg:String="";写上这样null 就不会出现了