网络五子棋的设计与实现
网络五子棋的设计与实现
数学学院 054 班 罗伟春 学号:2050122123
中文摘要
目前,以计算机技术和网络技术为核心的现代网络技术已在现实生活和生产
中得以广泛的使用,休闲类网络游戏集趣味性,娱乐性,互动性和益智性于一体,
已经成为多数人群的休闲方式。本软件使用 JAVA 语言实现,通过对 SCOKET
技术的理解,在此基础上建立服务器与多客户端的连接,利用多线程处理多个客
户端之间的信息。
关键词:多线程、SCOKET、客户端、服务器
1
网络五子棋的设计与实现
1、引言:
1.1、五子棋介绍
五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“連
珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(Five in a Row 的缩写),
亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴
阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和
高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既
有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结
晶。
1.2、开发环境及运行环境
开发环境:
Intel core 2 duo 1.8GHz 1G内存 160硬盘
Microsoft® Windows™XP Professional
JDK 1.50
Eclipse 3.3.2
运行环境:
IntelPentium® 2及以上处理器,32M以上内存,4G以上硬盘
Microsoft® Windows™ 9X/NT/XP操作系统
800*600或以上的屏幕分辨率
2、C/S 模式下网络五子棋的设计
网络互连实现信息的共享成为以后计算机的发展趋势,现有的网络编程模式
主要分成两类:一种是基于C/S(Client/Server客户机/服务器)模式,另一种是B/S
(Browser/Server,浏览器/服务器)模式;C/S 程序具有好的交互性,功能强大, 但
是客户端必须安装客户端软件,限制了其应用;B/S 模式下要求客户端具有浏览
器,但浏览器在安全方面有一些限制,交互性与功能有一些限制。网络五子棋系
统应用于局域网,对交互性要求较高,本系统选用了C/S 模式进行实现,网络内
部使用TCP/IP 方式利用Socket 通过传输层提供的服务,使用Java 进行图形用户
的搭建,系统分成两个部分,分别为服务端程序以及客户端程序。
2
网络五子棋的设计与实现
本文首先介绍系统设计思想以及相关协议的制定,以及分别阐述了服务端程
序以及客户端程序的具体实现。
五子棋网络游戏主要分为两个部分,游戏服务端和游戏客户端。五子棋游戏
规则:游戏双方各执一种颜色的棋子,轮流在棋盘下棋子,一方的棋子在横、竖、
两个对角线上首先到达五子者为胜方;游戏服务端主要存储所有连线客户的相关
信息及各种状态,并负责游戏客户之间信息的传递;游戏客户端提供客户连接服
务器,创建、加入、退出游戏等等功能,并能与联网客户进行游戏。
3.1、系统设计思想
本系统的功能能够实现一个在网络上供客户进行对战的五子棋网络游戏,
客户只要登陆到服务器上,就能选择任何其它用户已创建好的游戏,进行五子棋
对战游戏,是C/S 模式的网络游戏。在C/S 模式游戏中,Server 一般提供所有
用户的全局信息,并能提供客户之间的信息转发,客户之间的通讯必须通过
Server进行。因为在多个客户能够连接到同一台Server上,所以Server必须用
Thread 负责每个用户的通讯和消息处理。
服务端程序通过一个Thread 监听客户端的连接,一旦客户连接,为该客户
建立连接并启动一个特定的客户thread,利用该连接不断从客户读取数据,实现
客户和服务器或者客户与客户之间的信息的交互。
3.2、系统总体设计
系统使用 Socket 技术以及 java 多线程机制结合在进行客户与服务端之间
信息的交互,但一个真正实用程序必须针对具体应用定制一套协议用于用户程序
之间进行交互,而该协议的定制往往是编写程序的关键也是核心内容,该协议的
完善决定程序是否能够正常运行。所谓协议就是程序之间交互的信息的格式规
定,服务端和客户端都遵循该协议才能够进行对话,通俗讲是人类之间的语言。
一、服务端接受的信息:(1)客户端连接信息,一个客户包含两个 Socket 连
接, 一个为 chatSocket,另一个为 chessSocket;(2)客户端创建游戏信息;(3)客
户端加入游戏信息; (4)下棋信息;(5)放弃游戏信息;(6)公聊和私聊信息;(7)
用户列表信息。
二、服务端发送的信息:服务端接受到客户端发送的各种信息,会做出不同
响应, 并发送相应的信息对客户端进行响应或转发相应的信息给对手,并对服
务端上存储的全局信息进行更新,服务端可能发送的信息包括:(1)所有用户列
表;(2)服务端为该客户生成的客户名; (3)用户游戏创建成功信息;(4)加入游戏
成功后,分别向游戏双方发送对手信息;(5)加入游戏拒绝信息;(6)游戏进行信
息;(7)游戏胜利信息;(8)公聊和私聊信息。
三、客户端接受的信息:(1)用户列表信息;(2)游戏加入拒绝信息;(3)对手
信息;(4)胜利信息;(5)创建成功信息;(6)错误信息;(7)聊天信息。
四、客户端发送的信息:(1)连接服务器;(2)创建游戏信息;(3)加入游戏信
息;(4)放弃游戏;(5)公聊信息或私聊信息。
3
网络五子棋的设计与实现
客户端
客户端
Client
Server
Client
服务器
新来客 1
新来客 3
聊天,玩游戏
新来客 5
服务器
新来客 6
新来客 4
新来客 2
4
网络五子棋的设计与实现
4、 详细设计过程
4.1、首先建立chessClient端,设计客户端总体窗口,通过Frame 类来设计。
定义三个类,分别为usePad、chatPad和inputPad,分别为用户信息、信息显
示和聊天信息输入钮;位置分别在窗口的左上角、左边和窗口下方。
如图:
1、 usePad类中用List类来显示用户,此方法可以提供一个可滚动的文本
项列表;
List userList = new List(10); //建立一栈显示用户
userPad() {
setLayout(new BorderLayout());
for(int i=0; i<50; i++ ) {
userList.add(i+"."+"没有用户");
}
2、 chatPad 类使用TextArea 类构造一个将空字符串作为文本的新文本
区,用来显示聊天信息;
TextArea chatLineArea = new
TextArea("",18,30,TextArea.SCROLLBARS_VERTICAL_ONLY);//创
5
网络五子棋的设计与实现
建并显示垂直滚动条
chatPad() {
setLayout(new BorderLayout());
add(chatLineArea, BorderLayout.CENTER);
}
40列
3、 inputPad 类使用TextField类来构造新文本字段,用来定义聊天信息
输入框。
TextField inputwords = new TextField("",40); //对话窗口最大为
Choice userChoice = new Choice();
inputPad() {
setLayout(new FlowLayout(FlowLayout.LEFT));
for(int i=0; i<50; i++) {
userChoice.addItem(i+"."+"没有用户");
}
userChoice.setSize(60,24);
4.2、设计服务器chessServer端,并改进chessClient 端,使其它能连接到服务器,
如果连接上,则在chessServer端打印 “a clinet connected!”,在chessClient
端打印“connected”。
服务器端使用SreverSocket创建绑定到特定端口,端口为4331,并开启线程来运
行。代码如下:
public void makeMessageServer() {
Socket clientSocket;
try {
serverSocket = new ServerSocket(4331);
while(true) {
clientSocket = serverSocket.accept();
System.out.print("a clinet connected!");
DataInputStream inData = new
DataInputStream(clientSocket.getInputStream());
String str = inData.readUTF();
System.out.print(str);
ServerThread thread = new ServerThread(clientSocket);
thread.start();
}
} catch(IOException e) {
e.printStackTrace();
}
}
6
网络五子棋的设计与实现
同时在chessClient端改进代码,使其能连接到chessServer端
添加代码如下:
public boolean connectServer(String serverIP, int serverPort)
throws Exception {
try {
chatSocket = new Socket(serverIP, serverPort);
in = new DataInputStream(chatSocket.getInputStream());
out = new DataOutputStream(chatSocket.getOutputStream());
clientThread clientthread = new clientThread(this);
clientthread.start();
isOnChat = true;
return true;
} catch (IOException ex) {
chatpad.chatLineArea
.setText("chessClient:connectServer:无法连接,建议重新
启动程序 \n");
}
return false;
}
4.3、添加聊天功能,使程序可以完成简单的聊天。
在chessClient端,使用DataOutputStream类来输出inputPad里面的数据,
out = new DataOutputStream(chatSocket.getOutputStream());
通过 out.writeUTF(str) 传输到chessServer端里的DataInputStream里(这里
也通过线程来完成数据的传输,这样可以使并发的进行多个线程,提高系统的运
行效率);
在服务器端,使用String str = in.readUTF()来获取客户端传入的数据,
然后调用:
DataOutputStream outData = (DataOutputStream) enu.nextElement();//公
聊信息
outData.writeUTF(publicTalkMessage);
将数据发送到各个客户端,使大家可以看到信息,从而完成聊天!
7
网络五子棋的设计与实现
8