当前位置:文档之家› 基于JAVA语言的网络聊天系统开发与实现

基于JAVA语言的网络聊天系统开发与实现

基于JAVA语言的网络聊天系统开发与实现
基于JAVA语言的网络聊天系统开发与实现

2015届本科毕业论文(设计)

基于JAVA语言的网络聊天软件

代码:https://www.doczj.com/doc/1510963048.html,/detail/syqwe/8890181姓名:XXXX

系别:计算机与信息技术学院

专业:计算机科学与技术

学号:XXXXXXXX

指导教师:XXXXXX

2015年05月08日

目录

摘要............................................................................... II Abstract ........................................................................... II 1 软件介绍.. (3)

1.1 背景 (3)

1.2 目的 (3)

2 开发技术 (3)

2.1 界面层技术 (3)

2.2 通信层技术 (3)

2.3 数据层技术 (3)

3 开发环境 (4)

3.1 硬件环境 (4)

3.2 软件环境 (4)

4 需求分析 (4)

4.1 客户端需求分析 (4)

4.2 服务器需求分析 (4)

4.3 数据层需求分析 (4)

5 系统架构 (5)

6 设计实现 (5)

6.1 消息封装类Message (5)

6.2 服务器 (6)

6.2.1 主服务器Server (6)

6.2.2 虚拟服务器VirtualServer (6)

6.2.3 登录验证Logon (7)

6.2.4 Hibernate配置文件 (8)

6.2.5 Hibernate会话工厂 (8)

6.2.6数据操作类 UserDao (9)

6.2.7 数据操作类 CrowdDao (10)

6.2.8 表结构设计 (10)

6.2.9 用户类User (11)

6.2.10 群组类Crowd (11)

6.3 客户端 (11)

6.3.1 Client (11)

6.3.2 登录界面Logon (13)

6.3.3 好友界面Friend (14)

6.3.4 聊天界面Chart (15)

6.3.5 游戏界面Game (16)

6.3.6 游戏规则 (17)

6.3.7 算法思路 (17)

7测试说明 (18)

总结感想 (19)

参考文献 (20)

致谢 (20)

基于JA V A语言的网络聊天软件

摘要

本聊天软件是使用Java编程语言来完成开发的。在软件的开发过程中,使用Socket来进行网络通信,使用Swing来绘制界面,使用开源的对象关系映射框架Hibernate来进行数据访问。其中Hibernate能够使程序员以面向对象的思维来处理关系型数据。本聊天软件不仅支持聊天,还加入了“连连看”游戏。该游戏让人们之间的交流得到延伸,让彼此之间的关系更进一步。本聊天软件主要有以下三个功能:一、登录验证;二、聊天通信;三、游戏互动。

关键词

聊天;Java;Swing;套接字;Hibernate

NetworkChatSoftwareBasedonJA V ALanguage

Abstract

ThischatsoftwarewasdevelopedbyusingtheJavaprogramminglanguagetocomplete. Intheprocessofsoftwaredevelopment,Socket is used for network communication, Swing is used to draw the interface, object relational mapping framework Hibernate open source is used for data access.Hibernateallowsprogrammerstodealwithrelationaldatainobject-orientedthinking. Thischatsoftwarenotonlysupportchatatthesametime, alsojoinedthe"LinkUpFree" game. Thegameallowscommunicationbetweenpeoplehasbeenextended, sothattherelationshipbetweeneachothermore.Thissoftwaremainlyhasthefollowingthreefunctions: First, landingvalidation; Second, chatcommunications; Three, theinteractionofthegame.

Keywords

Chat; Java; Socket; Swing; Hibernate

1软件介绍

1.1背景

在当今世界,人们的追求早已不局限于物质生活,而更多的是渴望在精神领域上得到满足,这突出表现在我们的人际交往上。人们渴望与远在天涯又或是近在咫尺的亲朋好友无拘无束地沟通,而此时此刻一款即时通讯工具对于我们来说,它的重要性不言而喻!

在计算机网络愈来愈普及的今天,人们对于网络的依赖也愈来愈大,类似于QQ、MSN等聊天工具早已融入到我们日常生活中,为我们的生活带来了欢乐和便利。因此,我力图开发一个在线的即时聊天软件以满足我们在日常生活中交流的需要,为我们的生活增光涂色。

1.2目的

本聊天软件以通信为其核心,同时融入了娱乐的元素,一款十分经典的“连连看”游戏。让我们在聊天的同时还能与好友一起通过游戏来增进彼此的感情,让彼此的心更加靠近,让我们的生活从此不再单调。

本聊天软件是在Windows环境下进行开发的。通过Swing实现操作界面的设计,使用Java语言中的Socket(套接字)来实现网络之间的通信,使用Hibernate框架来进行数据的增删改查,而MySQL 数据库则用于数据的存储与管理。在开发的过程中综合运用自己所学到的各种技术,一方面强化我在学校里学到的知识与专业技能,另一方面也使得我更好地去理解有关软件开发的流程与思想。这些能力与经验都将为我后续的学习和工作打下坚实牢固的基础,不断地提升个人的职业素养。

同时,本聊天软件将不断与信息领域的系统相互集成和渗透,向校园、集团等群体进行拓展,应用将突破个体,并应用于远程教学、远程演示、网络会议等。以丰富的接入方式,以保质保量的服务,以友好的用户体验呈现在世人面前。并且不断地扩大功能与应用范围,满足未来时代的话音。

2开发技术

本聊天软件用到的技术涉及到3个层面,它们分别是:界面层、通信层、数据持久化层。

2.1界面层技术

使用Java中的Swing来进行操作界面的开发。Swing是一款功能强大,使用方便,跨平台的图形界面开发工具包,专门用于开发Java应用程序的用户界面。Swing允许您设定自己喜爱的界面风格,它可以是跨平台的Java风格,也可以是我们熟悉的Window风格,这一点是其他界面开发工具很难比拟的。

2.2通信层技术

利用java中的Socket(套接字)来完成客户端与服务器的交互。该Socket是基于TCP/IP通信协议的数据传输对象,它提供了安全可靠的通信机制。在服务器使用ServerSocket创建监听端口,而在客户端则使用Socket来连接服务器。在连接成功时,应用程序的客户端和服务器都将产生一个Socket 实例,本聊天程序就是通过利用这个Socket实例来实现两段的通信和其他功能。在通信的过程中我也使用了多线程编程技术以实现复杂的交互行为。尤其是在服务器端,服务器每接收一个客户端就会产生一个虚拟服务器来单独为其服务。通过该技术的运用使得本聊天软件可以允许多人同时在线与自己的好友畅怀的交流。

2.3数据层技术

考虑到现如今框架技术的兴起,在数据层的处理上我也使用了开源的对象关系映射框架Hibernate。它对Java的数据库连接(JDBC)进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用面向对象编程思维来操纵数据库。

本聊天软件使用MySQL作为数据持久化存的储器。MySQL是一个真正的多用户、多线程数据

库服务器,是以客户端/服务器架构实现的,它由一个服务器守护线程和很多不同的客户程序和库组成。MySQL是一种关系型数据库管理系统,通过表来管理数据,增加了处理数据的速度并提高了操作的灵活性。Hibernate+MySQL的组合在数据的处理上让我变得得心应手,同时也让这个程序变得更加强壮与稳健。

3开发环境

3.1硬件环境

硬件配置:AMDX64兼容桌面平台。

3.2软件环境

操作系统:Windows8.1企业版。

JDK版本:JDK_8。

数据库:MySQLServer5.6。

开发工具:MyEclipse2015。

第三方工具包:Hibernate。

4需求分析

本聊天软件是在C/S模式下完成开发的,整个系统分为两个重要的组成部分:客户端、服务器。

在客户端用户可以通过登录模块进行登录操作,登录成功的用户则进入到好友列表界面;选中指定的好友,就可以发起与该好友的会话,通过聊天模块与好友相互嘘寒问暖;在聊天模块中,既可以发送消息,同时也可以发起与该好友的游戏互动,在PK中一决雌雄。

在服务器,服务器要为每个用户进行服务,对用户登录信息进行验证,接受来自用户的消息请求并按照消息的类型进行各种不同的操作和处理。

4.1客户端需求分析

客户端实现的功能主要有:

1.登录模块:用户在登录界面中输入个人身份信息,由客户端将信息传递至服务器进行用户合

法性的验证,验证成功,则跳转到聊天模块,否则给出相关提示。

2.好友模块:显示好友列表,通过该模块可以发起与好友的会话或者游戏。

3.聊天模块:能够及时的发送用户的文本消息,同时能够即时地将好友发过来的消息展现出来。

4.游戏模块:开启两个好友之间的游戏互动。

5.界面效果:布局整洁、大方;色彩光鲜、夺目;操作简单、舒适。

4.2服务器需求分析

服务器作为后台程序,实现的功能主要有:

1.能够接收每个客户端的通信连接。

2.调用数据访问层来验证用户的个人信息。

3.能够及时接受用户的聊天消息并进行消息的转发。

4.3数据层需求分析

数据层实现的功能主要有:响应来自服务器的数据访问请求。

5系统架构

本系统以客户端、服务器以及数据库三维一体构建起了系统的整个架构。

图5-1系统架构

客户端:用户在客户端的所有操作都依赖于客户端的守护线程Client来完成,该线程负责与服务器进行数据交互。当用户需要登录时,由登录模块调用Client向服务器发送身份验证请求。服务器接收到该验证请求之后便进行验证处理并返回验证结果给Client。如果Client判定验证成功则从验证结果中提取出个人信息并开启好友模块;当用户在好友模块中打开了一个聊天模块后,便可以调用Client来进行聊天消息的传递;如果打开的是游戏模块,则先完成游戏的一方调用Client向另一方发送获胜消息,并终止另一方的游戏。

服务器:服务器分为主服务器与虚拟服务器。主服务器Server作为服务器的守护线程,主要负责接收客户端的连接,在服务器接收到一个客户端后,就开启一个虚拟服务器VirtualServer来为该用户服务;虚拟服务器通过调用底层的登录模块等来为用户提供登录验证等服务。

本架构中,借用了Spring中的分层思想,这也是在软件项目开发过程中经常采用的方案。将操作或功能分为不同的层次,各层次之间想对独立,高层调用底层的功能,低层为高层提供服务。一方面,可以将同种类型的操作放在一起集中管理。另一方面,将操作提取出来,提高了代码的复用性和程序的扩展性。分层使得程序流程变得清晰明了,而且维护成本相对低廉[1]。

6设计实现

6.1消息封装类Message

Socket:套接字,在本聊天软件中作为客户端与服务器之间通信载体,为系统的交互提供支撑。为了方便开发,我将客户端与服务器之间传送的消息封装成一个消息对象类Message.。继而使用从Socket获取的对象输入流、对象输出流来收发消息对象[2]。

封装的消息类代码如下所示:

//消息封装类实现了序列化接口

publicclassMessageimplementsSerializable{

privatestaticfinallongserialVersionUID = -2842889997276284663L;

privateIntegertype;//消息的类型

privateDatesenDate= newDate();//消息创建的时间

privateUsersender;//消息的发送者

privateUseraccepter;//消息的接收者

privateStringcontent;//消息的内容

}

其中,消息的类型在服务器和客户端都遵循着统一的标准。这样的话,客户端发给服务器什么样的消息,服务器在解析出消息的类型之后,就可以进行相应的操作了。为了实现消息载体以对象的形式在网络间进行传递,该消息类必须实现Java中的序列化接口,这一点是其他通过字节流或者字符流传递消息所不同的。

6.2服务器

6.2.1主服务器Server

主服务器主要充当一个前置服务,用来接收客户端的连接。在获得一个客户端的连接后就会产生一个虚拟服务器,并将该连接委托给虚拟服务器让它来为用户提供服务。同时主服务器也维护着所有的虚拟服务器,它扮演着一个管理者的角色[3]。

//服务器维护的虚拟服务器列表,一个Map集合,通过<用户的账号:为该用户服务的虚拟服务器>这种键值对的对应关系来管理虚拟服务器。

privatestaticHashMapusersOL = newHashMap();

try {

serverSocket = newServerSocket(port);

//这里通过无限循环,来不停地接受用户的连接。

while(true) {

clientSocket = serverSocket.accept();//接收客户端的连接

newThread(newVirtualServer(clientSocket)).start();//开启虚拟服务器来为其服务}

} catch (IOExceptione) {//异常处理

}

6.2.2虚拟服务器VirtualServer

虚拟服务器才是真正的服务载体,当它接收从主服务器哪里得到的来自客户端的连接后,便可进行一对一的服务。所有的消息都经过它来处理。当虚拟服务器之间需要交互时,虚拟服务器可以从主服务器那里拿到主服务器所维护的虚拟服务器列表。并从中根据键值对来获取指定的虚拟服务器,然后再进行后续的操作。

该类实现了Runnable接口,该接口是将线程所运行的程序代码提取出来封装成为一个对象。Runnable对象可以用来创建线程。

privateUseruser = null;//虚拟服务器所服务的用户

@Override

publicvoidrun() {

Booleanb = true;//线程结束控制符

//接收来自客户端封装的消息对象

Messagemsg = null;

while(b) {

try {

msg = (Message)input.readObject();//客户端Client发送过来的消息对象

//根据消息的类型进行不同的处理

if(msg.getType() == 10) {//登录验证操作

MessagereturnMsg = newLogin().validate(msg.getSender());//登录验证

if(returnMsg.getType() == 13) {

//验证成功,则将该虚拟服务器添加到主服务器管理的虚拟服务器列表

Server.getUsersOL().put(returnMsg.getAccepter().getAccount(), this);

}

send(returnMsg);

}elseif(msg.getType() == 20) {//转发聊天消息

Server.getUsersOL().get(msg.getAccepter().getAccount()).send(msg);

send(msg);

}elseif(msg.getType() == 30) {//退出操作

Server.getUsersOL().remove(user.getAccount());

Thread.currentThread().interrupt();//结束当前线程

}elseif(msg.getType() == 40) {//邀请好友进行游戏

Server.getUsersOL().get(msg.getAccepter().getAccount()).send(msg);

}elseif(msg.getType() == 41) {//好友同意游戏邀请,双方开始游戏

Messagem = newMessage();

m.setType(42);m.setAccepter(msg.getAccepter());

Server.getUsersOL().get(msg.getAccepter().getAccount()).send(m);

m.setAccepter(msg.getSender());

send(m);

}elseif(msg.getType() == 43) {//拒绝好友的游戏邀请

Server.getUsersOL().get(msg.getAccepter().getAccount()).send(msg);

}elseif(msg.getType() == 44) {//由获胜方通知失败方,胜负情况

Server.getUsersOL().get(msg.getAccepter().getAccount()).send(msg);

}

} catch (Exceptione){//异常处理

b = false;//如果出现异常则修改线程终止符,使线程结束。

}

}

}

从源码中可以看出,虚拟服务器主要的工作,就是解析消息的类型,并根据消息的类型进行相应的处理。例如在消息的类型为10时,虚拟服务器就调用登录验证Logon来对用户的信息进行验证,根据登录验证的验证结果,再返回相应的消息给客户端的Client。

6.2.3登录验证Logon

privatestaticUserDaouserDao = newUserDao();//调用底层的用户数据访问功能

publicMessagevalidate(Useruser) {

Messagemsg = newMessage();//返回验证的结果信息

Useru = userDao.findByAccount(user.getAccount());//账户存在

if(u == null) {//账户不存在

msg.setType(11);msg.setContent("账户不存在!");

}else{//该账户存在

u = userDao.findByAccountAndPassword(user.getAccount(), user.getPassword());

if(u == null){//密码不对

msg.setType(12);msg.setContent("密码不对!");

}else{//账户、密码正确

if(Server.getUsersOL().get(user.getAccount()) == null) {//可以登陆

msg.setType(13);msg.setAccepter(u);

}else{//已登录

msg.setType(14);msg.setContent("不能重复登录!");

}

}

}

returnmsg;

}}

登录验证,主要分为三步:

1.首先验证用户的账号合法性,即该账号是否存在。只有账号存在才会进行后续的验证。

2.如果用户的账号存在,再验证密码是否与账号匹配,如果匹配成功,则返回该用户的信息。

3.接下来则从主服务那里去判定该用户是否已经登录,对于已登录的用户则不再给予登录操作。

6.2.4Hibernate配置文件

访问数据的操作要借助Hibernate框架来完成。使用了Hibernate,我们就可以不用再写很复杂繁琐的JDBC语句去建立与数据库的连接,而将这些操作全都交给Hibernate来完成。Hibernate的配置文件如下:

true

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/NFC

root

846255

org.hibernate.dialect.MySQLDialect

create

6.2.5Hibernate会话工厂

在完成了配置之后,为了可以使用它来进行数据的操作,我们需要先创建会话工厂,因为数据的操作是基于会话的。会话工厂的代码如下:

publicclassHibernate {

privatestaticSessionFactorysf = null;//会话工厂

privatestaticSessionsession = null;

static {

Configurationcf = newConfiguration();

cf.configure();//在默认路径下,读取配置文件。

ServiceRegistrysr =

newStandardServiceRegistryBuilder().applySettings(cf.getProperties()).build();

sf = cf.buildSessionFactory(sr);

session = sf.openSession();

}

privateHibernate() {}

publicstaticSessionFactorygetSessionFactory() {return sf;}

publicstaticSessiongetSession() {return session;}

}

这里的会话工厂SessionFactory使用的是Java设计模式中的单例模式,唯一的SessionFactory对象能够保证数据操作的可控性,让我们能够利用事务有效的保证被操作数据的一致性。

在配置文件中罗列出了所使用的实体类,通过在实体类中使用相应的注解标明,Hibernate就可以将一个实体类映射为一张表,而实体类的属性则将映射为表中的字段。实体类就相当于一张表,为了操纵它,我为实体类分别写了一个操作类。利用会话Session来实现数据的增删改查。

6.2.6数据操作类UserDao

publicclassUserDao {

privateSessionsession = null;

publicUserDao() {session = Hibernate.getSession();}//获取会话

publicUserfindByAccount(Integeraccount) {//根据账号来查询用户

Criteriac = session.createCriteria(User.class);

c.add(Restrictions.eq("account", account));

Useruser = (User)c.uniqueResult();

returnuser;

}

//根据账号和密码来查询用户

publicUserfindByAccountAndPassword(Integeraccount, Stringpassword) {

Criteriac = session.createCriteria(User.class);

c.add(Restrictions.eq("account", account));

c.add(Restrictions.eq("password", password));

Useruser = (User)c.uniqueResult();

returnuser;

}

//查询全部用户

publicListqueryAll() {

Criteriac = session.createCriteria(User.class);

@SuppressWarnings("unchecked")

Listusers = c.list();

returnusers;

}

}

6.2.7数据操作类CrowdDao

publicclassCrowdDao {//群组数据访问层

privateSessionsession = null;

publicCrowdDao() {session = Hibernate.getSession();}

publicvoidsave(Crowdcrowd) {//保存群组

Transactiontransaction = session.beginTransaction();

session.save(crowd);

https://www.doczj.com/doc/1510963048.html,mit();

}

publicvoidupdate(Crowdcrowd) {//更新群组

Transactiontransaction = session.beginTransaction();

session.update(crowd);

https://www.doczj.com/doc/1510963048.html,mit();

}

publicvoiddelete(Crowdcrowd) {//删除群组

Transactiontransaction = session.beginTransaction();

session.delete(crowd);

https://www.doczj.com/doc/1510963048.html,mit();

}

}

以上两个数据访问类都使用了基于Criteria的查询方式,该方式是面向对象的,通过为该对象设置一些相应的属性值,就可以获取满足条件的数据。如:c.add(Restrictions..eq("account", account))等价于whereaccount = account.从思想的层面上来讲很大程度上有别于传统的SQL查询方式。Hibernate 还提供了封装过的save(Object);update(Object);delete(Object)等方法供我们使用,以便提高开发效率。通过如此简单而又精炼的代码即可完成对数据的处理,极大地解放了程序员的劳动力。

6.2.8表结构设计

表6-1User实体类对应的表

字段数据类型备注

account Int账号

password varchar密码

name varchar昵称

id Int主键

表6-2Crowd实体类对应的表

字段数据类型备注

name varchar 群组名称

id Int 主键

关于用户的信息主要有两张表。一张是用户自身的信息表,该表用来存储用户的个人资料;另一张表是群组表,用来记录每个用户所拥有的群组信息。每个用户可以拥有多个群组(如:朋友、陌生人等),而每个群组又可以拥有多名用户(如:朋友列表下有张三、李四两个人)。两张表是多对多关系[4]。

需要指明的是,在这两张表里面都没有通过外键来建立关联关系,这是因为可以通过Hibernate 的注解@ManyToMany来完成关联关系的映射。Hibernate在处理这个注解时,自动地去帮我们创建一张中间表,并用它来维护表之间的关联关系,这使得我们在构建表结构的时候变得异常轻松。6.2.9用户类User

@Entity@Table(name = "User")

publicclassUserimplementsSerializable {

privatestaticfinallongserialVersionUID = 1L;

@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "id", unique = true)

privateIntegerid;//主键

@Column(name = "account")

privateIntegeraccount;//账号

@Column(name = "password")

privateStringpassword;//密码

@Column(name = "name")

privateStringname;//昵称

@ManyToMany(mappedBy = "users", fetch = FetchType.EAGER)

privateListcrowds = newArrayList();//用户所属的群组

}

6.2.10群组类Crowd

@Entity@Table(name = "Crowd")

publicclassCrowdimplementsSerializable{

privatestaticfinallongserialVersionUID = 1L;

@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "id")

privateIntegerid;//主键

@Column(name = "name")

privateStringname;//群组的名称

@ManyToMany(fetch = FetchType.EAGER)//(mappedBy = "crowds")

privateListusers = newArrayList();//群组所包含的用户

publicCrowd() {}

}

1.通过@Entry来标明它是一个实体类。

2.通过@Tabel(name=”tableName”)来指明该实体类与数据库中哪一张表相对应。

3.通过@Id来指明表中的主键。

4.通过@GeneratedValue(strategy = GenerationType.AUTO)来指明主键的增长策略。

5.通过@Column(name = "name")来指明类中的某个属性与数据库表中哪个字段名相匹配。

6.通过@ManyToMany(fetch = FetchType.EAGER)来指明两个实体类之间的多对多关系。

使用了Hibernate之后,作为程序员的我们完全可以使用面向对象的思维来处理数据。尤其是在Hibernate的配置文件中使用了create之后,Hibernamte甚至能够自动帮我们依据实体类来创建相应的表结构,我们无需再为操作数据库而苦恼。

6.3客户端

6.3.1Client

对于客户端所有的通信操作都是基于该Client来完成,它是客户端的守护线程

publicUseruser = null;//Client所服务的用户

privateMapmap = newHashMap();//用户的聊天窗体Map

@Override

publicvoidrun() {

while(true) {

try {

Messagemsg = (Message)input.readObject();

if(msg.getType() == 11) {//账户不存在

Logon.getInstance().setInfo(msg.getContent());

}elseif(msg.getType() == 12) {//密码不对

Logon.getInstance().setInfo(msg.getContent());

}elseif(msg.getType() == 13){//可以登陆

Useruser = msg.getAccepter();

setUser(user);

Logon.getInstance().setVisible(false);;

Friend.getInstance().setName(user.getName());

}elseif(msg.getType() == 14) {//已登录

Logon.getInstance().setInfo(msg.getContent());

}elseif(msg.getType() == 20) {//转发聊天消息

this.getMap().get(msg.getSender().getAccount()).append(msg);

}elseif(msg.getType() == 40) {//收到来自好友的游戏邀请

Friend.getInstance().requestGame(msg.getSender());

}elseif(msg.getType() == 42) {//好友同意开始游戏

Friend.getInstance().startGame(msg.getAccepter());

}elseif(msg.getType() == 43) {//好友拒绝来游戏邀请

Friend.getInstance().refuseGame(msg.getSender());

}elseif(msg.getType() == 44) {//胜负已分,游戏中止

//Game.getInstance().loseGame();

}

} catch (Exceptione) {//异常处理

}

}

}

这个位于客户端的后台守护线程,接收服务器推送过来的消息。类似于虚拟服务器它也根据消息的类型,对消息进行分类处理,同时也将用户的操作封装成消息对象传递给虚拟服务器。

当一个用户与多个好友进行会话时,为了方便管理与每个好友的会话,在该类中使用了一个map 集合。当该类收到来自某个好友的聊天消息,在提取出消息内容后,从map中根据键值对<好友的账号:与好友聊天的窗体>来得到指定好友的聊天窗体,将聊天数据交给该聊天窗体进行显示。该类只是负责对数据进行收发,而数据的显示等操作,则交给上层的界面来完成。彼此各司其职,这样就实现了分层的效果。

6.3.2登录界面Logon

图6-1登录界面

//登录界面所用到的控件

privatestaticLogonlogon = newLogon();//窗体本身

privateJPanelhead = newJPanel();//头部

privateJLabelmin = newJLabel(newImageIcon("image/min.png"));//最小化

privateJLabelclose = newJLabel(newImageIcon("image/close.png"));//关闭

privateJPanelbody = newJPanel();//身体

privateJLabelinfo = newJLabel();//信息提示

privateJLabelaccountLabel = newJLabel("账号:");//账号标签

privateJLabelpasswordLabel = newJLabel("密码:");//密码标签

privateJTextFieldaccount = newJTextField();//账号文本框

privateJPasswordFieldpassword = newJPasswordField();//密码文本框

privateJButtonlogin = newJButton("登录");//登录按钮

privateJPanelfoot = newJPanel();//尾部

privateJLabelset =newJLabel(newImageIcon("image/set.png"));//设置

登录界面使用来Swing的网格包布局GridBagLayout来放置各个组件在面板JPanel中的位置。

6.3.3好友界面Friend

图6-2好友界面

//省略了与登录界面外层布局的内容

privateJPanelbody = newJPanel();//身体

privateJPanelshow = newJPanel();//用户信息展示

privateJLabelimg = newJLabel(newImageIcon("image/me.png"));//用户照片

privateJPanelinfo = newJPanel();//用户的昵称、等级

privateJLabelname = newJLabel();//用户昵称

privateJLabellevel = newJLabel();//用户等级

privateJScrollPanejsp = null;//容纳好友列表的窗体

privateJTreetree = null;//用户的好友列表

在好友界面中,通过遍历Client传过来的用户信息User中的List来构建好友列表树JTree,这里使用了边界布局的方式来放置组件。

6.3.4聊天界面Chart

图6-3聊天界面

privateJPanelbody = newJPanel();//身体

privateJTextAreaoutput = newJTextArea();//显示框

privateJScrollPaneread = newJScrollPane(output);//显示框的滚动窗体

privateJTextAreainput = newJTextArea();//输入框

privateJScrollPanewrite = newJScrollPane(input);//输入框的滚动窗体

privateJPaneljp = newJPanel();//输入框的滚动窗体

privateJButtonenter = newJButton(" 发送");//发送按钮

privateJButtoncancel = newJButton(" 取消");//取消按钮

privateUserfriend = null;//聊天的好友

聊天界面中利用JTextArea来显示聊天对话的内容,当聊天内容过多时,可以拖动外层滚动面板JScrollPane提供的滚动条来翻阅查看。

6.3.5游戏界面Game

图6-4游戏界面

在游戏界面,产生8*8=64个网格,所以需要32对按钮,其中每一对中的两个按钮都是一样的。这样就可以保证所有的按钮都会有一个与之匹配。因为在该网格中无法按位置来获取其中的按钮,所以我使用了一个二维数组来模拟网格的位置。“连连看”游戏的界面代码如下:publicclassGameextendsJFrame{

privatestaticfinallongserialVersionUID = 1L;

JMenuBarjmb = null;//菜单栏

JMenufile = null;//文件菜单

JMenucustomize =null;//自定义菜单

JMenuItemdifficulty = null;//自定义难度

JMenuItemcontent =null;//自定义内容

JMenuItemclose = null; //关闭

JMenustart = null;//开始游戏

JMenunewGame = null;//新游戏

JMenuinfo = null;//信息

JPanelgamespace = null;//游戏场所

JButtonjb = null;//随机按钮

JButtonfirst = null;//第一次点击的按钮

JButtonsecond = null;//第二次点击的按钮

ArrayListal = null;//按钮集合,用于帮助产生随机按钮

Randomr = newRandom();//随机体

intcount = 64; //剩余按钮计数器

JButton[][] jbMap = null;//按钮二维数组,用于记录按钮的状态和生成映射地图

JButton[][] backUp = null;

Finderf = null;//查找器,用于查找制定按钮的位置。

Userfriend = null;

6.3.6游戏规则

分析连连看游戏可知:

1.只有内容相同的按钮连在一起才可以消除掉,而且连线之间不能有障碍物。

2.所有按钮都是成对出现的。

3.从一个按钮到达另一个按钮最多能走三条直线。如果需要走三条线的话,那么第二条直线必

须到达另一个按钮所在的行或者列,只有这样才有可能在第三条直线到达需要连接的按钮。6.3.7算法思路

这里使用了最长路线算法:最多需要三步才能到达指定按钮。

首先,从一个按钮出发,有东南西北四个方向可以走,此为第一条直线。然后,设置标记progress,在第一条线的基础上,又可以向左右两个方向前行,此为第二条直线。再然后,设置标记climax,在第二条线的基础上,又可以向左右两个方向前行,此为第三条直线。

每走一步之前需要先判定能否前行,不能的话则表示此路不通,退回到上一个标记点。如果还能向前走一步,则前进一步并将该点记录下来,然后判定此时的位置是否为指定按钮所在的位置。如果是则返回true,否则返回false。

publicbooleanfind(){//连线算法,用于查找从一个按钮能否到达另一个按钮。

for(inttemp=1; temp<=4; temp++)//东西南北,四次大循环

{ change(state, start);

firstLine.clear();

switch(temp)

{

case1:break;

case2:turnLeft();break;

case3:turnBack();break;

case4:turnRight();break;

}

while(nextStep())//能否向前走一步

{

if(go(firstLine))//第一次

returntrue;

change(progress, state); //设置标记,左右,两次中循环

for(intk=1; k<=2; k++)

{

change(state, progress);

secondLine.clear();

switch(k)

{

case1:turnLeft();break;

case2:turnRight();break;

}

while(nextStep())

{

if(go(secondLine))//第二次

returntrue;

//设置坐标,左右,两次小循环

if((state.x == end.x)|(state.y == state.y))

{

change(climax, state);

for(intj=1; j<=2; j++)

{

change(state, climax);

threeLine.clear();

switch(j)

{

case1:turnLeft();break;

case2:turnRight();break;

}

while(nextStep())

{

if(go(threeLine))//第三次

returntrue;

}

}

change(state, climax);

threeLine.clear();

}

}

}

change(state, progress);

secondLine.clear();

}

}

returnfalse;

}

7测试说明

为了保证系统持久稳定地运行,需要对本聊天软件的登陆验证;聊天功能;消息内容;游戏互动等模块进行相应的测试。

1.考虑到用户的体验,尤其是界面的美观和使用感受,主要使用人工测试的手段。

2.对于功能模块,我采用黑盒测试的方法,使用UFT功能测试工具来完成功能测试。

3.对于代码的执行情况,我使用Testbed测试工具来对源程序进行测试,查看其路径覆盖率。

总结

对于聊天软件而言,聊天仅仅只是人们交流的一种方式。本聊天软件在支持聊天的同时,还融入了游戏互动,使人际交往的方式得到了扩展,使交流变得多元化。考虑到这种模式所带来的好处,本聊天程序在以后还将增加猜谜语等一系列互动形式,通过多角度多维度的沟通手段,来为人们的交往铺筑一条多彩之路。

在本聊天软件中,框架的使用极大地减少了对数据库的依赖性。不管对程序做了怎样的修改,在程序重启时,它都会自动维护数据库中表的结构。而且将应用与数据库的连接交给Hibernate来管理,不但提高了性能,而且数据的完整性也得到了保障。如果仍采用传统的JDBC方式来操作数据库,不但需要编写繁琐的连接数据库代码,而且将关系型数据与对象相互转换也变得十分复杂,一旦数据库中表的数量过多,对整个系统的维护将会变得非常麻烦。由此可见学习的道路真是永无止尽,我们应该不断地去学习新知识,新思想来开拓视野,取他人之长补己之短。

这次毕业设计的开发实践,培养了我独立发现问题、分析问题、解决问题的能力。虽然目前我只是做了部分的核心功能,但后期还会继续努力将其变的更加完善。例如:再增加一些其他的互动形式,如:好友的添加与删除,好友上下线的通知,以及语音聊天等功能,争取把功能做得更强大,界面做的更绚丽,操作整的更舒适。这次实践仅仅只是一个好的开始,我相信在未来我一定能够不断地去完善自己的不足,挖掘自己的潜力,展现自己风采,去迎接更加美好的未来。

Windows C语言构建网络聊天室

Windows C语言构建网络聊天室 利用C语言编写Windows应用程序有两种方式:一种是Windows C编程方式,另一种是Visual C++编程方式。在一般情况下,Visual C++编程方式编写的程序源代码量小、开发时的工作量小、工作难度也较小,但编译后的代码量较大,运行速度略低;而Windows C编程方式编写的程序源代码量虽然较大,但可执行代码效率高。随着技术的进步,Visual C++编程方式已被广泛采用,但象网络编程等一些对速度要求高、对硬件操作较多的程序,大多数还是用Windows C编程方式开发的。另外,学习Windows C 程序设计,还有助于更深入地了解Windows的内幕和Windows API。 基本的网络编程都是建立在Winsock基础上的。Winsock是90年代初,为了方便网络编程,由Microsoft联合了其他几家公司共同制定的一套WINDOWS下的网络编程接口,它是通过C语言的动态链接库方式提供给用户及软件开发者的,主要由winsock.h头文件和动态链接库winsock.dll组成,目前有两个版本:Winsock1.1和Winsock2.0。 作为网络编程接口,Winsock屏蔽了网络底层的复杂的协议和数据结构,使得编程人员对网络的操作变得非常简单,因此,在Win32平台上,访问众多的基层网络协议,Winsock是首选接口。 用Winsock构建一个网络聊天室,有两种基本的方式:数据报方式和流方式。 一、面向无连接的数据报方式 数据报方式又称无连接方式,对应的是UDP(User Datagram Protocol)协议。这种方式不提供数据无错保证,数据可能丢失或重复并且接收顺序混乱,后发出的报文可能会先收到,并且报文的长度是有限制的;不过,由于取消了重发校验机制,能够达到较高的通信速率,可以用于对数据可靠性要求不高的通信,如实时的语音、图像传送和广播消息等。 和C语言一样,函数是Windows C编程的最基本的单位。不过,Windows C主要使用API函数,而网络编程则主要使用Winsock提供的API函数。数据方式构建网络聊天室主要使用了以下几个函数:1.WSAStartup():初始化。 【函数原型】 int PASCAL FAR WSAStartup(WORD wV ersionRequired, LPWSADATA lpWSAData); 【使用说明】 每一个使用winsock的应用程序,都必须进行WSAStart函数调用,并且只有在调用成功之后才能使用其它的winsock网络操作函数。 返回值:调用成功返回0;否则,返回出错信息。 WversionRequired<输入>:表示欲使用的Winsock版本,这是一个WORD类型的整数,它的高位字节定义的是次版本号,低位字节定义的是主版本号。 LpWSAData<输出>:是一个指向WSADATA资料的指针。这个资料我们一般不使用。2.Socket():创建一个Socket。 【函数原型】 SOCKET socket(int af,int type,int proctocol); 【使用说明】 Winsock网络通信的第一步通常就是调用这个函数。所有的通信在建立之前都有要创建一个 Socket。该函数的功能与文件操作中的fopen()类似,返回值是由Winsock定义的一种数据类型 SOCKET,它实际是一个整型数据,是Socket创建成功时,Windows分配给程序的Socket编号,后面调用传输函数时,可以把它像文件指针样引用。如果Socket建立失败,返回值 WIV ALID_SOCKET。 Af<输入>:指address family(地址族),一般都填AF_INET,表示是在Internet上的Socket; Type<输入>::是Socket的类型,当采用流连接方式时,用SOCK_STREAM;采用数据报文方式时,用SOCK_DGRAM。

Java软件开发工程师笔试题(答案)

Java工程师笔试题 一、填空题(本大题10小题,每空1分,共20分)。 1.Java语言的三大特性即是: 继承、封装、多态。 2.在Java中,char 型采用____unicode_______编码方案,这样,无论是中文字符还是英文字符,都是占用__2___个字节的内存空间。 3. 形式参数指的是方法被__定义____ 时的参数行,实际参数是方法被__调用__ _ 时所传递进去的变量或值。 4.JSP内置对象中,application对象是代表应用程序上下文,它允许JSP页面与包括在同一应用程序中的任何Web组件共享信息,而session 对象则是每个客户专用的。 5.如果想把一个对象写入一个流,那么这个类就必须实现Seralizable 接口。 6.程序中实现多线程的方法有两种:继承Thread类和实现___Runable _ 接口。 7.多线程中,可以通过调用相应的setPriority() 方法来修改一个线程的相对优先级。 8.面向对象编程的五大设计原则,分别是单一职责、开放封闭、 里氏替换、依赖倒置、接口分离 9.通过Ajax,客户端获取的数据主要有两种类型:文本型和xml 10.Socket通常也称为套接字,用于描述__ ip 和_ _接口 二、选择题(本大题20 小题,每小题2分.共40分)。 1.在JA V A中,如果父类中某些方法不包含任何逻辑,并且需要由子类重写.应该使用( )关键字来声明父类的这些方法: A) final B) static C) abstract D) void 2.在JA V A中,已定义两个接口B和C,要定义一个实现这两个接口的类,以下语句正确的是()。 A) interface A extend B,C B) interface A implements B,C C) class A implements B,C D) class A implements B, implements C

聊天打招呼用语

聊天打招呼用语 懂文明讲礼貌是现代人最基本的素养,一句简单的打招呼是一个好的开始。下面学识网小编为你整理了聊天打招呼用语,希望对你有所帮助! 聊天打招呼用语(精选篇) 1. 工作要像吹气球,给自己鼓气;生活要像拍篮球,给自己弹性;健康,要像打台球,给自己定位。朋友,愿你幸福快乐! 2. 这是“快乐”牌短信,独家制作,质量上乘,具有驱愁解乏延年益寿消病去灾招财进宝之功效。一人收到,全家幸福。 3. 炎炎夏日,买台空调送你,太贵!搬座雪山给你,不会!请你海吃一顿,伤胃!请你旅游一回,怕累;送你一支玫瑰,误会!只好短信祝福你,实惠! 4. 近来天气像恋爱中姑娘的脸,说变就变;像失恋姑娘的脸,冷冰冰;像分手时姑娘的脸,阴沉。故恋爱看脸色,出门看天色,情谊看成色,祝你过得有声有色! 5. ^o^提示:你已被变形金刚包围,让大黄蜂植入快乐,让擎天柱装备幸福,让威震天清除烦恼,让霸天虎消灭忧愁,并决定将你放逐到永远幸福快乐的星球! 6. 听说想念能让人温暖,我就一直想念你;传说叨念能让人温暖,我就一直叨念你;听说祝福能让人温暖,我就一直祝福你。我相信了种种,只是希望在这寒冷季节能送你多一度的温暖!朋友,你感觉到

温暖了没? 7. 短短短短短短短,我的短信特别短,长长长长长长长,我的思念特别长!一句问候赛过千言万语,祝你生活美美美,幸福久久久! 8. 别说话,留住那一口热气,心里更暖些;仔细读,把握每个字眼,享受更好些;慢慢看,品味这深刻友情,体会更多些;好好想,回忆我这好朋友,感触更深些。天冷保暖,谨防感冒,友情牵挂,问候如常。 9. 短信两句真挺少,三句四句还恰好,十句八句太吵闹,再多已经成烦恼,此条短信刚刚好,三句问候齐来到:冬来天渐凉,身体保护好,身体健康妙! 10. “马上有车”“马上有房子”“马上有钱”“马上有对象”……咱有点追求好不好?看我的,马上有碗:帅男萌妹子房子Money绿卡,通通都到碗里来。什么除夕上班雾霾天气地铁涨价延迟退休……“马上拜拜”! 聊天打招呼用语(最新篇) 1. 天气变凉了,想你的念头变强了,走路一不小心撞墙了;天气变凉了,想你想得小脸蜡黄了,一度相思成营养不良了;天气变凉了,想你的节奏堪比北大荒了,一不见你小心脏就哇凉哇凉的了。天气变凉了,就是想你了,记得照顾好自己哦! 2. 我实在太嫉妒你了,知道为什么吗?你居然能有我这样的朋友,不是节日生日,还能够记得你,发个短信愿你开心快乐!认命吧,你会被我嫉妒一辈子!

老外喜欢的聊天工具

老外喜欢的聊天工具 世界上最远的距离,不是生与死。而是我找你,却找不到。找到了却不回应。。。沟通是人与人之间的桥梁,是连接人人与人关系的纽带。合理的沟通能促进关系的和谐,同时也是矛盾的润滑剂。因此,实时沟通显得格外重要.作为外贸人员,不要一味的跟客人谈生意,当然目的是这个。私下的问候,关心,沟通也是不可或缺的。很多老外不喜欢来回发邮件,那样速度慢,还得来回查看,因此很多在线的聊天工具就备受欢迎。下面我介绍几款来外喜欢的聊天软件及工具。(1)MSN,这个大家都很熟悉,算是很早的在线聊天工具了,并且有对应的邮箱,也是很方便的,我就不多说了。他在世界的地位,犹如QQ在中国的地位。但是现在MSN被SKYPE绑定了,有些地方必须得绑定SKYPE才能用。 (2)SKYPE.这是一款很潮流也很方便的聊天工具,除了网上聊天外,也可以语音,视频。他最大的功能就是可以绑定你的电话,可以方便你和朋友间的联系。如果你想给远在异国的客人和朋友打电话的话,不妨试试SKYPE。不过你得先到SKYPE官网,购买充值卡哦。 (3)Viber,相比来说这个更是高效快捷,用你的手机注册成功后,装上软件,同步到你的通讯录,跟微信差不多。你就可以跟远在国外的使用同类软件的朋友畅所欲言了,这个不需花费,只需流量,如果有WIFI那就免费了哦。相比而言,这个更加流畅,不收

3G网络或者WIFI的局限,普通流量就可以拥有高音质的服务。(4)Whatsapp,这个软件还是客户告诉我的,当时我在trade manager,问他最近如何,怎么联系不到。他最后说让我装个whatsapp,然后我把他的号码存到我的通讯录,同步一下,就和他对话了,发现真的很多人在用,在我通讯录里使用这个的大部分都是中东南美的,也有部分中国人。 (5)Facebook,脸谱网的登陆如果电脑必须需要翻墙软件的协助,否则无济于事。在上面可以看到客户的动态,有种QQ空间的感觉,很是全面,也可以跟客户连线对话,建立群组等。这真的是一个不错的交友网站哦,你还会看到可能认识的人,客户的朋友你也可以加上。还可以关键词搜索,然后加为好友。 (6)Twitter,和facebook基本差不多,慢慢熟悉就好了。多用用有益无害。 (7)QQ,Wechat.腾讯帝国的软件,现在很多老外也在用了,我的一个外国客户就是我在微信上面认识的,摇一摇,正好摇出来,最后慢慢谈着,客户也是他们本国的进口商,微信摇出来的感情。没事摇一摇,必能摇出大奖。 (8)Google Talk,google集团出的一般软件,就是很不稳定,非常慢。可以试试加好友。

《JAVA语言程序设计》期末考试试题题库2014 (整理版)

;.'

;.'

二、填空题 1、如果将类MyClass声明为public,它的文件名称必须是(MyClass.java)才能正常编译。 2、Java程序中的单行注释符是(//),多行注释符是(/* */ )。 3、Java中布尔类型的常量有两种,它们是(true)和(false)。 4、Java中用于定义小数的关键字有两个:(float)和(double),后者精度高于前者。 5、Java中用于两个数相等比较的运算符是:(==),用于不相等比较的运算符是(<>)。 6、在Java中定义一个字符串类型的变量str的语句是:(String str;),定义一个具有10个元素的整型数组a的语句是:(int [] arr = new int[10];)。 7、导入mypackage包中的所类的命令是(import mypackage.*;)。 8、当声明一个数组int arr[] = new int[5]; 时,这代表这个数组所保存的变量类型是(int),数组名是(arr),数组的大小为(5),数组元素下标的使用范围是(0到4)。 9、假设x=13,y=4,则表达式x%y != 0的值是(true),其数据类型是(boolean)。 10、异常处理是由(try)、(catch)和finally块三个关键所组成的程序块。 11、导入mypackage包中的类myclass的命令是(import mypackage.myclass; )。 12、使用命令行敲入javac命令,其含义是(编译java文件,得到字节码文件)。 13.定义类的保留字是( class),定义接口的保留字是( interface )。 14.构造方法是一种特殊的成员方法,构造方法名与( 类名) 相同。 15.Java语言只允许单继承,指每个类只能有一个( 父类)。 16.Java源程序的扩展名是( .java),经过编译后的程序的扩展名是(.class)。 17、如果将类MyClass声明为public,它的文件名称必须是(Myclass.java)才能正常编译。 ;.'

网络语言特点

精选文档 网络语言特点:开放性自由性互动性 一句话一段,句号代替了大部分标点。再就是整体结构混乱,缺乏严谨的构思,还有大量奇特新颖网络语言的出现更是冲击混淆了文学的规范和纯洁。 网络文学要避免“昙花一现”的命运,首要的是要培养一大批高水平的网络写手,采取人们易于接受的手法创出高水准的作品,不断提高作品的质量和内涵,提高作品的品位和底蕴,其次,要加强向传统文学的学习,吸取传统文学中的精华,扬长避短,在表达内容和表现形式上更加大众化,更加贴近生活,有了高水平的作者群,有了较稳定的读者群,网络文学就能长盛不衰。 与两千多年传统文学相比,网络文学还只是一个尚在襁褓中啼哭不止的新生儿。它更多的还是需要我们悉心的照料和呵护,积极的扶持和引导。让我们大家为这个新生的事物鼓与呼。 网络语言 网络语言是伴随着网络的发展而新兴的一种有别于传统平面媒介的语言形式。它以简洁生动的形式甫一诞生就得到了广大网友的偏爱,发展神速。网络语言包括拼音或者英文字母的缩写.含有某种特定意义的数字以及形象生动的网络动化和图片,起初主要是网虫们为了提高网上聊天的效率或某种特定的需要而采取的方式,久而久之就形成特定语言了。网络上冒出的新词汇主要取决于它自身的生命力,如果那些充满活力的网络语言能够经得起时间的考验,约定俗成后我们就可以接受。 网络语言具有以下特点: 一.词素的组成是以字词为主,越来越多的英文字母和数字还有少量图形加入其中。 除了汉语中原有的词语外,大量的新兴字词参与其中。同时网络也演变了一些词义,或扩大或转移,或变化其情感色彩。这些词语都是新兴网络语言中的重要生力军,若不懂得这些词语,那就成了网络中的文盲——网盲了。如“这样子”被说成“酱紫”,不说“版主”说“斑竹”;“555”是哭的意思,“886”代表再见,这些大多都是与汉语的发音相似引申而来的;还有BBS、BLOG、PK(VS的升级版)等大量的英文缩写或音译词;除此之外还有用:-)表示微笑,用*()*表示脸红等。 二.由网络人群新创或约定俗成。 这类语言的出现与传播主要寄生于网络人群,还有为数不少的手机用户。Chat里经常能出现“恐龙、美眉、霉女、青蛙、菌男、东东”等网络语言,BBS里也常从他们的帖子里冒出些“隔壁、楼上、楼下、楼主、潜水、灌水”等“专业”词汇。QQ聊天中有丰富生动的表情图表,如一个挥动的手代表“再见”,冒气的杯子表示“喝茶”;手机短信中也越来越多的使用“近方言词”,如“冷松”(西北方言,音leng3声松2声,意为“竭尽”),等等。 三.网络语言一直在不停的丰富和淘汰中发展着。 如果留意和总结一下近几年人们在表示愤怒时常说的词语就会发现一条清晰的演化路线。 网络语言的类型总结: 数字型:一般是谐音,例如9494=就是、就是;7456=气死我了;555~~~~`=呜呜呜(哭泣声,也是阿则最喜欢用的一个符号);886=拜拜了;

Java软件中年级工程师笔试题复杂逻辑

J2E E部分 1、运算符优先级问题,下面代码的结果是多少?(笔试) package test; public class Test { public static void main(String[] args) { int k = 0; int ret = ++k + k++ + ++k + k; // ret的值为多少 } } 2、运算符问题,下面代码分别输出什么?(笔试) package test; public class Test { public static void main(String[] args) { int i1 = 10, i2 = 10; } } 3、下面代码的结果是什么?还是抛出异常?(笔试) package test; public class Test { public void myMethod(String str) { } public void myMethod(Object obj) { } public static void main(String[] args) { Test t = new Test(); t.myMethod(null); } } 4、假设今天是9月8日,下面代码输出什么?(笔试) package test; public class Test { public static void main(String[] args) { Date date = new Date(); } } 5、下面代码的输出结果是什么? package test; public class Test {

public static void main(String[] args) { double val = 11.5; } } 6、下面代码的结果是什么? package test; public class Test extends Base { public static void main(String[] args) { Base b = new Test(); b.method(); Test t = new Test(); t.method(); } @Override public void method() { } } class Base { public void method() throws InterruptedException { } } 7、以下代码的结果是什么? package test; public class Test extends Base { public static void main(String[] args) { new Test().method(); } public void method() { } } class Base { } 8、true or false? package test; public class Test { public static void main(String[] args) { String str1 = new String("abc"); String str2 = new String("abc"); StringBuffer sb1 = new StringBuffer("abc"); StringBuffer sb2 = new StringBuffer("abc"); } } 9、输出的结果是什么?

网络英文聊天常用语

---问好--- 1,hiho=hola=yo=hi=hey=hellow=你好,大家好 2,wuz up=sup=what's up=(原意:怎么样你?/有什么事儿嘛?)也可作为问好用(当然是比较熟的两个人之间的问候),回答时有事说事,没事用"nothing/nothin much/not much/nm等回答就可以。 ---再见--- 1,cya=cu=see ya=see you=再见 2,laterz=later=cya later=see ya later=see you later=再见 3,gn=gn8=gnight=good night=晚安 4,nn=nite=晚安 说明:一般第一个人常说gnight/gn8,然后第二个人用nite,后面的用nn什么的都可以了。不要问我为什么,约定俗成而已。 ---惊叹赞扬--- 1,OMG=oh my god=我的天;我靠! 2,OMFG=oh my * ***ing god=我的老天;我靠靠; 3,wtf=what the * ***=怎么会事!?;我日!; 4,n1=nice 1=nice one=漂亮 5, pwnz=ownz=牛比!(例句:pwnz demo!;lefuzee ownz all the others!) 6,rullz=强!(例句:lefuzee rullz!;you guyz rull!!!) 7,you rock!=你牛比!(口语中常用,irc中偶尔能看到。) ---笑--- 1,lol=laughing out loud /laugh out loud=大笑 2,lmao=laughing my ass off=笑的屁股尿流 3,rofl=roll on floor laughing=笑翻天了 排序:hehe ---其他简写--- 1,FU=* *** you=*你;滚 2,STFU=Shut the * *** up!=他妈的给我闭嘴! 3,k=ok=okay=okie=好的,恩 4,sux=s uck的第3人称单数形势(例句:that sux)=sb;滥 5,gimme=give me=给我 6,xfer=transfer=传输 7,em=them=他们的宾格 8,thx=thanks=谢谢 9,happy bday=happy b-day=happy birthday!=生日快乐 10,dunno=dont know=不知道 11,kinda=a little bit=有点(例句:The game is kinda hard for me.i kinda think i should get it done as soon as possible.) 12,tho=though=虽然尽管(例句:That demo was very nice,kinda old tho.那个demo很不错,虽然有点老) 13,plz=please=请

《JAVA语言程序设计》期末考试试题及答案

《JA V A语言程序设计》期末考试试题及答案3 一、单项选择题 1、如下哪个是Java中的标识符() A、public B、super C、3number D、width 2、如下哪个是Java中的标识符( ) A、fieldname B、super C、3number D、#number 3、已知如下定义:String s = "story"; 下面哪个语句不是合法的( ) A、s += "books"; B、s = s + 100; C、int len = s.length; D、String t = s + “abc”; 4、如下哪个是Java中有效的关键字() A、name B、hello C、false D、good 5、下面的代码段执行之后count的值是什么( ) int count = 1; for (int i = 1; i <= 5; i++) { count += i; } System.out.println(count); A、5 B、1 C、15 D、16 6、定义一个类,必须使用的关键字是( ) A、public B、class C、interface D、static 7、定义一个接口必须使用的关键字是() A、public B、class C、interface D、static 8、如果容器组件p的布局是BorderLayout,则在p的下边中添加一个按钮b,应该使用的语句是() A、p.add(b); B、p.add(b,"North"); C、p.add(b,"South"); D、b.add(p,"North"); 9、声明并创建一个按钮对象b,应该使用的语句是() A、Button b=new Button(); B、button b=new button();

网络语言的语用功能

网络语言的语用功能 [摘要] 网络语言伴随着网络应运而生。在其形成的过程中形成了自己的鲜明特点。本文从分析网络语言这一原生态语言的特点入手,讨论了网络语言的语用功能。 [关键词] 网络语言特点语用功能 1. 引言 随着网络技术的飞速发展和计算机的普及,人类已经迈入了信息化时代。网络已经变成现代人的一种重要交际工具,成为现代生活中不可或缺的一部分。在互联网上,不同国籍、不同民族、不同性别、不同年龄、不同职业的人都可以进行交流。广泛的网络交际催生了一种新语体——网络语言。网络语言是指网友们网上交流时用来传递信息的一些特别的信息符号和言语方式,如:“伊妹儿”、“霉女”、“闪”、“见光死”等。网络语言不仅是一种新兴的语言现象,更是一种社会现象和文化现象。由于网络语言借助网络来进行交际,因此它与我们日常生活中的交际语言有很大的不同。 2.网络语言的特点 网络语言是互联网环境下的原生态语言,是网络信息传播的产物,它具有多元、互动、开放、即时、匿名等特征,是网民集体创造出来的符号媒介。相对于我们日常生活的的交际语言,网络语言由于其生成环境的特殊性,不可避免地带有与网络有关的鲜明特征。 2.1口语性 网络语言是网民(netizen)在虚拟世界随心所欲表达自己感情的语言,它以书面形式表达出来,但由于网络语言的即时性,其实质上非常接近口语语体。网民们在网络上交流,就像是在现实生活中的即时对话,它带有明显的口语特征。网络语言大量使用语气词,甚至比现实生活口语中的语气词还要多。如在一句话的开头或结尾经常出现“哇噻!”,“噢”“哈哈”“呵呵”等。另外,网络语言还大量使用各地方言。由于方言在语音、语调和词汇上与普通话有一定的差异,字典里很少有这类词汇。因此,为了达到方言的共鸣和幽默效果,网民们常常利用谐音这一手段造出许多字“新”的用法。如:“挤使(死)了, 前面的银(人)”(青岛方言)。“刚一发工资,钱都被婆娘(老婆)洗白(一无所有)了仨!”(四川话) 2.2简约性 网络语言是通过敲击计算机键盘得以实现。为追求与思维的同步,网络语言要在最短的时间内传递出最大的信息量,因此网络语言具有鲜明的经济简约性。根据简洁快速的原则,网络语言创造出许多网络缩略语。一种是汉语拼音字头的

java软件工程师面试题集

java软件工程师面试题集 EJB方面 1、EJB2.0有哪些内容?分别用在什么场合? EJB2.0和EJB1.1的区别? 答:规范内容包括Bean提供者,应用程序装配者,EJB容器,EJB配置工具,EJB服务提供者,系统管理员。这里面,EJB容器是EJB之所以能够运行的核心。EJB容器管理着EJB的创建,撤消,激活,去活,与数据库的连接等等重要的核心工作。JSP,Servlet,EJB,JNDI,JDBC,JMS..... 2、EJB与JAVA BEAN的区别? 答:Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java 类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB 必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。 3、EJB的基本架构 答:一个EJB包括三个部分: Remote Interface 接口的代码 package Beans; import javax.ejb.EJBObject; import java.rmi.RemoteException; public interface Add extends EJBObject { //some method declare } Home Interface 接口的代码

JAVA试题及答案

JA V A语言基础内部测试题 选择题(针对以下题目,请选择最符合题目要求的答案,针对每一道题目,所有答案都选对,则该题得分,所选答案错误或不能选出所有答案,则该题不得分。)(每题2分) 没有注明选择几项的,只选择一项 1、JAVA所定义的版本中不包括:() A、JAVA2 EE B、JAVA2 Card C、JAVA2 ME D、JAVA2 HE E、JAVA2 SE 2、下列说法正确的是() A、JAVA程序的main方法必须写在类里面 B、JAVA程序中可以有多个main方法 C、JAVA程序中类名必须与文件名一样 D、JAVA程序的main方法中如果只有一条语句,可以不用{}(大括号)括起来 3、Java中,在如下所示的Test类中,共有()个构造方法。 public class Test{ private int x; public Test(){ x=35; } public void Test(double f){ =(int)f; } public Test(String s){} } A、0 B、 1 C、 2 D、3 4、变量命名规范说法正确的是() A、变量由字母、下划线、数字、$符号随意组成; B、变量不能以数字作为开头; C、A和a在java中是同一个变量; D、不同类型的变量,可以起相同的名字; 5、下列javaDoc注释正确的是() A、/*我爱北京天安门*/

B、quals("john") C、"john" = "john" D、"john".equals(new String("john")) 6、下列输出结果是() int a = 0 ; while ( a < 5 ) { switch(a){ case 0: case 3 : a = a + 2; case 1 : case 2 : a = a + 3; default : a = a + 5; } } ( a ) ; A、0 B、5 C、10 D、其他 7、下列代码输出结果是( ) int i = 10; while ( i > 0 ){ i = i + 1; if ( i = =10 ){ break; } } A.while循环执行10次 B.死循环 C.循环一次都不执行 D.循环执行一次 8、下面有关for循环的描述正确的是() A、for循环体语句中,可以包含多条语句,但要用大括号括起来 B、for循环只能用于循环次数已经确定的情况 C、在for循环中,不能使用break语句跳出循环 D、for循环是先执行循环体语句,后进行条件判断 9、下列()属于引用数据类型(选择两项) A、String B、char C、用户自定义的Student类类型

网络聊天的技巧

网络聊天的有点是:方便,快捷,免费和范围广。 它的弊端是:你无法了解你在和什么样的人聊天<这里指陌生人> 由于这个弊端,或许在聊天的时候<不管是MSN还是QQ什么的啦~>他或她的语言艺术,取代了外表,举止等一般我们面对面交流会在意的因素,因此在聊天的时候语言艺术晋升为最重要的因素。 举例来说,<定量:女生>如果在你聊天的时候,将你的语言变得圆滑,在你每个句子的结尾加上一些轻声词<不知道这个怎么表达:就叫"轻声词"好了>。“你好哦~” “真的么~” “你怎么能这么说呢啊~” “你说的真对哦~”,类似这样的话,这会给对方一种可爱的感觉。笑的话,个人认为用“嘻嘻”比“哈哈” “呵呵”显得更加Lovely。反之“你好” “真的” “你怎么这么说?” “你说的真对” 就会给人一种比较刚硬的感觉。 而一个男生的话,说话需要刚劲,有力,有思想。加上那些轻声词的话,会给人产生一种娘娘腔的感觉。男生聊天的话,最好少言,多思考,并且思考要深。 还有,聊天的时候,经常“哦” “嗯”.....是一种不是很礼貌的行为<个人认为>,如果别人给你打了200个字,你只回复了一个"哦",换位思考一下,如果是自己收到这个"哦"的感觉,那必定是一种付出和回报不成正比的挫败感。当别人这么对你的话,这也说明一点,他或她并不愿意和你聊天,你还是不要再打搅人家了,或许他的心情现在不是很好,不想说什么....... 最后一点,或许经常聊天,培养出自己的一些独到的特色。这也会给自己增加不少分的>.< 总之,网络聊天中语言的技巧扮演了重要的角色,多多注意一下,或许会有什么好的“机遇”哦~ 之前和一个人讲过来着~ 今天有点时间~ 好好总结一下~ 轻轻地一点击 你我再也不是距离 随意的一个表情 就能传递你的开心和不如意 网络

java期末选择试题及答案大全

一、单选题:(每题1分)下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项的标记写在题干后的括号内。 1.下列语句序列执行后,k 的值是( B )。 int m=3, n=6, k=0; while( (m++) < ( -- n) ) ++k; A) 0 B) 1 C) 2 D) 3 2.设 i、j 为int型变量名,a 为int型数组名,以下选项中,正确的赋值语句是( B )。 A) i = i + 2 B) a[0] = 7; C) i++ - --j; D) a(0) = 66; 3.Java语言的类间的继承关系是( B )。 A) 多重的 B) 单重的 C) 线程的 D) 不能继承 4.设有定义 int i = 6 ;,则执行以下语句后,i 的值为( C )。 i += i - 1; A) 10 B) 121 C) 11 D) 100 5.下列选项中,用于在定义子类时声明父类名的关键字是( C )。 A)interface B) package C) extends D) class 6.若已定义 byte[ ] x= {11,22,33,-66} ; 其中0≤k≤3,则对x数组元素错误的引用是( C )。 A) x[5-3] B) x[k] C) x[k+5] D) x[0] 7.下列语句序列执行后,ch1 的值是( B )。 char ch1='A',ch2='W'; if(ch1 + 2 < ch2 ) ++ch1; A) 'A' B) 'B' C) 'C' D) B 8.下列语句序列执行后,i 的值是( D )。 int i=8, j=16; if( i-1 > j ) i--; else j--; A) 15 B) 16 C) 7 D) 8 9.下列语句序列执行后,k 的值是( C )。 int i=10, j=18, k=30; switch( j - i ) { case 8 : k++; case 9 : k+=2; case 10: k+=3; default : k/=j; } A) 31 B) 32 C) 2 D) 33 10.下面语句执行后,i 的值是( B )。 for( int i=0, j=1; j < 5; j+=3 ) i=i+j; A) 4 B) 5 C) 6 D) 7 11.设有定义 float x=3.5f, y=4.6f, z=5.7f;则以下的表达式中,值为true的是( B )。 A) x > y || x > z B) x != y C) z > ( y + x ) D) x < y & ! ( x < z ) 12.下列语句序列执行后,i的值是( D )。 int i=16; do { i/=2; } while( i > 3 ); A) 16 B) 8 C) 4 D) 2 13.以下由 for 语句构成的循环执行的次数是( B )。 for ( int i = 0; true ; i++) ; A) 有语法错,不能执行 B) 无限次 C) 执行1次 D) 一次也不执行 14.定义类头时能使用的修饰符是(C )。 A) private B) static C) abstract D) protected 15.设int 型变量 a、b,float 型变量 x、y,char 型变量 ch 均已正确定义并赋值, 正确的switch语句是D )。 A) switch (x + y) B) switch ( ch + 1 ) { ...... } { ...... } C) switch ch D) switch ( a + b );

论网络语言的特点与发展趋势

论网络语言的特点与发展趋势 [作者:孙柏转贴自:湖南社会学网点击数:239 更新时间:2009-6-17 文章录入:admin ] 越来越多的人正处在网络文化的新时代当中,而人类交流的工具——语言,也随着网络的扩展在一个新的时空里延伸。网络作为语言的一个载体,具有虚拟性、自主性、开放性、包容性、多样性等不同于传统语言载体的特点,正是由于这些特点催生了语言的新语体--网络语言。网络语言的出现和发展是当代语言生活中一个引起广泛关注的现象。 一、网络语言的特点 相对于我们的真实世界和生活语言,网络语言是人们在网络上用以交流的信息载体,由于其形成环境的特殊性,不可避免地带有与网络相适应的鲜明特征。 1、口语化 网络语言的表现形式虽然是书面的,但其实质更接近口语。网民们在网络中使用网络语言进行交流,就像是在现实生活中"打电话",它带有口语化的特征,主要表现为:(1)语气词的大量使用。网络语言中语气词的使用随处可见,网民们在一句话的开头或结尾都常会使用语气词,有的时候还是两个语气词叠用。如:"哇噻,终于找到你了!","噢,我就说呢。"语气词的使用在日常口语中也很常见,但网络语言中语气词的使用与之相比似有过之而无不及。由于网上交流少了面对面交流的那一份约束,网络语言常显得更加夸张,就语气词而言,不仅出现的频率相当高,而且还常常在后面跟上类似于"~~~"的符号,用以加强语气。(2)

方言词的大量使用。在网络语言中方言占据了流行的一角,并借助网络传播的优势赢得了越来越多网民的亲睐。由于方言在语音、语调和词汇上与普通话有一定的差异,字典里很少有标记这一类词汇的文字(有的方言甚至根本没有相应的文字书写形式)。因此,为了达到方言的音响效果,网民们常常利用谐音这一手段造出许多字的"新"用法。如:"麻烦介绍一下撒"(语气词,四川方言),"偶觉得还可以"("我"的意思,港台方言)。网络语言中的方言现象不仅能让操同一方言的使用者倍感亲切,有时还能利用其特殊的语音、语调造成幽默,新奇或是讽刺的效果,如下文中的例子采用谐音,就将方言普通话的腔调模仿的惟妙惟肖,例一:"亲爱滴,偶来了咯~~~",生动地表现了"小情人"间那种"粘乎乎"感觉。(3)省音现象。网络语言中的省音现象与英语中的连读有些相似但又不完全相同,英语中的连读只是将两个字的发音连在一起,并不因此减少一个因素。而网络语言中的这种省音现象不仅将两个字的发音连在了一起,还省去了一些因素对音节进行合并。在日常的口头交际中,由于语速过快人们有时会将两个字的音连起来发,听上去像一个字,用书面语的形式记录下来的话,通常会还其本来面目,可是在网络语言中,这种现象却被网民们"临摹"下来了,如:"你不要老是酱紫嘛。"--"酱紫"是"这样子"的意思。 2、创造性 与现代汉语词汇系统中词汇的严谨相比较,网络语言由于减少了外来的束缚,发挥了运用者的自由,往往在构思上更为巧妙,语出惊人,令人瞠目,最大限度地反映了人们在语言上的创造力。网民们可以在网络上最大限度地发挥自己的想象力和创造性,张扬自己的个性以引起别人的重视,取得一定范围的认同,丰富多彩的网络语言为网民提供展示个性的平台,网民展示个性的文字又丰富了网络语言的空间。网络语言建立在想象基础之上,其独特的语言体式和风格表现在网络语言的词语、数字、字母、图形、音韵和中外语言的内涵延展、脱义和综合转换运用上,表现在句式的简短、倒装、创新和省略上。(1)完全创新。例如:称刚上网的新手为"菜鸟",称网络高手为"大虾",(2)旧词翻新意。例如:"恐龙"原指外型奇特的史前动物,因其形态丑陋而被借用来表示"相貌丑陋的上网女性";"青蛙"则指网上相貌丑陋的男性公民;(3)产生源生词。用源生的方式创新。例如:有了"黑客"就有了"蓝客"、"红客"。构成网络新词语的词大多是语言中固

java软件工程师笔试试题

JA V A编程方面 1.Java中switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?(3’) 2.Java中String 对象能否被继承?STRING与STRINGBUFFER的区别?(6’) 3.说说你熟悉的几种Java的常用设计模式,一般在哪种情况下用到这些设计模式?你对设 计模式有什么看法?用java实现一个单例模式?(12’) 4.abstract class和interface有什么区别?(5’) 5.说说你所知道的java解析XML的方法。(4’) 6.简述ArrayList和Vector的区别,HashMap和Hashtable的区别。(20’) 7.写一个Javascript函数,返回指定的英文句子中的每个单词及其字符的起止位置。 例:”Th at is right.”应依次返回”Th at 0-4”, ”is 5-7” ,”right 8-13”(15’) 8.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变

化后的结果?那么这里到底是值传递还是引用传递? (5’) 数据库方面 1.事务是什么?(5’) 2.Oracle中有2张表格T1和T2,如下所示: T1 A B C 1 1 1 1 21 1 12 21 1 12 1 Null 12 41 2 12 4 3 T2 A B C 12 1 5 13 1 1 14 2 2 22 5 2 2 16 1 请问select * from T2 where c not in (select c from T1)结果是什么?(10’) 英文翻译(15’) Foremost amongst these is the Spring Framework's Inversion of Control (IoC) container. A thorough treatment of the Spring Framework's IoC container is closely followed by comprehensive coverage of Spring's Aspect-Oriented Programming (AOP) technologies. The Spring Framework has its own AOP framework, which is conceptually easy to understand, and which successfully addresses the 80% sweet spot of AOP requirements in Java enterprise programming. Coverage of Spring's integration with AspectJ (currently the richest - in terms of features - and certainly most mature AOP implementation in the Java enterprise space) is also provided.

相关主题
文本预览
相关文档 最新文档