《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.6节Socket网络通信

简介:

本节书摘来自异步社区《Android 3D游戏开发技术宝典——OpenGL ES 2.0》一书中的第2章,第2.6节Socket网络通信,作者 吴亚峰,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.6 Socket网络通信
Android 3D游戏开发技术宝典——OpenGL ES 2.0
伴随着移动互联网的高速增长,智能手机上的游戏娱乐应用也逐步由单机向网络化方向发展。因此对于Android开发人员来说,开发具有网络功能的应用程序成为了一项必备的技能。本节将向读者介绍网络开发中非常重要的一项技术,Socket(网络套接字)应用开发。

2.6.1 Socket开发基本知识
网络应用程序的开发也有很多不同的架构与模式,常见的有B/S、C/S等,Socket主要是用于进行传统的C/S模式应用的开发。C/S模式中主要需要开发两个端,服务端与客户端,其基本的工作原理如图2-27所示。

从图2-27中可以看出,C/S模式通信的基本过程如下。

(1)首先启动服务器,监听指定端口,等待接收客户端的连接请求。

(2)客户端请求连接到服务器的指定端口。

(3)服务器收到客户端的连接请求,建立连接。

(4)客户端和服务器同时各打开一个输入流和输出流,客户端的输出流与服务器的输入流连接,服务器的输出流与客户端的输入流连接。

(5)客户端与服务器端通过输入输出流进行双向的消息通信。

(6)当通信完毕后,客户端和服务器同时关闭本次连接。


11e8069d2af43ba19edccbf986169bd4e984a438

由于Android应用程序是使用Java进行开发,因此在Android平台下开发基于Socket的C/S模式程序非常简单,直接使用Java中的Socket与ServerSocket类即可。这与传统Java的网络套接字开发几乎没有区别,对于熟悉Java的大部分读者来说非常简单。

2.6.2 服务器端
上一小节简单介绍了基于Socket的C/S模式网络程序的基本工作原理,从本小节开始将向读者介绍一个基于Socket的简单案例。首先介绍服务端的开发,由于本案例比较简单,仅有一个类——Sample2_9_Server,其代码如下。

1 package com.bn.Sample2_9_Server;       //声明包名
2 import java.io.DataInputStream;       //导入相关类
3 ……//此处省略了部分类的引入代码,读者可自行查看随书光盘的源代码
4 import java.net.Socket;         //导入相关类
5 public class Sample2_9_Server{
6  static ServerSocket sSocket;       // ServerSocket的引用
7  public static void main(String[] args){     //主方法
8   try{
9    sSocket=new ServerSocket(8877);    //创建ServerSocket对象
10    System.out.println("监听8877接口……");  //打印信息
11    while(true){     //服务器启动后一直循环服务于不同的客户端
12     Socket socket=sSocket.accept();   //创建Socket对象
13     DataInputStream diStream=new DataInputStream(socket.  
      getInputStream());
14    DataOutputStream dotStream=new DataOutputStream(socket.  
     getOutputStream());
15     System.out.println("客户端信息:"+diStream.readUTF());
16     dotStream.writeUTF("成功连接服务器端");  //写入到输出流中
17     diStream.close();       //关闭输入流
18     dotStream.close();      //关闭输出流
19     socket.close();       //关闭Socket套接字
20   } }catch(Exception e){       //捕获并打印异常信息
21    e.printStackTrace();
22 } } }

第9行创建了ServerSocket对象,监听在服务器的8877端口。
第11-20行为服务循环,服务器一旦成功启动监听在指定的端口就进入此循环,按照指定的流程服务于一个一个的客户端。本案例中的服务流程为:首先与客户端建立双向数据流,然后首先接收客户端的信息,再向客户端返回信息。
运行本案例,其运行效果如图2-28所示。


1b7a348940d677cdc41ca4e8c04d6fa876878d17

2.6.3 客户端
开发完本案例的服务器端后,接下来在本小节中将主要介绍客户端的开发。由于本案例功能简单,因此客户端也仅有一个类——Sample29 ClientActivity,其代码如下。

1 package com.bn.Sample2_9_Client;      //声明包名
2 import java.io.DataInputStream;      //导入相关类
3 ……//此处省略了部分类的引入代码,读者可自行查看随书光盘的源代码
4 import android.widget.TextView;      //导入相关类
5 public class Sample2_9_ClientActivity extends Activity{ //创建继承Activity的主控制类
6     @Override
7     public void onCreate(Bundle savedInstanceState){  //重写的onCreate方法
8         super.onCreate(savedInstanceState);   
9         setContentView(R.layout.main);     //跳转到主界面
10         Button button=(Button)findViewById(R.id.button); //获得Button按钮的对象
11         button.setOnClickListener(     //为Button按钮添加监听器
12          new OnClickListener(){
13     public void onClick(View v){  //重写的onClick方法
14      connectServer();    //调用connectServer连接服务器
15  } } ); }
16     public void connectServer(){     //自定义的连接服务器的方法
17       String serverIp="192.168.0.103";   //声明服务器端IP
18       try{
19        Socket socket=new Socket(serverIp,8877); //创建Socket套接字,发出连接请求
20        DataInputStream din=new DataInputStream(socket.getInputStream());
21    DataOutputStream dout=new DataOutputStream(socket.getOutputStream());
22    EditText et=(EditText)this.findViewById(R.id.et);
             //获得EditText输入对话框对象
23    String tempStr=et.getText().toString();  //获取该对话框中的信息
24    dout.writeUTF(tempStr);   //将信息写入到输出流中
25    TextView tv=(TextView)this.findViewById(R.id.tv); //获得TextView的对象
26    tv.setText(din.readUTF());   //将输入流中的数据在TextView中显示
27    din.close();      //关闭输入流
28    dout.close();      //关闭输出流
29    socket.close();     //关闭Socket套接字
30       }catch(Exception e){     //捕获并打印异常信息
31        e.printStackTrace();
32 } } }

第7-15行为继承Activity后重写的onCreate方法,该方法在程序开始时执行。在该方法中首先获得“连接服务器端”按钮对象的引用,之后为该按钮添加监听器,监听器功能为connectServer方法连接服务器收发信息。
第16-32行为连接服务器收发信息的connectServer方法,其基本的工作流程为:首先向服务器发出连接请求,连接成功后建立双向数据流,然后首先将用户输入的信息发送给服务器端再从服务器端接收反馈信息。

提示 在创建Socket套接字对象时需要指明端口号以及服务器端的IP,这里的IP必须为真实IP,不能使用环回地址“127.0.0.1”。因此运行本案例时读者有可能需要根据自己计算机的具体情况修改服务器的IP地址,使得程序可以正常运行。同时,在开发客户端时需要在AndroidManifest.xml中声明联网权限,具体情况参见光盘中的源代码。
运行本案例,在上面的文本框中输入需要发送的信息,然后单击“连接服务器端”按钮。若网络没有问题,则在服务器端可以收到客户端发送的信息,如图2-29所示。同时,客户端也会收到服务器的反馈信息,如图2-30所示。


4c7699740b807047d6e809d6902c24f32ac719e3
相关文章
|
7月前
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
202 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
4月前
|
传感器 存储 Java
Android 3D效果的实现
本文详细讲解了如何在Android中实现3D效果,基于官方Demo并结合实际需求进行调整。通过传感器(Sensor)获取设备旋转数据,利用OpenGL ES绘制3D立方体,实现了动态旋转的视觉效果。文章分为需求分析、效果展示、实现步骤及源码解析,涵盖传感器注册与注销、OpenGL核心方法使用等内容,适合初学者学习参考。文末附完整代码,便于实践操作。
132 0
Android 3D效果的实现
|
6月前
|
API 数据处理 Android开发
Android网络请求演变:从Retrofit到Flow的转变过程。
通过这个比喻,我们解释了 Android 网络请求从 Retrofit 到 Flow 的转变过程。这不仅是技术升级的体现,更是反映出开发者在面对并发编程问题时,持续探索和迭求更好地解决方案的精神。未来,还会有更多新的技术和工具出现,我们期待一同 witness 这一切的发展。
186 36
|
4月前
|
传感器 Android开发 开发者
Android自定义view之3D正方体
本文介绍了如何通过手势滑动操作实现3D正方体的旋转效果,基于Android自定义View中的GLSurfaceView。相较于使用传感器控制,本文改用事件分发机制(onTouchEvent)处理用户手势输入,调整3D正方体的角度。代码中详细展示了TouchSurfaceView的实现,包括触控逻辑、OpenGL ES绘制3D正方体的核心过程,以及生命周期管理。适合对Android 3D图形开发感兴趣的开发者学习参考。
|
4月前
|
Web App开发 缓存 JavaScript
Android网络小说阅读器的实现
小说阅读Demo,。此Demo使用Jsoup解析HTML,实现小说数据抓取(数据源自网络),并包含自定义View、六章小说缓存等功能,但未实现下载。项目还包括屏幕适配、字体设置等,借助第三方框架完成优化。以下是主页、详情页、阅读页等界面展示。
|
6月前
|
存储 编解码 开发工具
Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现
本文详细探讨了在Android平台上实现HTTP-FLV播放器的过程。首先介绍了FLV格式的基础,包括文件头和标签结构。接着分析了HTTP-FLV传输原理,通过分块传输实现流畅播放。然后重点讲解了播放器的实现步骤,涵盖网络请求、数据解析、音视频解码与渲染,以及播放控制功能的设计。文章还讨论了性能优化和网络异常处理的方法,并总结了HTTP-FLV播放器的技术价值,尤其是在特定场景下的应用意义。
246 11
|
6月前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
165 15
|
7月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
203 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
11月前
|
安全 Android开发 iOS开发
安卓与iOS的较量:技术深度对比
【10月更文挑战第18天】 在智能手机操作系统领域,安卓和iOS无疑是两大巨头。本文将深入探讨这两种系统的技术特点、优势以及它们之间的主要差异,帮助读者更好地理解这两个平台的独特之处。
283 0
|
7月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
219 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡

热门文章

最新文章