flex socket与Java通信

本文介绍了一个使用Flex客户端和Java服务器实现的简单聊天室应用。该应用通过Socket通信完成实时消息交换,支持多用户同时在线聊天,并能显示当前聊天室内的用户数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);


}


}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值