flex跟后台socket通信的例子,可以指定字符编码。
<xml version="1.0" encoding="utf-8">
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
<mx:Style source="css/style.css"/>
<mx:Script source="script/FlexSocket.as"/>
<mx:TextArea id="txtReceive" backgroundColor="#000000" color="#00FF00" editable="false"/>
<mx:TextInput id="txtSend" focusOut="getFocus()"/>
<mx:Button id="btnSend" label="Send" width="80" height="25" click="send()"/>
</mx:Application>
FlexSocket.as:
import flash.events.Event:
import flash.events.ProgressEvent:
import flash.net.Socket:
import flash.utils.ByteArray:
private var socket:Socket:
private var timer:Timer:
public function init():void{
this.focusManager.setFocus(txtSend):
try{
socket = new Socket():
socket.addEventListener(Event.CONNECT, onConnect):
socket.addEventListener(ProgressEvent.SOCKET_DATA, onReceive):
socket.addEventListener(Event.CLOSE,onClose):
socket.connect( "localhost", 2900):
}
catch(event:Error){
txtReceive.text += "socket连接失败!":
}
}
private function onConnect(event:Event):void {
txtReceive.text += "socket 连接成功...../r":
}
private function onReceive(event:ProgressEvent):void{
var bytes:ByteArray = new ByteArray():
while (socket.bytesAvailable) {
socket.readBytes(bytes,0,socket.bytesAvailable):
}
var message:String:
try {
message = bytes.readMultiByte(bytes.length,"utf-8"):
//message = bytes.readUTFBytes(bytes.length).replace("/r/n","/r"):
txtReceive.text += message:
}
catch (event:Error){
}
txtReceive.verticalScrollPosition = txtReceive.maxVerticalScrollPosition:
}
private function onClose(event:Event):void{
txtReceive.text += "socket 连接断开...../r":
}
private function sendMessage(message:String):void{
var socketData:ByteArray = new ByteArray():
socketData.writeUTFBytes(message):
socket.writeBytes(socketData):
socket.flush():
}
private function send():void{
var message:String = txtSend.text + "/r" :
sendMessage(message):
txtSend.text = "":
this.focusManager.setFocus(txtSend):
}
Java版多线程socket服务端代码:
import java.io.BufferedReader:
import java.io.IOException:
import java.io.InputStreamReader:
import java.io.PrintWriter:
import java.io.UnsupportedEncodingException:
import java.net.ServerSocket:
import java.net.Socket:
import java.util.concurrent.ExecutorService:
import java.util.concurrent.Executors:
public class MultiThreadServer {
private int port = 2900:
private ServerSocket serverSocket:
private ExecutorService executorService:
// 线程池 private final int POOL_SIZE = 10:
// 单个CPU线程池大小 public MultiThreadServer() throws IOException {
serverSocket = new ServerSocket(port):
// Runtime的availableProcessor()方法返回当前系统的CPU数目. executorService = Executors.newFixedThreadPool(Runtime.getRuntime() .availableProcessors() * POOL_SIZE):
System.out.println("多线程socket服务器启动,在2900端口监听连接....."):
}
public void service() {
Socket socket = null:
while (true) {
try {
// 接收客户连接,只要客户进行了连接,就会触发accept():
从而建立连接 socket = serverSocket.accept():
executorService.execute(new Handler(socket)):
}
catch (Exception e) {
e.printStackTrace():
}
}
}
public static void main(String[] args) throws IOException {
new MultiThreadServer().service():
}
}
class Handler implements Runnable {
private Socket socket:
public Handler(Socket socket) {
this.socket = socket:
}
private PrintWriter getWriter(Socket socket) throws IOException {
return new PrintWriter(socket.getOutputStream(), true):
}
private BufferedReader getReader(Socket socket) throws IOException {
return new BufferedReader(new InputStreamReader(socket.getInputStream())):
}
public String echo(String msg) {
try {
return new String(("echo:" + msg).getBytes(),"utf-8"):
}
catch (UnsupportedEncodingException e) {
e.printStackTrace():
}
return "":
}
public void run() {
try {
System.out.println("接收到新的连接来自: " + socket.getInetAddress() + ":" + socket.getPort() + ",准备接收消息......"):
BufferedReader br = getReader(socket):
PrintWriter pw = getWriter(socket):
String msg = null:
while ((msg = br.readLine()) != null) {
System.out.println("接收到来自 " + socket.getInetAddress() + ":" + socket.getPort() + " 的消息:/r/n" + msg):
pw.println(echo(msg) ):
System.out.println("发送完毕:" + msg):
if (msg.equals("bye")) break:
}
}
catch (IOException e) {
e.printStackTrace():
}
finally {
try {
if (socket != null) socket.close():
}
catch (IOException e) {
e.printStackTrace():
}
}
}
}