来决定哪张牌该是打出的牌。
由于小型计算设备缺乏完整地处理和存储信息的能力,所以J2ME提出了通用连接框架(Generic Connection Framework,GCF),用来连接网络。通过GCF,可以用来连接服务器端,利用后台处理系统处理和存储数据的能力。
可以使用GCF中描述的Connector类建立网络连接。可以使用Connector类来访问七个GCF连接接口之一。GCF连接接口为网络操作提供了基本的体系结构,并且为编写网络代码提供了独立的网络协议。使用GCF连接接口同样可以忽略底层的网络协议。Connection接口是最基本的连接,可以用于打开或者关闭一个连接[16]。在程序的实现过程中,本文用下列一段代码实现:
String url= "socket://192.168.0.41:10001";
SocketConnection sc = null;
sc = (SocketConnection) Connector.open(url);
这样就打开了Connection。
InputStream类定义了一个打开的连接读取数据的基本接口。首先打开一个连接,再创建从InputStream类派生来的合适的类实例。InputStream主要的方法是read()方法和close()方法。其中read()方法可以从打开的连接中读取多个字节,将读取的字节存储到作为参数传给read()方法的数组或者字符串中。而close()方法则用来终止输入流,但是并不是关闭连接。您很少需要调用close()方法,因为当InputStream的实例超出命名空间时就会自动关闭这个输入流。但是,调用close()方法释放资源是一种好习惯。
OutputStream类定义了一个往一个打开的连接中写数据的基本接口。首先打开一个连接,然后再创建从OutputStream类派生来的合适的类的实例。然后调用OutputStream类的一个方法往连接中写数据。在OutputStream类中,主要的方法是write()和close()。其中write()方法是将数组或者字符串中的元素写到输出流中[17]。而OutputStream的close()方法和InputStream的close()方法功能基本一样,不再重复讲述。
GCF支持三种网络通信协议,分别是超文本传输协议(Hypertext Transfer Protocol,HTTP)、文件传输协议(File Transfer Protocol,FTP)和套接字协议(Socket)。这里,本文采用套接字(Socket)协议来进行与服务器端进行联网[18]。
Socket是在Unix中被首先提出的,被广泛应用于Internet程序设计中。Socket是与远程计算机的端口的连接,并且使用HTTP命令交换信息。HTTP命令可以使您的应用程序向一台远程计算机发送一个要求获得数据流的HTTP请求。返回时,远程计算机会发送一个HTTP应答作为对您的应用程序的应答。假设您的应用程序希望从一台远程计算机的特定文件存储器上接受一个数据流。首先您的应用程序应该打开与这台服务器上的端口的socket连接。接着应用程序发送GET命令和文件名作为HTTP请求的一部分。然后您的应用程序就能读取包含了远程服务器的HTTP应答的流。
Java有两个socket类,Java.net.Socket和Java.net.ServerSocket很好的支持了TCP套接字。当编写与已有服务连接的客户软件时,应该使用Socket类。当编写绑定到本地端口,以提供服务的服务器软件时,应该使用ServerSocket类[19]。这与处理UDP的DatagramSocket类的工作方式不同-连接到服务器端的功能和从客户接受数据的功能在TCP下被分成了独立的类。
Socket类表示客户端套接字,它属于一台或两台机器的TCP通信端口之间的通信信道。套接字可以与本地系统的端口连接,从而无需另一台机器,但是多数网络软件包含的是两台机器。然而,TCP套接字不会在多于两台机器之间通信。如果需要这种功能,那么客户应该建立多个套接字连接,为每台机器建立一个连接。
ServerSocket类表示服务器端套接字,服务器套接字是一种特殊类型的套接字,被用来提供TCP服务。客户套接字绑定到本地机器上的任何空闲端口,并连接到特定的服务器端口和主机。服务器套接字的不同之处在于它们绑定到本地机器的特定端口,这样远程客户就可以定位服务。客户套接字连接只能连接到一台机器,而服务器套接字可以响应多个客户的请求。
服务器套接字的工作方式很简单-客户知道运行在某个特殊端口上的服务(通常是被人熟知的端口号,被用于特殊协议,但是服务器也可能在非标准端口号上运行)。它们建立连接,该连接在服务器内被接受。可以同时接受多个连接,或者服务器可以选择在某个给定的时刻只接受一个连接。连接被一旦接受,那么该连接就以Socket对象的形式,由一个普通的套接字来表示,一旦你掌握了Socket类,那么编写服务器软件就变得与编写客户软件一样简单了。服务器与客户的唯一差异在于,服务器使用ServerSocket对象绑定到某个特定端口。ServerSocket对象充当客户连接的工厂,你不必创建Socket类的实例。这些连接被设计成常见的套接字方式,所以你可以连接输入/输出过滤器流(或者甚至读取器和写入器)和这些连接。
手机游戏的通讯协议如表3.1所示。
表3.1 手机游戏的通讯协议
协议种类 |
协议标识 |
协议内容 |
备注 |
Check |
001 |
标识,牌值,牌点数,打出的牌。 |
c->s,请求服务器进行吃碰杠检测。 |
Hu |
002 |
标识,牌值,牌点数。 |
c->s,请求服务器进行和牌检测。 |
Think |
003 |
标识,牌值,牌点数。 |
c->s,请求服务器决定该出的牌。 |
Rs_Check |
004 |
标识,牌值,结果。 |
s->c,服务器发送核对的结果。 |
Rs_Hu |
005 |
标识,牌值,结果。 |
s->c,服务器发送是否和牌的结果。 |
Rs_Think |
006 |
标识,牌值,结果。 |
s->c,服务器发送电脑出牌的结果。 |
手机客户端采用Socket进行与PC服务器端进行网络互联,由于Socket编程是以发包的形式进行数据传送的,所以,本文必须对包的通讯协议进行定义,规范地定义数据包,可以使网络通讯相对比较稳定。如表3.1所示,对于不同的协议种类设置不同的协议内容,对于001协议,本文采用标识+牌值+牌点数+打出的牌的格式内容进行数据包的传递,由于Socket是建立在TCP上的通讯协议,所以其在客户端对数据包中内容的顺序与在服务器端收到的数据包中内容的顺序是一样的。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页