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

简介:

本节书摘来异步社区《OpenGL ES 3.x游戏开发(上卷)》一书中的第2章,第2.5节,作者: 吴亚峰 责编: 张涛,更多章节内容可以访问云栖社区“异步社区”公众号查看。

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)当通信完毕后,客户端和服务器同时关闭本次连接。


24

由于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所示。


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所示。


26_27

相关文章
|
2月前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
在数字时代,网络应用成为连接世界的桥梁。Python凭借简洁的语法和丰富的库支持,成为开发高效网络应用的首选。本文通过实时聊天室案例,介绍Python Socket编程的基础与进阶技巧。基础篇涵盖服务器和客户端的建立与数据交换;进阶篇则探讨多线程与异步IO优化方案,助力提升应用性能。通过本案例,你将掌握Socket编程的核心技能,推动网络应用飞得更高、更远。
42 1
|
2天前
|
Java
[Java]Socket套接字(网络编程入门)
本文介绍了基于Java Socket实现的一对一和多对多聊天模式。一对一模式通过Server和Client类实现简单的消息收发;多对多模式则通过Server类维护客户端集合,并使用多线程实现实时消息广播。文章旨在帮助读者理解Socket的基本原理和应用。
11 1
|
8天前
|
消息中间件 监控 网络协议
Python中的Socket魔法:如何利用socket模块构建强大的网络通信
本文介绍了Python的`socket`模块,讲解了其基本概念、语法和使用方法。通过简单的TCP服务器和客户端示例,展示了如何创建、绑定、监听、接受连接及发送/接收数据。进一步探讨了多用户聊天室的实现,并介绍了非阻塞IO和多路复用技术以提高并发处理能力。最后,讨论了`socket`模块在现代网络编程中的应用及其与其他通信方式的关系。
|
11天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【10月更文挑战第10天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。
|
2月前
|
网络协议 Python
网络世界的建筑师:Python Socket编程基础与进阶,构建你的网络帝国!
在数字宇宙中,网络如同复杂脉络连接每个角落,Python Socket编程则是开启这一世界的钥匙。本文将引导你从基础概念入手,逐步掌握Socket编程,并通过实战示例构建TCP/UDP服务器与客户端。你将学会使用Python的socket模块进行网络通信,了解TCP与UDP的区别,并运用多线程与异步IO提升服务器性能。跟随本文指引,成为网络世界的建筑师,构建自己的网络帝国。
33 2
|
2月前
|
网络协议 Python
告别网络编程迷雾!Python Socket编程基础与实战,让你秒变网络达人!
在网络编程的世界里,Socket编程是连接数据与服务的关键桥梁。对于初学者,这往往是最棘手的部分。本文将用Python带你轻松入门Socket编程,从创建TCP服务器与客户端的基础搭建,到处理并发连接的实战技巧,逐步揭开网络编程的神秘面纱。通过具体的代码示例,我们将掌握Socket的基本概念与操作,让你成为网络编程的高手。无论是简单的数据传输还是复杂的并发处理,Python都能助你一臂之力。希望这篇文章成为你网络编程旅程的良好开端。
50 3
|
2月前
|
网络协议 开发者 Python
网络编程小白秒变大咖!Python Socket基础与进阶教程,轻松上手无压力!
在网络技术飞速发展的今天,掌握网络编程已成为开发者的重要技能。本文以Python为工具,带你从Socket编程基础逐步深入至进阶领域。首先介绍Socket的概念及TCP/UDP协议,接着演示如何用Python创建、绑定、监听Socket,实现数据收发;最后通过构建简单的聊天服务器,巩固所学知识。让初学者也能迅速上手,成为网络编程高手。
66 1
|
23天前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
19 0
|
2月前
|
网络协议 安全 网络安全
震惊!Python Socket竟能如此玩转网络通信,基础到进阶全攻略!
【9月更文挑战第12天】在网络通信中,Socket编程是连接不同应用与服务的基石。本文通过问答形式,从基础到进阶全面解析Python Socket编程。涵盖Socket的重要性、创建TCP服务器与客户端、处理并发连接及进阶话题如非阻塞Socket、IO多路复用等,帮助读者深入了解并掌握网络通信的核心技术。
53 6
|
2月前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【9月更文挑战第14天】网络协议是机器间交流的约定格式,确保信息准确传达。主要模型有OSI七层与TCP/IP模型,通过分层简化复杂网络环境。IP地址全局定位设备,MAC地址则在本地网络中定位。网络分层后,数据包层层封装,经由不同层次协议处理,最终通过Socket系统调用在应用层解析和响应。

热门文章

最新文章