网上智力扑克系统的设计
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
摘要
Internet飞速发展的今天,网络已成为人们生活,学习,工作,娱乐的重要组成部分,网络游戏更是风靡全国,随着网络游戏的盛行,越来越多的人选择网络游戏做为学习、工作之余的消遣,尤其是网络棋牌游戏更是倍受青睐。基于此,本课题开发一套适合于娱乐消遣的在线扑克游戏。
本文对C/S模型,抽象窗口工具包AWT,Java网络编程,Java多线程编程,进行详细的描述,然后利用这些技术设计实现了一个基于C/S模型的网上智力扑克系统,该系统利用Socket编程实现了客户端和服务器之间的通信,服务器端使用多线程技术来实现对多个客户端的支持以及消息的处理和转发。客户端分别采用单独的线程实现了聊天和游戏功能,游戏时使用了BufferedImage类来加载扑克图片,并实现了随机洗牌算法,以及根据暗牌游戏规则进行游戏的算法。 copyright think58 [版权所有:http://think58.com]
关键词:Eclipse;Thread;Socket;在线扑克;走牌;
技术背景
2.1 C/S结构简介
C/S结构(Client/Server结构)是大家熟知的客户机和服务器结构。它是软件体系结构,通过它可以充分利用两端硬件环境的优势,将任务分配到Client端和Server端来实现,降低了系统的通讯开销。目前,大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的外部的用户都可以访问新的和现有的应用系统,通过现有应用系统扣的逻辑可以扩展出新的应用系统。也就是目前应用系统的发展方向。
C/S又称Client/Server或客户/服务器模式。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle,Sysbase,InfORMix或SQL Server。客户端需要安装专用的客户端软件。
传统的C/S体系结构虽然采用的是开放模式,查这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要选定的软件支持。由于没能提供用户真正期望的开放环境,C/S结构的软件需要针对不同的操作系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上的局域网用户同时使用。而且代价高,效率低。 本文来自think58
2.2抽象窗口工具包AWT简介
AWT概述:一个用于实现图形用户界面的类库。AWT(Abstract Windowing Toolkit)即抽象窗口工具包的简写,AWT主要包括:
组件(Components):定义了所有的图形化界面元素及绘制方法。
容器(Containers):可以包含多个基本组件,以便统一操作和管理。
布局管理器(Layouts):定义了布置、管理界面元素的方法。
Java多线程编程技术
2.3.1线程基础知识
线程(thread)是独立于其他线程运行的程序执行单元。Java程序可能包含多个执行线程,使主机实际上只有一个单CPU,这些线程也会表现得好象在独立的(多个)CPU上运行一样。在许多程序设计语言中,多纯种功能都是事后才增加的。而在Java中则不同,多线程与Java及其核心包是紧密集成的。Java中与线程有关的类有:
Object类:仅支持三种方法(wait(),notify(),notifyAll())。
Thread类:提供完整的线程管理和控制功能。
Runnable接口:如果一个类是从其他类派生而来,就只能使用接口来支持线程啦。
ThreadDeath类:当线程被强制终止的时候,抛掷一个ThreadDeath对象。可以捕获ThreadDeath对象,对线程终止进行处理。捕获ThreadDeath对象后,必须再次抛掷,才能使线程真正死去。
内容来自think58 [来源:http://www.think58.com]
ThreadGroup类:用于管理一组线程。
2.3.2 线程安全类
设计一个可能用于并发程序的类时,也就是说,这样一个类的实例可能同时由多个线程使用,在这种情况下,一定要确保此类是线程安全(thread-safe)的,这一点不能懈怠。要保证线程安全有许多方法。有一种特别简单的方法,这就是设计不可变的类:如果一个对象的状态永远也不会改变,那么任何线程都不可能观察到不一致状态下的对象。但是,有些类是必须可变的,为了使这样的类是线程安全的,必须避免多个线程并发访问一个实例的内部状态。因为Java的设计本身就融入了线程,因此Java语言提供了sychronized修饰符,其作用正是如此(即保证不会由多个线程并发访问一个实例的内部状态)。一个实例方法声明为synchronized时,一个线程在调用此方法之前必须得到该实例的一个锁。如果其锁已经被另外一个线程所拥有,那么前一个线程就要阻塞,直到可以得到其需要的锁为止。这们可以确保一次只有一个线程可以调用实例的任何同步方法。但是,将每一个类的每个方法都声明为sychronized并不是一个好的设计。因为调用一个同步方法相对于调用一个非同步的方法来说会慢得多,这是由于加锁的开销所致。
2.3.3 死锁
多线程程序设计要求程序员在许多方面都要倍加小心。例如,如果多个线程可以同时改变一个对象的状态,通常必须使用sychronized方法或sychronized语句,以确保一次只有一个线程修改对象的状态。如果未能做到,两个线程最终就会覆盖对方所做的编辑,而导致对象牌不一致的状态。遗憾的是,使用同步本身也会带来问题。线程同步涉及获取一个互斥锁。只有当前拥有锁的线程才能执行同步代码。不过,当一个程序使用多个锁时,主可能出现死锁:当两个或多个纯种都在等待获得锁,而锁目前正由加外某个正在等待的线程所拥有,此时就出现了死锁。由于每个线程都在等待获得锁,任何一个线程都不能释放其已经拥有的锁,这就是意味着所有等待线程都无法得到其等待的锁。不过,要避免死锁,可以要求所有线程都按同样的顺序获得其所需的所有锁。
本文来自think58 [资料来源:THINK58.com]
内容来自think58 [来源:http://think58.com]