您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 广告经营 > 使用Socket、Java开发一个CS架构的多人聊天室
今天我们来制作Flash聊天室,学习使用Socket类,用Java作后台,开发一个C/S架构的多人聊天程序。首先,设计用户界面。一、界面设计界面的元件全部使用FlashCS3自带的组件:首先,放入TextInput组件(实例名input_txt),作为用户输入;再放入Button组件(实例名submit_btn),用于提交输入的信息;最后放入TextArea组件(实例名output_txt),显示聊天信息。二、组件参数初始化由于客户端代码不是很多,我们这次就写在动作帧上://************组件参数初始化************submit_btn.label=发送消息;output_txt.editable=false;//设置各组件中字体的大小input_txt.setStyle(textFormat,newTextFormat(null,15));output_txt.setStyle(textFormat,newTextFormat(null,15));submit_btn.setStyle(textFormat,newTextFormat(null,15,null,true));//当按下回车或点击submit_btn按钮后调用事件处理函数submit_btn.addEventListener(MouseEvent.CLICK,sendMessage);addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);//事件处理函数functiononKeyDown(evt:KeyboardEvent):void{if(evt.keyCode==Keyboard.ENTER){sendMessage(null);}}functionsendMessage(evt:Event):void{//测试:将input_txt的内容输出到output_txt中output_txt.appendText(input_txt.text+\n);//清空input_txt,并设置焦点到input_txtinput_txt.text=;stage.focus=input_txt;}三、编写客户端Socket1.首先,Socket连接非常简单:varsocket:Socket=newSocket();socket.connect(127.0.0.1,8888);其中connect()方法中的两个参数分别为是主机名和端口号(端口号尽量用1024以上)。好了,这样就连接上了。接下来是读写的问题。2.向服务器端写入字符串:我们在sendMessage()方法中进行写入操作,注意写出的字串必需以回车(\n)结束:functionsendMessage(evt:Event):void{varbytes:ByteArray=newByteArray();bytes.writeUTFBytes(input_txt.text+\n);socket.writeBytes(bytes);socket.flush();//清空input_txt,并设置焦点到input_txtinput_txt.text=;stage.focus=input_txt;}3.读取服务器端写回的字符串:最后将服务器发回的字符串输出到output_txt文本域中://当客户端socket收到数据后会调用readMessage()函数socket.addEventListener(ProgressEvent.SOCKET_DATA,readMessage);functionreadMessage(evt:ProgressEvent):void{output_txt.appendText(socket.readUTF()+\n);}四、Flash客户端全部脚本//************组件参数初始化************submit_btn.label=发送消息;output_txt.editable=false;input_txt.setStyle(textFormat,newTextFormat(null,15));output_txt.setStyle(textFormat,newTextFormat(null,15));submit_btn.setStyle(textFormat,newTextFormat(null,15,null,true));submit_btn.addEventListener(MouseEvent.CLICK,sendMessage);addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);functiononKeyDown(evt:KeyboardEvent):void{if(evt.keyCode==Keyboard.ENTER){sendMessage(null);}}functionsendMessage(evt:Event):void{varbytes:ByteArray=newByteArray();bytes.writeUTFBytes(input_txt.text+\n);socket.writeBytes(bytes);socket.flush();input_txt.text=;stage.focus=input_txt;}//************客户端Socket************varsocket:Socket=newSocket();socket.connect(127.0.0.1,8888);socket.addEventListener(ProgressEvent.SOCKET_DATA,readMessage);functionreadMessage(evt:ProgressEvent):void{output_txt.appendText(socket.readUTF()+\n);}五、编写Java服务器端Socket最后,我们需要编写Java后台服务器端的代码。首先,创建一个ServerSocket作为Socket服务器。当有客户端连接后通过accept()方法即可得到客户端的Socket:ServerSocketsocketServer=newServerSocket(8888);System.out.println(服务器已启动,等待客户端连接);//accept()方法是阻塞式的,当有客户端连接成功后才继续执行Socketsocket=socketServer.accept();System.out.println(客户端连接成功);然后得到与客户端的输入流和输出流(输入流是客户端连接到服务器的管道,输出流则是服务器到客户端的管道)://获得输入流和输出流,输入流为BufferedReader类型,输出流为DataOutputStream类型BufferedReaderreader=newBufferedReader(newInputStreamReader(socket.getInputStream(),UTF-8));DataOutputStreamwriter=newDataOutputStream(socket.getOutputStream());拿到输入输出流以后,就可以通过输入流(InputStream)读取Flash客户端发来的字符串,通过输出流(OutputStream)向Flash客户端写字符串:while(true){//readLine()方法也是阻塞式的,当客户端有消息发来就读取,否则就一直等待Stringmsg=reader.readLine();//当客户端发送的字符串为null时,说明客户端已经关闭,此时退出循环if(msg==null){System.out.println(客户端已离开);break;}//将读入的信息加工后再写回客户端writer.writeUTF(写回客户端的+msg);}以上是ServerSocket与AS3Socket通信的基本原理。在实际应用中,会有多个客户端连接这个ServerSocket,因此要创建一个多线程的Socket服务器。下面简述一下多线程Socket服务器原理:当socketServer.accept()之后就需要实例化一个线程对象,在该对象中持有socketServer.accept()返回的Socket对象,然后让线程跑起来执行读写操作。如果再来一个客户端就再跑一个线程,同样执行读写操作。同时,用一个List容器来管理这些对象。最终服务器端的代码如下:importjava.io.BufferedReader;importjava.io.DataOutputStream;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.UnsupportedEncodingException;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;publicclassFlashScoket{privateListClientclientList=newArrayListClient();publicstaticvoidmain(String[]args){newFlashScoket().runSocket();}privatevoidrunSocket(){try{ServerSocketsocketServer=newServerSocket(8888);System.out.println(服务器已启动,等待客户端连接);while(true){//accept()方法是阻塞式的,当有客户端连接成功后才继续执行Socketsocket=socketServer.accept();System.out.println(客户端连接成功);//实例化一个Client对象,并启动该线程Clientclient=newClient(socket);clientList.add(client);client.start();}}catch(IOExceptione){e.printStackTrace();}}classClientextendsThread{privateSocketsocket;privateBufferedReaderreader;privateDataOutputStreamwriter;privateClient(Socketsocket){this.socket=socket;try{//获得输入流和输出流,输入流为BufferedReader类型,输出流为DataOutputStream类型reader=newBufferedReader(newInputStreamReader(socket.getInputStream(),UTF-8));writer=newDataOutputStream(socket.getOutputStream());}catch(UnsupportedEncodingExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}@Overridepublicvoidrun(){try{while(true){//readLine()方法也是阻塞式的,当客户端有消息发来就读取,否则就一直等待Stringmsg=reader.readLine();//当客户端发送的字符串为null时,说明客户端已经关闭,此时退出循环if(msg==null){clientList.remove(this);System.
本文标题:使用Socket、Java开发一个CS架构的多人聊天室
链接地址:https://www.777doc.com/doc-4211520 .html