《OpenGL ES 3.x游戏开发(上卷)》一2.5 Socket网络通信

2.5 Socket网络通信

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

2.5.1 Socket开发基本知识

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

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

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

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

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

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

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

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

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

2.5.2 服务器端

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

1    package com.bn.Sample2_8_Server;                    //声明包名
2    import java.io.DataInputStream;                        //导入相关类
3    ……//此处省略了部分类的引入代码,读者可自行查看随书的源代码
4    import java.net.Socket;                            //导入相关类
5    public class Sample2_8_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-25所示。

2.5.3 客户端

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

1    package com.bn.Sample2_8_Client;                     //声明包名
2    ……//此处省略了部分类的引入代码,读者可自行查看随书的源代码
3    public class Sample2_8_ClientActivity extends Activity{//创建继承Activity的主控制类
4        @Override
5        public void onCreate(Bundle savedInstanceState){     //重写的onCreate方法
6            super.onCreate(savedInstanceState);
7            setContentView(R.layout.main);                 //跳转到主界面
8            Button button=(Button)findViewById(R.id.button);     //获得Button按钮的引用
9            button.setOnClickListener(                    //为Button按钮添加监听器
10                new OnClickListener(){
11            public void onClick(View v){                 //重写的onClick方法
12                new Thread(){
13                    public void run(){
14                        connectServer();        //调用connectServer连接服务器
15                }}.start();
16         }} );}
17        public void connectServer(){                  //自定义的连接服务器的方法
18            String serverIp="10.16.189.20";                //声明服务器端IP
19            try{
20                Socket socket=new Socket(serverIp,8877); //创建Socket套接字,发出连接请求
21                DataInputStream din=new DataInputStream(socket.getInputStream());
22                DataOutputStream dout=new DataOutputStream(socket.getOutputStream());
23                EditText et=(EditText)this.findViewById(R.id.et);
                                             //获得EditText输入对话框对象
24                String tempStr=et.getText().toString();    //获取该对话框中的信息
25                dout.writeUTF(tempStr);                     //将信息写入到输出流中
26                TextView tv=(TextView)this.findViewById(R.id.tv); //获得TextView的对象
27                tv.setText(din.readUTF());//将输入流中的数据在TextView中显示
28                din.close();                            //关闭输入流
29                dout.close();                            //关闭输出流
30                socket.close();                            //关闭Socket套接字
31            }catch(Exception e){
32                e.printStackTrace();                            //捕获并打印异常信息
33    }}}
  • 第5-16行为继承Activity后重写的onCreate方法,该方法在程序开始时执行。在该方法中首先获得“连接服务器端”按钮对象的引用,之后为该按钮添加监听器,监听器功能为connectServer方法连接服务器收发信息。
  • 第17-33行为连接服务器收发信息的connectServer方法,其基本的工作流程为:首先向服务器发出连接请求,连接成功后建立双向数据流,然后将用户输入的信息发送给服务器端再从服务器端接收反馈信息。

提示

在创建Socket套接字对象时需要指明端口号以及服务器端的IP,这里的IP必须为真实IP,不能使用环回地址“127.0.0.1”。因此运行本案例时读者有可能需要根据自己计算机的具体情况修改服务器的IP地址,使得程序可以正常运行。同时,在开发客户端时需要在AndroidManifest.xml中声明联网权限,具体情况参见中的源代码。

运行本案例,在上面的文本框中输入需要发送的信息,然后单击“连接服务器端”按钮。若网络没有问题,则在服务器端可以收到客户端发送的信息,如图2-26所示。同时,客户端也会收到服务器的反馈信息,如图2-27所示。

时间: 2024-09-20 09:04:15

《OpenGL ES 3.x游戏开发(上卷)》一2.5 Socket网络通信的相关文章

《OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》——6.4节点法向量和面法向量

6.4 点法向量和面法向量 OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例 本章前面几节的案例都是基于球面开发的,球面属于连续.平滑的曲面,因此面上的每个顶点都有确定的法向量.但现实世界中的物体表面并不都是连续.平滑的,此时对于面上的某些点的法向量计算就不那么直观了,图6-18说明了这个问题. 从图6-18中可以看出,顶点A位于长方体左.上.前3个面的交界处,此处是不光滑的.这种情况下顶点A的法向量有两种处理策略,具体如下所列. 在顶点A的位置放置3个不同的顶点,每个顶点看作是仅

《OpenGL ES 3.x游戏开发(上卷)》一第1章 Android概述

第1章 Android概述 OpenGL ES 3.x游戏开发(上卷)随着移动互联网时代的到来,智能手机逐渐走进了人们的生活, Google公司于2007年11月5日发布了基于Linux平台的开源手机操作系统--Android.由于Android系统的开源性以及其他各个方面的因素,其受到了广大手机厂商的青睐,因此需要大量的Android开发人员来满足日益增长的海量软件开发需求. 提示 有些读者可能会有一点奇怪,不是介绍OpenGL ES 3.0的知识吗,怎么一开始就介绍Android呢?这是因为

《OpenGL ES 3.x游戏开发(上卷)》一第2章 游戏开发相关的 Android基础知识

第2章 游戏开发相关的 Android基础知识 OpenGL ES 3.x游戏开发(上卷)虽然本书主要是介绍OpenGL ES 3.0 3D应用及游戏开发的,但由于很多3D游戏应用中还需要用到目标平台的一些其他应用开发方面的知识,而本书3D基础知识部分主要是借助于Android平台来介绍OpenGL ES 3.0 3D应用及游戏开发的.故本章将向读者简要介绍一些在Android游戏开发中必备的一些基础知识,如音效.文件的读取.游戏信息的存储.Socket网络.蓝牙网络等. 提示 由于介绍Andr

OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》一6.3 定位光与定向光

6.3 定位光与定向光 OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例上一节中介绍的光照效果都是基于定位光光源的,定位光光源类似于现实生活中的白炽灯灯泡,其在某个固定的位置,发出的光向四周发散.定位光照射的一个明显特点就是,在给定光源位置的情况下,对不同位置的物体产生的光照效果不同. 现实世界中并不都是定位光,例如照射到地面上的阳光,光线之间是平行的,这种光称为定向光.定向光照射的明显特点是,在给定光线方向的情况下,场景中不同位置的物体反映出的光照效果完全一致.图6-16中对定位

《OpenGL ES 3.x游戏开发(下卷)》一导读

前 言 OpenGL ES 3.x游戏开发(下卷) 为什么要写这样一套书 随着智能手机硬件性能的不断提升,如"水果忍者""极品飞车""狂野飙车8:极速凌云"等一批优秀的3D游戏娱乐应用在广大智能机用户间流行开来.与此同时,也带动了手机游戏产业逐渐从2D走向3D.但目前国内专门介绍3D游戏开发的书籍与资料都非常少,同时3D应用开发的门槛又比较高,使得很多初学者无从下手.根据这种情况,笔者结合多年从事3D游戏应用开发的经验编写了这样一套书. 了解一些

《OpenGL ES 3.x游戏开发(上卷)》一1.4 已有Android项目的导入和运行

1.4 已有Android项目的导入和运行 上一节介绍了如何搭建Android开发环境.如何开发Hello Android应用程序以及如何调试Android的应用程序,接下来在本节中将简要介绍已有Android项目的导入和运行. 1.4.1 项目的导入 首先介绍怎样将已有的Android项目导入Eclipse,此处以本书最后部分大案例中的"3D可爱抓娃娃"为例进行讲解,具体步骤如下. (1)启动Eclipse,依次单击"File|Import",系统将弹出导入项目的

《OpenGL ES 3.x游戏开发(上卷)》一2.7 小结

2.7 小结 本章主要对Android平台下游戏开发中可能会用到的Android平台的相关基础知识进行详细介绍,如文件的I/O操作.SQLite数据库的增.删.改.查,游戏中声音特效.蓝牙互连等.只有学好这些基础知识,开发人员才能开发出更好的Android手机游戏.读者一定要在这些基础上下足工夫,今后的开发道路才会一帆风顺. 提示 Android平台的其他相关知识还有很多,由于本书侧重于介绍OpenGL ES 3.0 3D应用程序的开发,故本章只是简单介绍了一些与3D开发不直接相关的,但在游戏开

《OpenGL ES 3.x游戏开发(上卷)》一导读

前 言 为什么要写这样一本书随着智能手机硬件性能的不断提升,如水果忍者.极品飞车.狂野飙车等一批优秀的3D游戏娱乐应用在众多智能机用户间流行开来.与此同时,也带动了手机游戏产业逐渐从2D走向3D.但目前国内专门介绍这方面开发的书籍与资料都非常少,同时3D应用开发的门槛又比较高,使得很多初学者无从下手.根据这种情况,笔者结合多年从事3D游戏应用开发的经验编写了本书. 了解一些3D开发领域的技术人员都知道,移动嵌入式平台上的3D应用开发主要是基于OpenGL ES的3个版本,1.x.2.x和3.x.

《OpenGL ES 3.x游戏开发(上卷)》一1.5 Android应用程序运行的机制

1.5 Android应用程序运行的机制 前面介绍了如何搭建Android开发环境.如何开发Hello Android应用程序以及Android应用程序的调试,接下来在本节中将简要地介绍Android应用程序的运行机制. 1.5.1 应用程序的系统架构 Android平台由应用程序.应用程序框架.Android运行时.系统库以及底层Linux内核构成,详细结构如图1-68所示. 说明 应用程序层里面包含的就是需要读者去发挥创意开发的.各种各样丰富多彩的应用程序,这也是一般Android应用开发人

《OpenGL ES 3.x游戏开发(上卷)》一2.1 游戏中的音效

2.1 游戏中的音效 一款好游戏,除了具备优质的画面和较高的可玩性之外,还应该有出色的音效.音效一般指的是游戏中发生特定行为或进行特定操作时播放的效果音乐或为了渲染整体气氛播放的背景音乐等,如远处隆隆的炮声.由远而近的脚步声等. 开发人员通过精心准备的声音特效,并结合游戏酷炫的场景,可以渲染出一种紧张刺激的氛围,使玩家产生身临其境的感觉.这就像电影中的声音特效一样,假如没有了合适的音效,那么游戏和电影一样,真实感会大打折扣. 提示 按照作用的不同,可以将音效划分为即时音效和背景音乐.两种音效在A