d run()
{
try
{
InputStream is = socket.getInputStream();
byte [] reader = new byte [BYTE_ARRAY_MAX_LEN];
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream()));
OutputStream out = socket.getOutputStream();
sender.addOutput(out);
int ch=0;
String s;
while ( is.read(reader) != -1 )
{
//System.out.println("ch - "+ch);
s = new String(reader);
System.out.println("reader len:"+reader.length);
System.out.println(s);
if ( s!=null && s.indexOf("")>=0 )//安全策略
{
for ( int i=0;i {
System.out.println(i+" "+(int)s.charAt(i));
}
bw.write(safe,0,safe.length());
bw.flush();
//bw.close();
System.out.println(safe);
}
else
{
synchronized(sender)
{
sender.send(s);
}
}
reader = new byte [BYTE_ARRAY_MAX_LEN];
}
bw.close();
synchronized (sender)
{
sender.removeOutput(out);
}
}
catch (Exception ex)
{
System.out.println("error in receiver");
ex.printStackTrace();
}
try
{
socket.close();
System.out.println(socket.getInetAddress()+" disconnected");
} catch (IOException ex1) {
System.out.println("socket close error");
Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex1);
}
}
}
sender:
package for_flash_socket;
import java.util.*;
import java.io.*;
public class Sender {
ArrayList outputArrayList;
public Sender()
{
outputArrayList = new ArrayList();
}
public void addOutput(OutputStream out)
{
outputArrayList.add(out);
}
public void removeOutput(OutputStream out)
{
outputArrayList.remove(out);
}
public void send(String s)
{
for (int i=0;i {
PrintWriter pw = new PrintWriter((OutputStream)outputArrayList.get(i));
pw.write(s);
pw.flush();
}
}
}
线程那个部分代码写得比较搓,明白原理就行了……
这样基本的通信功能就实现了,在接收的时候先判定一下发过来的是不是安全认证s.indexOf("")>=0
假如是返回安全认证,就是那个safe字符串。
否则把发过来的信息广播出去。sender.send方法。
要注重的是:
while ( is.read(reader) != -1 )这一行
我一开始用的是BufferedReader readLine()方法读取的。总是莫名奇妙的出错,所以建议不要用BufferedReader,直接读取byte或者byte数组的方式比较好。再把byte[]转成string判定是否是FLASH发过来的安全认证。
假如出现安全沙箱错误,一般是安全认证没有返回,但是别的情况也有可能出现这个错误,比如服务器的socket关闭早了,或者服务器没有把socket流内的内容读取完毕就关闭了,都会导致这个错误。
所以socket读到不能再读,然后再关闭,这个地方需要注重。
还有一个用XMLSocket的方式通信的,和socket差不多,这里不多说了,安全认证也是一样的,比socket简单一些。
这样,就完成了基本的 FLASH与JAVA 通信。