




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java游戏开发 学习情境7:网络对弈程序,08游戏3-2,目标与任务,目标: 为游戏添加网络通信功能和游戏逻辑 ,利用Socket进行网络通信,C/S架构服务器端和客户端编写,B/S架构实现。 任务: 开发网络对弈程序,目标程序,完成项目开发:程序运行时,有两个客户端通过网络进行对奕。,学习过程,步骤一:先完成简单的C/S架构 步骤二:再完成第二个例,实现一个服务器与多个客户端通信 步骤三:再为服务器端创建线程,实现多线程服务器 步骤四:最后加入分析两客户端通信的信息,实现游戏规则的代码,网络通信基础,网络通信就是通过某种方法让一台计算机与其它计算机交换数据。 通信就是给其它计算机传数据,或者接收其它计算机发来的数据。 对网络的任何形式的访问最后都归结为从网卡接收数据或向网卡传送数据。 网络通信解决两个问题: (1)如何识别不同的计算机。 (2)如何传送数据。,网络通信问题,网络中的两台计算机靠协议进行通信 网络中用IP标识不同的通信实体,网络协议,在两台电脑间传送数据时,传送或接收数据的先后顺序,数据的格式等内容的约定构成通信的协议。 Internet网的数据传送有很多协议,如TCP/IP,UDP,FTP等,协议不同,具体到网络通信程序,接收和发送数据部分的代码会有不同。 本次的例子都是采用TCP/IP协议。,用IP识别网络中的计算机,网络上不同的计算机用IP来标识。 实际上一个IP对应一张网卡。 如果一台电脑上有多张网卡,那么就需要多个IP来标识每一张网卡。 每个网卡有多个端口,供应用程序采用不同的通信协议传输数据。 每种协议都采用不同的端口号,端口号可以设置,如设置某网卡用8080号端口进行TCP/IP协议方式的数据传输。,网络程序的架构,一般网络上程序都是一个服务器,一个客户端,这种程序的总体结构叫架构,如上图所示这种总体结构叫C/S架构(即客户/服务器)架构。 C/S架构中,提出数据访问要求的程序叫客户端,被提出数据访问要求的程序叫服务器端。 一个客户端可能是一台配置很高的电脑,一个服务器端可能只是一台普通电脑。 客户端和服务器端可以是同一台电脑。,C,S,C,S,C,S,网络编程工具,网络很普遍,所以,几乎所有的编程语言都提供网络编程的组件。 Java提供Socket组件供网络编程使用。 Socket是一个类。 在用Java进行网络编程时,只需使用Socket的有关方法 ,按照一定步骤编写出接收数据,处理数据,或处理数据,发送数据的代码即可。,Java Socket编程,事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些相对简单的API来完成这些工作。Socket就是其中之一,对于Java而言,这些API存在于 这个包里面,因此只要导入这个包就可以准备网络编程了。,Socket编程步骤,Java提供了对TCP套接字的良好的支持,有两种套接字类: .Socket; .ServerSocket; 当编写连接到已有服务的客户端软件的时候使用Socket类。当编写绑定到本地端口以提供服务的服务器软件的时候使用ServerSocket类。这是与DatagramSocket的UDP工作方式不同的地方-在TCP中,连接服务器地和从客户端接收数据的函数被分为两个独立的类。,Socket编程步骤,Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到的输入流其实就是从服务器端发回的数据流。GetOutputStream方法得到一个输出流,客户端Socket对象上的getOutputStream方法返回的输出流就是将要发送到服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。,Socket编程步骤,要完成这个工作,需要完成三个部分的工作,以下依次说明: 1、建立服务器类 2、建立客户端代码 3、建立用户界面,1、建立服务器类,创建服务器对象: ServerSocket server = new ServerSocket(9998) 建立一个Socket连接 : Socket incoming = server.accept() 输入流和输出流: BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream(); PrintWriter out = new PrintWriter(incoming.getOutputStream(),true); 随后,就可以使用in.readLine()方法得到客户端的输入,也可以使用out.println()方法向客户端发送数据。 关闭这两个数据流 out.close(); in.close();,2、建立客户端代码,创建一个Socket对象 :Socket socket = new Socket(“2“,9998); 数据的输入和输出 in = new BufferedReader(new InputStreamReader(socket.getInputStream(); out = new PrintWriter(socket.getOutputStream(),true);,项目核心:简单的C/S架构,客户机/服务器的典型通信过程: 1、服务器监听相应端口的输入; 2、客户机发出一个请求; 3、服务器接收到此请求; 4、服务器处理这个请求,并把结果返回给客户机; 5、重复上述过程,直至完成一次会话过程。,项目核心:简单的C/S架构,服务方: import java.io.*; import .*; public class MyServer public static void main(String args) throws IOException ServerSocket server=new ServerSocket(5678); Socket client=server.accept(); BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream(); PrintWriter out=new PrintWriter(client.getOutputStream(); while(true) String str=in.readLine(); System.out.println(str); out.println(“has receive“); out.flush(); if(str.equals(“end“) break; client.close(); ,项目核心:简单的C/S架构,这个程序的主要目的在于服务器不断接收客户机所写入的信息只到,客户机发送“End“字符串就退出程序,并且服务器也会做出“Receive“为回应,告知客户机已接收到消息。,项目核心:简单的C/S架构,客户机代码: import .*; import java.io.*; public class Client static Socket server; public static void main(String args)throws Exception server=new Socket(InetAddress.getLocalHost(),5678); BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream(); PrintWriter out=new PrintWriter(server.getOutputStream(); BufferedReader wt=new BufferedReader(new InputStreamReader(System.in); while(true) String str=wt.readLine(); out.println(str); out.flush(); if(str.equals(“end“) break; System.out.println(in.readLine(); server.close(); ,项目核心:简单的C/S架构,客户机代码则是接受客户键盘输入,并把该信息输出,然后输出“End“用来做退出标识。 这个程序只是简单的两台计算机之间的通讯,如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的。那么多个客户端如何实现呢?,一对一的C/S,一个Server 一个Client,一对多的C/S 一个server 多个Client,C,S,C,S,C,S,C,C,功能扩展:将客户端改成Java Applet,即B/S架构,为客户端设计符合需求的GUI。,网络通信模型 B/S架构:如果客户端是浏览器,则通信程序的架构叫浏览器/服务器架构(即Browser/Server架构,简称B/S架构)。客户端是通用的浏览器,省掉了客户端升级的麻烦。,功能扩展:将服务器端改进为 多线程服务器,一个服务器为多个客户端服务 其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身,而服务器通过accept方法就是同意和客户建立通讯.这样当客户建立Socket的同时。服务器也会使用这一根连线来先后通讯,那么既然如此只要我们存在多条连线就可以了。那么我们的程序可以变为如下:,功能扩展:将服务器端改进为 多线程服务器,改进为多线程服务器: try file:/建立服务器 ServerSocket server = new ServerSocket(9998); int i=1; for(;) Socket incoming = server.accept(); new ServerThread(incoming,i).start(); i+; catch (IOException ex) ex.printStackTrace(); ,功能扩展:将服务器端改进为 多线程服务器,这里仅仅只是加了一个外层的While循环,这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的“End“消息.那么现在就实现了多客户之间的交互了。,功能扩展:将服务器端改进为 多线程服务器,但是.问题又来了,这样做虽然解决了多客户,可是是排队执行的。也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互,无法做到同时服务,那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了。所以线程是最好的解决方案。,功能扩展:将服务器端改进为 多线程服务器,那么下面的问题是如何使用线程.首先要做的事情是创建线程并使得其可以和网络连线取得联系。然后由线程来执行刚才的操作,要创建线程要么直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了.而要执行线程就必须重写run方法,而run方法所做的事情就是刚才单线程版本main所做的事情,因此我们的程序变成了multiThread.java,应用升级:网络对奕游戏,本程序实现的是基于B/S模式的网络对奕游戏,实现了多线程编程,实现多客户对奕。并且实现了服务器端管理客户端的功能,包括客户端和服务器端。 实现功能: 用户上线包括新用户上线和已使用过该系统的用户上线 每位在线的用户将会收到该用户上线的通知,应用升级:网络对奕游戏,该用户会收到所有已在线的用户的信息朋友下线 服务器端删除该用户信息每位在线的用户将会收到该用户下线的通知, 同时删除
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度资产经营责任合同模板
- 2025海南三亚人民医院四川大学华西三亚医院海南医科大学校园招聘模拟试卷带答案详解
- 2025物业管理委托合同简化版样本
- 2025第十三届贵州人才博览会沿河土家族自治县县管国有企业引才17人模拟试卷及答案详解(考点梳理)
- 2025内蒙古通辽市开鲁县卫生健康系统招聘卫生专业技术人员15人模拟试卷及一套完整答案详解
- 2025华东师范大学开放教育学院教师发展学院招聘1人(上海)考前自测高频考点模拟试题及答案详解(名师系列)
- 2025赤峰市松山区招聘9名政府专职消防员考前自测高频考点模拟试题及答案详解一套
- 2025安徽宿州萧县中医院面向应届毕业生校园招聘10人模拟试卷附答案详解(考试直接用)
- 安全教育培训全年总结课件
- 学法用法考试题库及答案
- 北京市2019-2024年中考满分作文131篇
- DL-T 5022-2023 发电厂土建结构设计规程
- 电话催收培训课件
- 2025年电力行业质量月活动总结范文
- 中小学内控管理制度
- 特种设备重大事故隐患判定准则题库
- 2025至2030年中国瑜伽行业市场现状调查及未来前景研判报告
- 消防防护装备课件
- 《2025版防范电信网络诈骗宣传手册》专题讲座
- 高二下学期《知荣明耻+抵制劣行》主题班会
- 肝癌综合治疗措施
评论
0/150
提交评论