闲来无事,做个基于Java Socket套接字通讯的Flex聊天室,代码也简单,就两份代码:SocketServer.java 和 FlexConnectSocket.mxml
先看看Java的部分:
package com.hyj.socket;
import java.net.*;
import java.util.Vector;
import java.io.*;
public class SocketServer {
private BufferedReader reader;
private PrintWriter writer;
private ServerSocket server;
private Vector socketManager = new Vector();
public SocketServer() {
}
void startServer() {
try {
server = new ServerSocket(886);
System.out.println(“Socket Server Created!”);
while (true) {
System.out.println(“待命中……”);
Socket socket = server.accept();
new Socket_Thread(socket).start();
socketManager.add(socket);
System.out.println(“當前共有” + socketManager.size() + “個客戶端鏈接進來了”);
for (int i = 0; i < socketManager.size(); i++) {
Socket sock = (Socket) socketManager.get(i);
writer = new PrintWriter(sock.getOutputStream(), true);
writer.println(“NO當前共有” + socketManager.size()
+ “個客戶端鏈接進來了”);
writer.flush();
}
}
} catch (Exception e) {
System.out.println(e);
} finally {
try {
if (server != null)
server.close();
System.out.println(“服務關閉!”);
} catch (IOException ie) {
}
}
}
class Socket_Thread extends Thread {
Socket socket;
private BufferedReader reader;
Socket_Thread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
reader = new BufferedReader(new InputStreamReader(socket
.getInputStream(), “UTF-8″));
String msg;
while ((msg = reader.readLine()) != null) {
for (int i = 0; i < socketManager.size(); i++) {
Socket sock = (Socket) socketManager.get(i);
writer = new PrintWriter(sock.getOutputStream(), true);
writer.println(msg);
writer.flush();
System.out.println(“接收到的信息為:” + msg);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
socketManager.remove(socket);
try {
if (reader != null) {
reader.close();
}
if (socket != null) {
socket.close();
}
reader = null;
socket = null;
System.out.println(“客戶機離開了!還剩下” + socketManager.size()
+ “人”);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
SocketServer server = new SocketServer();
server.startServer();
}
}
内容也比较简单,随便看看就会了吧,接下来是Flex客户端的代码,关键只有三个地方:
socket.addEventListener(Event.CONNECT,connectedHandler);
socket.addEventListener(Event.CLOSE,closeHandler);
socket.addEventListener(ProgressEvent.SOCKET_DATA,getSocketDataHandler);
代码如下:
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml”
layout=”absolute”
horizontalCenter=”0″
creationComplete=”initApp()”
horizontalAlign=”center”
width=”516″
height=”516″>
<mx:Style>
Application{
font-family:”MS YaHei”;
background-color:#FFFFFF;
theme-color:#FFFFFF;
padding-left:5;
padding-top:5;
}
Panel{
header-style-name:”fontStyle”;
}
.fontStyle{
font-size:14;
font-family:”MS YaHei”;
}
Alert{
font-family:”MS YaHei”;
font-size:12;
color:#000000;
theme-color:#FFFFFF;
background-color:#FFFFFF;
background-alpha:0.6;
}
</mx:Style>
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import flash.utils.setTimeout;
internal var socket:Socket=new Socket;
private function initApp():void
{
currentState="GetName";
}
private function getSocketDataHandler(evt:ProgressEvent):void
{
while (socket.bytesAvailable)
{
var msg:String=socket.readMultiByte(socket.bytesAvailable, "utf8");
//var msg:String = socket.readUTF();
if (msg.substring(0, 2) == "NO")
{
userSize.text=msg.substring(2, msg.length - 1);
}
else
{
socket_txt.text+=msg;
socket_txt.verticalScrollPosition=socket_txt.maxVerticalScrollPosition;
}
}
}
private function connectedHandler(evt:Event):void
{
Chat.title="鏈接服務器成功!";
}
private function closeHandler(evt:Event):void
{
Chat.title="鏈接已經關閉!";
}
public function sendMessage(msg:String):void
{
if (message_txt.text == "")
{
Alert.show("不能發送空信息,謝謝!");
}
else
{
if (socket.connected)
{
var message:ByteArray=new ByteArray();
message.writeUTFBytes(msg + "\r\n"); //避免亂碼
socket.writeBytes(message); //寫入socket緩沖區
socket.flush(); //發送信息
//socket_txt.text += msg+"\r\n";
message_txt.text="";
}
}
}
private function login()
{
currentState='';
socket.connect("10.129.90.27", 886);
socket.addEventListener(Event.CONNECT, connectedHandler);
socket.addEventListener(Event.CLOSE, closeHandler);
socket.addEventListener(ProgressEvent.SOCKET_DATA, getSocketDataHandler);
}
]]>
</mx:Script>
<mx:states>
<mx:State name=”GetName”>
<mx:RemoveChild target=”{Chat}”/>
<mx:AddChild position=”lastChild”>
<mx:Panel id=”reg”
x=”1″
y=”5″
height=”448″
width=”502″
layout=”absolute”>
<mx:TextInput id=”user”
fontSize=”12″
x=”161″
y=”116″/>
<mx:Button enabled=”{user.text==”?false:true}”
fontSize=”12″
x=”329″
y=”116″
label=”Button”
click=”login()”/>
<mx:Label fontSize=”12″
x=”112″
y=”118″
text=”姓名:”/>
</mx:Panel>
</mx:AddChild>
</mx:State>
</mx:states>
<mx:transitions>
<mx:Transition fromState=”*”
toState=”*”>
<mx:Parallel>
<mx:Iris target=”{Chat}”
duration=”1200″/>
<mx:Iris target=”{reg}”
duration=”1200″/>
</mx:Parallel>
</mx:Transition>
</mx:transitions>
<mx:Panel fontSize=”12″
layout=”absolute”
id=”Chat”
x=”1″
y=”5″
height=”501″
width=”502″>
<mx:TextArea id=”socket_txt”
x=”34″
y=”10″
width=”400″
height=”343″
fontSize=”12″/>
<mx:TextInput id=”message_txt”
enter=”sendMessage(user.text+’:'+message_txt.text)”
x=”105″
y=”361″
width=”259″
fontSize=”12″/>
<mx:Button click=”sendMessage(user.text+’:'+message_txt.text)”
x=”372″
y=”361″
label=”Send”
id=”button1″
fontSize=”12″/>
<mx:Label x=”34″
y=”363″
id=”userLabel”
text=”{user.text+’:'}”/>
<mx:Label x=”34″
y=”392″
id=”userSize”
width=”400″/>
</mx:Panel>
</mx:Application>
这只是一个模型,后续扩展基于这两个就可以了!~