Flex 端:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
creationComplete="initApp();" width="369" height="326">
<mx:Script>
<![CDATA[
private var socket:Socket = new Socket();
internal function initApp():void
{
socket.connect("127.0.0.1",8888);//执行连接
socket.addEventListener(Event.CONNECT,funConnect);//监听连接成功事件
socket.addEventListener(Event.CLOSE,funClose);//监听关闭事件
socket.addEventListener(ProgressEvent.SOCKET_DATA,funSocket);//监听服务器新信息
}
internal function funConnect(e:Event):void
{
myText.text+="连接已建立 \n";
}
internal function funClose(e:Event):void
{
myText.text+="连接已关闭 \n";
}
internal function sendMessage(msg:String):void
{
var message:ByteArray=new ByteArray();//新建一个ByteArray来存放数据
message.writeUTFBytes(msg+"\n");//写入数据,使用writeUTFBytes以utf8格式传数据,避免中文乱码
socket.writeBytes(message);//写入socket的缓冲区
socket.flush();//调用flush方法发送信息
myInput.text="";//清空消息框
}
internal function funSocket(e:Event):void
{
var msg:String="";
while(socket.bytesAvailable)//循环读取数据,socket的bytesAvailable对象存放了服务器传来的所有数据
{
msg += socket.readMultiByte(socket.bytesAvailable,"utf8"); //强制使用utf8格式,避免中文乱码
var arr:Array = msg.split("\n"); //使用\n换行符号把信息切开
for(var i:int=0;i<arr.length;i++)
{
if(arr[i].length > 0){
var myPattern:RegExp=/\r/;//正则表达式,回车符
arr[i] = arr[i].replace(myPattern,""); //删除回车符
myText.text+=arr[i]+"\n"; //在聊天框中输出
}
}
myText.horizontalScrollPosition = myText.maxVerticalScrollPosition; //滚动到最下面
}
}
]]>
</mx:Script>
<mx:TextInput x="10" y="10" width="344" text="名字" id="myName"/>
<mx:TextArea x="10" y="42" width="344" height="247" id="myText"/>
<mx:TextInput x="10" y="297" width="270" id="myInput"/>
<mx:Button x="288" y="298" label="发送" id="myBtn" click="sendMessage(myName.text+':'+myInput.text)"/>
</mx:Application>
Java端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
public class Server4 {
private ServerSocket server;
private BManager bMan=new BManager(); //消息广播
public Server4() {}
void startServer() //启动服务器
{
try {
server=new ServerSocket(8888); //创建服务器套接字
System.out.println("服务器套接字建立完毕");
while(true)
{
Socket socket=server.accept();//若客户机提请求,socket连接
new Chat_Thread(socket).start();//启动线程
bMan.add(socket); //添加套接字
bMan.sendClientInfo(); //使用套接字输出当前聊天人数
}
} catch (IOException e) {
System.out.println(e);
e.printStackTrace();
}
}
class Chat_Thread extends Thread{ //与客户机进行通信的线程累
Socket socket; //套接字引用变量
private BufferedReader reader; //引用套接字输入流;
private PrintWriter writer; //引用套接字输出流;
Chat_Thread(Socket socket){ //构造函数
this.socket = socket;
}
public void run() {
try {
reader = new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf8"));//utf8UTF-8
//PrintWriter 的第二个参数:autoFlush - A boolean; if true, the println, printf, or format methods will flush the output buffer
writer = new PrintWriter(socket.getOutputStream(),true);
String msg;
//从输出流获取信息
while((msg=reader.readLine()) != null){
System.out.println(msg);
//向所有客户机传送信息
bMan.sendToAll(msg);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try { //从消息广播者立标中删除socket
bMan.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("客户机离开");
//向所有客户机传送当前连接数
bMan.sendClientInfo();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Server4 server=new Server4();
server.startServer();
}
//消息广播者类,继承Vector类
class BManager extends Vector{ //消息广播者类,继承Vector类
BManager (){}//构造函数
void add(Socket socket) {
super.add(socket); //添加套接字
}
void remove(Socket socket) {
super.remove(socket); //删除套接字
}
//向所有客户机传送消息,同步化方法。
synchronized void sendToAll(String msg) {
PrintWriter writer = null; //输出流
Socket socket;
for (int i = 0; i < size(); i++) {
socket = (Socket)elementAt(i);
try {
//获取第i个套接字输出流
writer = new PrintWriter(socket.getOutputStream(),true); //就是因为掉了个ture ,客服端就显示不了数据
} catch (IOException e) {
e.printStackTrace();
}
//使用第i各套接字输出流,输出消息
if(writer!=null) writer.println(msg);
}
}
//向所有客户机发送当前聊天人数
synchronized void sendClientInfo(){
String info = "当前聊天人数:"+size();
System.out.println(info);
sendToAll(info);
}
}