HarmonyOS NEXT智能终端应用开发 课件 第8章 访问网络_第1页
HarmonyOS NEXT智能终端应用开发 课件 第8章 访问网络_第2页
HarmonyOS NEXT智能终端应用开发 课件 第8章 访问网络_第3页
HarmonyOS NEXT智能终端应用开发 课件 第8章 访问网络_第4页
HarmonyOS NEXT智能终端应用开发 课件 第8章 访问网络_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章访问网络现代智能终端对网络通信的支持已经是一种必不可少的功能。鸿蒙平台支持多种方式的网络通信,包括:HTTP通信、WebSocket通信、NFC通信、蓝牙通信、拨打电话通信、数据短消息通信等。本章对常用的网络通信编程进行介绍。目录8.1使用HTTP访问网络8.2使用WebSocket访问网络8.3访问蜂窝通信服务8.4案例:基于WebSocket的在线聊天系统8.5练习:个人云端相册8.1使用HTTP访问网络HTTP,也就是HyperTextTransferProtocol的简写,是一种标准的网络通信协议。HTTP通信指的是基于HTTP协议的数据通信。HTTP协议广泛用于Web客户端与Web服务端之间的数据通信,但是,HTTP协议不是只能用于Web客户端与Web服务端之间的通信,它可以用于任何客户端/服务器模式的通信应用中。8.1.1HTTP服务端程序设计使用HTTP协议进行数据通信,需要一个服务端程序的支持,因此,需要首先构建一个HTTP服务端程序。所构建的服务端基于RESTful模式,客户端发送请求从服务端获取指定的图片,然后客户端将图片显示在终端界面上。由于服务端程序设计超出本书范围,因此,这里只对服务端程序设计进行简单的说明。本节所的服务端程序使用idea工具采用Java语言基于SpringBoot进行设计,客户端可以向服务端程序发送包含两个参数的请求用于控制服务端程序返回的图像类别:type参数,取值可以是1或者2,用于控制图像的种类;id参数,取值可以为1或者为2,用于控制图像的编号。如图所示,服务器程序根据type参数和id参数将返回4张图像的1张到客户端程序。首先使用idea工具创建基于SpringBoot的Web工程,在创建SpringBoot工程时,务必勾选“SpringWeb”依赖,如图。服务端主程序代码如下:packagecom.example.httpserver;

importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplicationpublicclassHttpserverApplication{publicstaticvoidmain(String[]args){SpringApplication.run(HttpserverApplication.class,args);}}创建Java类,完成客户端的请求和应答,该程序是一个Restful的Controller,服务程序代码如下:packagecom.example.httpserver.rest;

importjakarta.servlet.http.HttpServletResponse;importorg.apache.tomcat.util.http.fileupload.IOUtils;importorg.springframework.web.bind.annotation.*;importorg.springframework.web.multipart.MultipartFile;

importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.util.List;

@RestControllerpublicclassImageController{//通过形如“http:://xxxx:8080/image/1/2”获取图片数据@GetMapping("/image/{type}/{id}")publicvoidgetImage(@PathVariable("type")inttype,@PathVariable("id")intid,HttpServletResponseresponse)throwsIOException{Stringfilename="D:/Current/images/png"+type+id+".png";Filefile=newFile(filename);response.setContentType("image/png");IOUtils.copy(newFileInputStream(file),response.getOutputStream());}

//通过形如“http:://xxxx:8080/image?type=1&id=1”获取图片数据@RequestMapping(value="/image")publicvoidmethod1(HttpServletResponseresponse,@RequestParam(value="type",defaultValue="0")Integertype,@RequestParam(value="id",defaultValue="0")Integerid)throwsIOException{Stringfilename="D:/Current/images/png"+type+id+".png";Filefile=newFile(filename);response.setContentType("image/png");IOUtils.copy(newFileInputStream(file),response.getOutputStream());}

//POST方法,在获取指定图片的同时,上传文件到服务端//通过形如“http:://xxxx:8080/image?type=1&id=1”的POST方法获取图片数据@PostMapping("/image")publicvoidpostImage(HttpServletResponseresponse,@RequestParam(value="type",defaultValue="0")Integertype,@RequestParam(value="id",defaultValue="0")Integerid,@RequestPart("images")List<MultipartFile>images)throwsIOException{if(!images.isEmpty()){for(MultipartFilemp:images){if(!mp.isEmpty()){Stringname=mp.getOriginalFilename();mp.transferTo(newFile("D:/Current/images/"+name));}}}Stringfilename="D:/Current/images/png"+type+id+".png";Filefile=newFile(filename);response.setContentType("image/png");IOUtils.copy(newFileInputStream(file),response.getOutputStream());}}服务端程序提供了三种获取图片的方式:方式一,通过形如“http:://xxxx:8080/image/1/2”的GET方法获取图片数据;方式二,通过形如“http:://xxxx:8080/image?type=1&id=1”的GET方法获取图片数据;方式三,通过形如“http:://xxxx:8080/image?type=1&id=1”的POST方法获取图片数据的同时,可以上传文件到服务端。例如,为了获取type为2、id为1的图片,通过方式一,并通过浏览器来测试,结果如图。强调一下,为了能够使该服务端的程序能够正常运行,需要将4张图片分别命名为png11.png、png12.png、png21.png、png22.png,并放置在服务端程序所运行的计算机的D盘的“D:/Current/images/”目录下,这个目录也是上传文件的存放目录。8.1.2使用HTTP的GET方法发送请求HTTP的GET请求方法常用于从服务端程序获取数据。不论使用何种请求方法,使用鸿蒙HTTP发送请求和处理响应的过程是相似的,如下:第一步:导入HTTP模块;第二步:创建HttpRequest对象;第三步:订阅HTTP响应头事件(可选);第四步:发起HTTP请求,解析服务器响应事件;第五步:取消订阅HTTP响应头事件(可选,如果第三步有订阅,则需要取消订阅);第六步:调用HttpRequest对象的destroy()方法销毁请求对象。下面举例说明如何使用鸿蒙HTTP模块进行网络数据通信。这个例子首先在主界面上显示4个按钮,用户点击不同的按钮将从上一节的服务端程序获取不同的图片,然后将图片显示在界面上。为此,新建名称为ch0801的鸿蒙工程,修改Index.ets为如下代码:import{common}from'@kit.AbilityKit';import{image}from'@kit.ImageKit';import{http}from'@kit.NetworkKit';import{BusinessError}from'@kit.BasicServicesKit';

@Entry@ComponentstructIndex{@Stateip:image.PixelMap|undefined=undefined;

privatedownload(type:number,id:number){lethttpRequest=http.createHttp();httpRequest.request(//采用服务端提供的方式一获取图片//"00:8080/image/"+type+"/"+id,//也可以采用如下方式二获取图片"00:8080/image?type="+type+"&id="+id,{method:http.RequestMethod.GET,//默认为http.RequestMethod.GET},async(err:BusinessError,data:http.HttpResponse)=>{if(!err){letab:ArrayBuffer=data.resultasArrayBuffer;constis=image.createImageSource(ab);this.ip=awaitis.createPixelMap();httpRequest.destroy();}else{console.error('error:'+JSON.stringify(err));httpRequest.destroy();}});}

build(){Column(){Grid(){GridItem(){Button('第一张图片').width('100%').height('100%').fontSize(20).backgroundColor(Color.Gray).onClick(()=>{this.download(1,1);})}

GridItem(){Button('第二张图片').width('100%').height('100%').fontSize(20).backgroundColor(Color.Gray).onClick(()=>{this.download(1,2);})}GridItem(){Button('第三张图片').width('100%').height('100%').fontSize(20).backgroundColor(Color.Gray).onClick(()=>{this.download(2,1);})}

GridItem(){Button('第四张图片').width('100%').height('100%').fontSize(20).backgroundColor(Color.Gray).onClick(()=>{this.download(2,2);})}}.width('100%').height(140).margin(20).rowsTemplate('1fr1fr').columnsTemplate('1fr1fr').columnsGap(10).rowsGap(15)

Image(this.ip).width('90%').height(300).margin(10)}.width('100%').height('100%').justifyContent(FlexAlign.Start)}}鸿蒙平台规定,应用程序访问网络必须申请访问网络的权限,为此,需要在程序的module.json5配置文件中向用户申请网络权限。在其中添加如下代码(其中的加重部分带代码):{"module":{"requestPermissions":[{"name":"ohos.permission.INTERNET"//申请网络权限}],

"name":"entry",……//此处省略}8.1.3使用HTTP的POST方法发送请求使用HTTP的POST方法请求与使用GET方法发送请求的过程类似,只是在请求选项上需要指定POST方法,以及指定发送的参数的格式。下面举例说明如何使用HTTP的POST方法发送请求。在这个例子中,除了从服务端程序获取指定的图片外,还上传了文件到服务端程序中。因此,该程序的运行效果与上一节的例子类似,通过点击不同按钮,获取并显示不同的图片,但是,该程序还会上传两张图片到服务端程序。新建名称为ch0802的鸿蒙工程,修改Index.ets为如下代码:import{common}from'@kit.AbilityKit';import{image}from'@kit.ImageKit';import{http}from'@kit.NetworkKit';import{BusinessError}from'@kit.BasicServicesKit';import{fileIoasfs,ReadOptions}from'@kit.CoreFileKit';

@Entry@ComponentstructIndex{@Stateip:image.PixelMap|undefined=undefined;

privatecreate_file_for_upload(fn:string,content:string){letcontext=this.getUIContext().getHostContext()ascommon.UIAbilityContext;letfilesDir=context.filesDir;letfile=fs.openSync(filesDir+'/'+fn,fs.OpenMode.READ_WRITE|fs.OpenMode.CREATE);letwriteLen=fs.writeSync(file.fd,content);fs.closeSync(file);}

privatedownload(type:number,id:number){letcontext=this.getUIContext().getHostContext()ascommon.UIAbilityContext;this.create_file_for_upload('abc.text','Howdoyoudo?');this.create_file_for_upload('abd.text','Iamfine,andyou?');

lethttpRequest=http.createHttp();httpRequest.request(//也可以采用如下方式三获取图片"00:8080/image",{method:http.RequestMethod.POST,//使用POST方法,因此可以上传文件header:{'Content-Type':'multipart/form-data'},

//当Header的'content-Type'为'multipart/form-data'时生效,//该属性用于支持向服务器上传二进制数据multiFormDataList:[{name:"type",//普通参数,参数名称为typecontentType:'text/plain',data:type+'',//注意,此处必须为字符串类型},{name:"id",//普通参数,参数名称为idcontentType:'text/plain',data:id+'',//注意,此处必须为字符串类型},{name:"images",//上传文件contentType:'text/plain',filePath:`${context.filesDir}/abc.text`,remoteFileName:'abc.text'},{name:"images",//上传文件contentType:'text/plain',filePath:`${context.filesDir}/abd.text`,remoteFileName:'abd.text'}]},async(err:BusinessError,data:http.HttpResponse)=>{if(!err){letab:ArrayBuffer=data.resultasArrayBuffer;constis=image.createImageSource(ab);this.ip=awaitis.createPixelMap();httpRequest.destroy();}else{console.error('error:'+JSON.stringify(err));httpRequest.destroy();}});}

build(){Column(){Grid(){GridItem(){Button('第一张图片').width('100%').height('100%').fontSize(20).backgroundColor(Color.Gray).onClick(()=>{this.download(1,1);})}

GridItem(){Button('第二张图片').width('100%').height('100%').fontSize(20).backgroundColor(Color.Gray).onClick(()=>{this.download(1,2);})}GridItem(){Button('第三张图片').width('100%').height('100%').fontSize(20).backgroundColor(Color.Gray).onClick(()=>{this.download(2,1);})}

GridItem(){Button('第四张图片').width('100%').height('100%').fontSize(20).backgroundColor(Color.Gray).onClick(()=>{this.download(2,2);})}}.width('100%').height(140).margin(20).rowsTemplate('1fr1fr').columnsTemplate('1fr1fr').columnsGap(10).rowsGap(15)

Image(this.ip).width('90%').height(300).margin(10)}.width('100%').height('100%').justifyContent(FlexAlign.Start)}}在运行这个程序之前,先在module.json5文件中申请网络访问权限,然后运行这个程序。程序的运行效果与上一节的例子类似。由于这个例子上传了文件,因此,在服务端的上传文件存放目录“D:/Current/images/”下将存在两个新文件,如图。8.2使用WebSocket访问网络WebSocket是一种网络通信协议,它允许客户端和服务器之间建立一个持久的网络通信连接,并在该连接上进行全双工通信,也就是在建立连接之后客户端和服务器端可以同时主动发送数据到对方。Websocket适用于实时性要求高的场景下,例如在线聊天、实时游戏等应用。因为使用WebSocket也需要服务端支持,因此,先设计一个WebSocket服务端程序。8.2.1WebSocket服务端程序设计WebSocket服务端程序采用idea工具,使用Java语言基于SpringBoot实现。该服务端程序在建立于客户端的连接后。可以接收客户端发送的信息,然后补上信息的时间戳后把信息发回给客户端,当收到的信息是“bye”字符串时,则关闭于客户端的WebSocket连接从而结束对话。为此,使用idea工具创建一个选中了WebSocket依赖项的SpringBoot工程,如图。按照提示等待工程创建完成。然后编写服务端代码,工程代码包括三个文件。1、WebsocketserverApplication.java,代码如下:packagecom.example.websocketserver;

importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplicationpublicclassWebsocketserverApplication{publicstaticvoidmain(String[]args){SpringApplication.run(WebsocketserverApplication.class,args);}}2、WebSocketConfig.java,代码如下:packagecom.example.websocketserver;

importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.socket.server.standard.ServerEndpointExporter;

@ConfigurationpublicclassWebSocketConfig{@BeanpublicServerEndpointExporterserverEndpointExporter(){returnnewServerEndpointExporter();}}3、MessageServer.java,主要功能类,通过WebSocket协议于客户端进行通信,代码如下:packagecom.example.websocketserver;

importjakarta.websocket.*;importjakarta.websocket.server.PathParam;importjakarta.websocket.server.ServerEndpoint;importorg.springframework.stereotype.Component;

importjava.io.IOException;importjava.nio.ByteBuffer;importjava.text.SimpleDateFormat;importjava.util.Date;

@Component@ServerEndpoint("/mess/{username}")publicclassMessageServer{SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");

@OnOpenpublicvoidonOpen(Sessionsession,EndpointConfigconfig,@PathParam(value="username")Stringusername){System.out.println("Anewclientconnected:"+username);}

@OnClosepublicvoidonClose(Sessionsession,CloseReasonreason){}

@OnMessagepublicvoidonMessage(Sessionsession,Stringmessage){session.getAsyncRemote().sendText(sdf.format(newDate())+":\n"+message);if(message.equals("bye")){try{session.close();}catch(IOExceptione){thrownewRuntimeException(e);}}}

@OnMessagepublicvoidonMessage(Sessionsession,PongMessagemessage){}

@OnMessagepublicvoidonMessage(Sessionsession,ByteBuffermessage){}

@OnErrorpublicvoidonError(Sessionsession,Throwablee){System.out.println("Somethingwentwrong!");e.printStackTrace();}}8.2.2WebSocket客户端功能设计在鸿蒙程序中使用WebSocket与服务端程序进行通信,基本过程如下:客户端通过createWebSocket()方法创建WebSocket对象,然后通过调用connect()方法连接到服务器:当连接成功后,客户端会收到open事件的回调,之后客户端就可以通过send()方法与服务器进行通信;当服务器发信息给客户端时,客户端会收到message事件的回调;当客户端想要关闭WebSocket连接时,通过调用close()方法主动断开连接后,客户端会收到close事件的回调;若在上述过程中发生错误,客户端会收到error事件的回调。下面举一个例子说明如何使用WebSocket与服务端程序进行通信。这个例子程序的主界面上有一个输入文本,一个按钮和一个文本框,用户在输入文本中输入一些文字,点击按钮即可将文字发送到服务端。服务端程序收到客户端的信息后,会为信息加上时间戳然后回送所收到的文字到客户端,客户端收到服务端的信息后,将信息显示在文本框中。为此,新建名为ch0803的鸿蒙工程,修改Index.ets为如下代码:import{webSocket}from'@kit.NetworkKit';import{BusinessError}from'@kit.BasicServicesKit';

@Entry@ComponentstructIndex{@Statemessage:string='';@Stateback:string='';

privatetarget="ws://00:8080/mess/200";privatews=webSocket.createWebSocket();privateconnect_state:boolean=false;

onDidBuild():void{this.ws.on('open',(err:BusinessError,value:Object)=>{console.log("onopen,status:"+JSON.stringify(value));this.connect_state=true;});

this.ws.on('message',(err:BusinessError,value:string|ArrayBuffer)=>{console.log("onmessage,message:"+value);this.back=valueasstring;});

this.ws.on('close',(err:BusinessError,value:webSocket.CloseResult)=>{console.log("onclose,codeis"+value.code+",reasonis"+value.reason);this.connect_state=false;this.ws.close();});

this.ws.on('error',(err:BusinessError)=>{console.error("onerror,error:"+JSON.stringify(err));});

this.connect();}

privateconnect():void{this.ws.connect(this.target,(err:BusinessError,value:boolean)=>{if(!err){console.log("Connectedsuccessfully");}else{console.error("Connectionfailed.Err:"+JSON.stringify(err));}});}

privatesend_message(mess:string):void{if(!this.connect_state)return;this.ws.send(this.message,(err:BusinessError,value:boolean)=>{if(!err){console.log("Messagesendsuccessfully");}else{console.error("Failedtosendthemessage.Err:"+JSON.stringify(err));}});}

build(){Column(){TextInput({text:$$this.message}).width('95%').height(100).border({width:2,radius:5}).fontSize(20)Button("发送消息").width('95%').height(40).border({width:2,radius:5}).margin(10).onClick(()=>{this.send_message(this.message);})Text(this.back).width('95%').height(100).border({width:2,radius:5}).fontSize(20)}.height('100%').width('100%')}}由于使用WebSocket进行通信需要和网络访问权限,因此,需要在module.json5中增加如下代码申请授权:{"module":{"requestPermissions":[{"name":"ohos.permission.INTERNET"//申请网络权限}],

"name":"entry",……//此处省略}8.3访问蜂窝通信服务鸿蒙平台的蜂窝通信服务提供一系列API帮助开发通讯类应用,例如,拨打电话功能、发送短信息功能、获取电话SIM卡信息等。8.3.1拨打电话开发者可以使用makeCall()接口,启动系统电话应用,用户可以自行呼出通话。当然,如果要能够拨打电话,需要满足两个条件:其一,智能能够支持拨打电话,例如智能手机;其二,设备需插入可用的SIM卡。下面通过一个简单的例子了解如何拨打电话,这个例子允许用户在程序主界面上点击按钮即可启动拨打电话功能界面。为此,新建名称为ch0804的鸿蒙工程,修改Index.ets为如下代码:import{call}from'@kit.TelephonyKit';import{BusinessError}from'@kit.BasicServicesKit';

@Entry@ComponentstructIndex{build(){Column(){Button('拨打电话').width('95%').height(40).margin(10).fontWeight(FontWeight.Bold).onClick(()=>{this.call();})}.height('100%').width('100%')}

privatecall():void{letisSupport=call.hasVoiceCapability();if(isSupport){//电话号码格式,如"tel:13xxxx"call.makeCall("13xxxx",(err:BusinessError)=>{if(!err){console.log("makecallsuccess.");}else{console.log("makecallfail,erris:"+JSON.stringify(err));}});}}}8.3.2发送短信类似于上一节的拨打电话功能,也可以在程序中启动系统的发送短信应用界面,从而可以发送短信。为了发送短信,需要满足两个条件:其一,智能系统能够支持短信收发,例如智能手机;其二,设备需插入可用的SIM卡。下面通过一个简单的例子介绍如何启动系统短息发送应用。在该程序的主界面中,点击按钮即可启动系统发送短信应用并发送短信。为此,新建名为ch0805的鸿蒙工程,并修改Index.ets为如下代码:import{common,Want}from'@kit.AbilityKit';

constMMS_BUNDLE_NAME="com.ohos.mms";constMMS_ABILITY_NAME="com.ohos.mms.MainAbility";constMMS_ENTITIES="entity.system.home";

classContact{contactsName:string;telephone:string;

constructor(contactsName:string,telephone:string){this.contactsName=contactsName;this.telephone=telephone;}}

@Entry@ComponentstructJumpMessage{privatecontext=this.getUIContext().getHostContext()ascommon.UIAbilityContext;

startMMSAbilityExplicit(){letparams:Array<Object>=[newContact("张三",'138xxxxxxxx')];

letwant:Want={bundleName:"com.ohos.mms",abilityName:"com.ohos.mms.MainAbility",parameters:{contactObjects:JSON.stringify(params),pageFlag:"conversation",//这里填写短信内容。content:"我是短信具体内容"}};

this.context.startAbilityForResult(want).then((data)=>{console.log("Success"+JSON.stringify(data));}).catch(()=>{console.log("error");});}

build(){Row(){Column(){Button('发送短信').onClick(()=>{this.startMMSAbilityExplicit();})}.width('100%')}.height('100%')}}8.4案例:基于WebSocket的在线聊天系统WebSocket协议由于其保持持久的网络连接,因此,比较适合用于实时聊天的应用场景。这个例子使用WebSocket实现一个聊天系统。8.4.1案例目标设计一个类似微信群聊的在线聊天系统,该系统包含一个服务端和鸿蒙APP前端。用户通过APP前端发送信息给其他用户,也就是,任一用户发送的信息都将通过服务端实时转发到所有在线的群聊用户。服务端程序不保存任何信息,也就是说,对于不在线的用户,将不能看到未在线时其他用户发送的信息。8.4.2案例分析聊天系统的后台服务端程序使用Java语言、基于idea工具、SpringBoot的WebSocket框架实现。由于WebSocket是多例多线程的,因此,需要设计一个公共的列表用于保存所有在线的用户连接。同时,由于后台服务端系统的多线程特性,需要对这个保存连接的列表进行并发访问控制。服务端程序将包括三个文件:1、 ChatterApplication.java,聊天服务端入口程序;2、 WebSocketConfig.java,WebSocket配置程序;3、 ChatterServer.java,聊天服务端业务功能实现代码。聊天系统的客户端采用鸿蒙APP实现,实现的聊天效果类似微信的群聊,也就是,将所有其他用户发送的信息和自己发送的信息将分开两边显示,这样便于操作和查看。客户端是一个鸿蒙APP工程,其中的主要功能都将在Index.ets中完成。8.4.3案例实施首先设计服务端程序。使用idea工具和Java语言新建一个SpringBoot的WebSocket工程,服务端包括三个程序文件。1、ChatterApplication.java,聊天服务端入口程序,程序代码如下:packagecom.example.chatter;

importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplicationpublicclassChatterApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ChatterApplication.class,args);}}2、WebSocketConfig.java,WebSocket配置程序,程序代码如下:packagecom.example.chatter;

importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.socket.server.standard.ServerEndpointExporter;

@ConfigurationpublicclassWebSocketConfig{@BeanpublicServerEndpointExporterserverEndpointExporter(){returnnewServerEndpointExporter();}}3、ChatterServer.java,聊天服务端业务功能实现代码,程序代码如下:packagecom.example.chatter;

importjakarta.websocket.*;importjakarta.websocket.server.PathParam;importjakarta.websocket.server.ServerEndpoint;importorg.springframework.stereotype.Component;

importjava.io.IOException;importjava.nio.ByteBuffer;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;

@Component@ServerEndpoint("/chat/{username}")publicclassChatterServer{privatestaticMap<String,Session>online=newConcurrentHashMap<>();privateStringusername="";

SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");

@OnOpenpublicvoidonOpen(Sessionsession,EndpointConfigconfig,@PathParam(value="username")Stringusername){System.out.println(username+"isconnected!");this.username=username;online.put(username,session);}

@OnClosepublicvoidonClose(Sessionsession,CloseReasonreason){try{session.close();}catch(IOExceptione){thrownewRuntimeException(e);}finally{online.remove(username);}}

@OnMessagepublicvoidonMessage(Sessionsession,Stringmessage){for(Map.Entry<String,Session>entry:online.entrySet()){if(entry.getKey().equals(username))continue;entry.getValue().getAsyncRemote().sendText(username+"-"+sdf.format(newDate())+":\n"+message);}}

@OnMessagepublicvoidonMessage(Sessionsession,PongMessagemessage){}

@OnMessagepublicvoidonMessage(Sessionsession,ByteBuffermessage){}

@OnErrorpublicvoidonError(Sessionsession,Throwablee){System.out.println("Somethingwentwrong!");e.printStackTrace();}}再设计客户端代码。新建名为ch0806的鸿蒙工程,然后,修改Index.ets文件为如下内容:import{webSocket}from'@kit.NetworkKit';import{BusinessError}from'@kit.BasicServicesKit';

@Entry@ComponentstructIndex{@Statetext:string='';@S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论