北京邮电大学软件工程实训项目报告Word格式文档下载.docx
《北京邮电大学软件工程实训项目报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《北京邮电大学软件工程实训项目报告Word格式文档下载.docx(19页珍藏版)》请在冰点文库上搜索。
![北京邮电大学软件工程实训项目报告Word格式文档下载.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/9518b261-66c4-474c-b92e-2dd6e9a85b7f/9518b261-66c4-474c-b92e-2dd6e9a85b7f1.gif)
目的:
通过IMS、Socket、JIAN-SIP了解传输层及应用层通信原理及传输机制,实际动手开发基于Socket客户服务器模式的信息传输,在此基础上最终实现基于JIAN-SIP协议的聊天室的开发。
要求:
设计一个基于B/S模式的即时聊天系统,可以通过代理服务器完成用户注册、数据传输、好友状态更新、两人及多人文字聊天等功能。
二.实训项目开发环境
✧EclipseVersion:
4.2.0
✧Windowsxp
三.实训项目内容
系统分析
✧本系统在前面学习Socket编程基础上利用JIAN-SIP协议开发聊天室系统。
因此需要充分理解传输层通信协议的基础上利用JIAN-SIP二次开发。
✧首先分析一下Socket编程原理,以便更好的JIAN-SIP开发,Socket编程以服务器等待客户端请求建立连接方式。
当服务器接收到客户的请求创建一个套接字,基于此进行相互通信,在服务器及客户端创建响应的接收及发送buffer,客户与服务器分别建立基于buffer的监听,完成信息的接收,当有新信息发送时放入发送buffer中进行传输。
✧JIAN-SIP协议基于Socket编程机制,是Socket的上一层,主要利用
Socket传输并且封装了调用Socket的类。
从应用方面JIAN-SIP更方便实现移动IP传输、基于视频、音频等通信。
JIAN-SIP协议主要通过客户服务器的应答、响应实现通信,在应答与响应基础上创建事件及对话功能。
整个传输以栈为基础,通过消息的拼装实现传输。
✧在聊天室系统中客户端要借助代理服务器实现与多人通信,代理服务器起着中间媒介的作用。
客户端通过代理服务器来找到实际需要通信的另一端建立通话。
整个过程中有请求连接,回复请求,创建连接实现真正数据传输。
系统设计
✧首先分解最终功能,实现聊天室的开发,基于客户服务器模式下实现端到端的传输机制,端到端的传输实现之后再上升到代理服务器。
✧Peer-Peer模式要求制作两个窗体作为界面,两个后台类作为实现,中间信息显示通过窗体赋值给对应的类,在类中实现接收、发送及信息的改变。
窗体主要实现信息显示,发送信息输入,单击发送时调用类实现基于栈的信息发送。
✧当两个用户之间实现收发传输基础上,开发代理服务器,要求客户首先登陆注册代理服务器,代理服务器接收用户响应,并且记录用户地址及状态信息等。
当发送信息时通过代理服务器获得对方地址。
实现三方信息传输。
✧基于代理服务器模式开发聊天室系统,客户登陆聊天室,代理服务器记录客户信息,开辟一个聊天场所供用户多人聊天。
实现私聊和群聊功能。
系统总体框图
图3.1客户服务器模式总体框图
图3.2代理服务器聊天室模式
用例模型
4.1客户服务器模式用例图
※用例名称:
启动服务器
⏹主要参与者:
服务器
⏹入口条件:
用户已经在服务器注册
⏹事件流程:
:
⏹1、系统启动等待已经注册客户重新注册
⏹2、验证客户注册信息
⏹3、返回注册成功信息给客户端
⏹4、监听客户连接申请,等待客户重新注册
⏹5、返回客户申请连接信息
登录注册
客户端用户
⏹事件流程:
⏹1、系统启动初始化
⏹2、向服务器发出注册申请
⏹3、等待代理服务器回复信息
⏹4、超时将重新发送注册信息
发送消息
用户已经在服务器注册成功并已经成功建立会话,等待数据传输
⏹1、系统将A客户发送信息按地址发送到B客户
⏹2、等待B客户的应答信息
⏹3、超时将重新发送信息
接收消息
⏹1、系统将处于收听状态,等待信息的接收
⏹2、接收到信息进行分解,分离信息
⏹3、将信息按格式呈现给客户再次等待信息
传输文件(未实现)
⏹1、A用户请求传输文件B用户。
⏹2、B用户在线并且接收该文件。
⏹3、B用户不在线A用户选择离线发送到服务器等待B用户上线接收。
修改个人登陆状态
服务器,客户端
⏹1、用户修改个人登陆信息
⏹2、用户修改完成提交修改信息给服务器
⏹3、服务器验证客户注册信息做进一步处理
⏹4、服务器验证信息是否完整,返回应答
4.1客户代理服务器模式用例图
启动系统
代理服务器
用户已经在代理服务器注册
登录聊天室
⏹2、向代理服务器发出注册申请
⏹3、等待代理代理服务器回复信息
私聊
⏹1、选择需要私聊用户
⏹2、发起一对一聊天模式
⏹3、系统发送信息给对应用户
⏹4、接收方收到信息发送相应消息
群聊
⏹1、向所有登陆聊天室用户发送聊天信息
⏹2、发起一对多聊天模式
⏹3、系统发送信息给所有聊天室用户
顺序图
类图
领域模型图
7.1聊天系统领域模型
四.实训项目结果及分析
✧基本实现基于javaSocket聊天系统
✧分析:
javaSocket聊天系统
只能进行简单的收发通信,不能多人聊天及一对多聊天,只能一对一聊天模式。
功能较简单。
✧基本实现基于JIAN-SIP聊天系统
JIAN-SIP聊天系统
只能进行简单的收发通信,能一对一聊天及一对多人聊天。
基本实现基于JIAN-SIP聊天室系统
JIAN-SIP聊天室系统
能实现简单的私聊和群聊及记录用户登录改变信息等。
五.实训项目人员、进度安排及完成过程
✧**主要负责:
基于JIAN-SIP聊天系统及聊天室系统
基于JAVASocket客户服务器模式聊天系统
基于JIAN-SIP客户服务器模式PTP聊天系统
✧**主要负责:
基于JIAN-SIP客户服务器模式界面美工、资料收集、文档编写、PPT制作等。
基于JIAN-SIP聊天室模式界面美工、资料收集、文档编写、PPT制作等。
六.实训项目心得及体会
心得体会:
通过聊天系统开发,理解Socket工作流程及实现方法,熟练掌握JAVASocket编程、JIAN-SIP编程。
实现了简单的基于JAVASocket编程简单聊天室功能分析设计及具体实施过程。
通过老师对SIP协议的讲解,对IMS也有了更深入了解,在系统实施过程中有更深的体会就是信令重要性,基于信令传输的格式及接受发送方法有了一个更清楚的了解。
在开发过程中遇到了很多问题,如HashTable表如何实现用户信息存储,NOTIFY信令为什么不能携带消息?
Dalog对话框问什么经常终止?
经过请教老师及同学的帮助一个一个的解决了,当然系统还有很多问题,但是在此过程中每个小组成员都有不同程度的提高,对JAVA编程也有了很好的训练。
七.附录
1、基于JAVASocket聊天室系统核心代码
publicvoidrun(){
//服务器端
try{
ServerSocketserverSocket=newServerSocket(portId);
serverSID=serverSocket.accept();
text.append("
服务器运行中"
+"
\n"
);
while(true){
InputStreamReaderrecervMessage=newInputStreamReader(serverSID.getInputStream());
BufferedReaderbuffer=newBufferedReader(recervMessage);
recervInput=buffer.readLine();
对方说"
+recervInput+"
}
}catch(IOExceptione){
//label.setText("
对方已经下线"
对方下线了。
。
"
}}
2、基于JIAN-SIP聊天系统核心代码
//该部分主要功能是将每次显示在控制台中的信息返回到窗体JTextAreatext中
privateintportId;
//自己定义的端口号
//传输接收信息
privatestaticJTextAreatext;
publicvoidGetMessage(JTextAreatext){
this.text=text;
服务器启动"
//结束自定义部分
publicvoidsendMessage(Stringmessage)throwsParseException,InvalidArgumentException,SipException{
Stringtransport="
udp"
;
StringpeerHostPort="
127.0.0.1:
5060"
StringfromName="
LittleGuy"
StringfromSipAddress="
StringfromDisplayName="
TheLittleBlister"
StringtoSipAddress="
StringtoUser="
BigGuy"
StringtoDisplayName="
TheMasterBlaster"
//create>
FromHeader
SipURIfromAddress=addressFactory.createSipURI(fromName,
fromSipAddress);
AddressfromNameAddress=addressFactory.createAddress(fromAddress);
fromNameAddress.setDisplayName(fromDisplayName);
FromHeaderfromHeader=headerFactory.createFromHeader(
fromNameAddress,"
12345"
//createToHeader
SipURItoAddress=addressFactory.createSipURI(toUser,toSipAddress);
AddresstoNameAddress=addressFactory.createAddress(toAddress);
toNameAddress.setDisplayName(toDisplayName);
ToHeadertoHeader=headerFactory.createToHeader(toNameAddress,
null);
SipURIrequestURI=addressFactory.createSipURI(toUser,
peerHostPort);
ArrayListviaHeaders=newArrayList();
StringipAddress=udpListeningPoint.getIPAddress();
ViaHeaderviaHeader=headerFactory.createViaHeader(ipAddress,
sipProvider.getListeningPoint(transport).getPort(),
transport,null);
viaHeaders.add(viaHeader);
ContentTypeHeadercontentTypeHeader=headerFactory
.createContentTypeHeader("
application"
"
sdp"
CallIdHeadercallIdHeader=sipProvider.getNewCallId();
CSeqHeadercSeqHeader=headerFactory.createCSeqHeader(1L,
Request.MESSAGE);
MaxForwardsHeadermaxForwards=headerFactory
.createMaxForwardsHeader(70);
Requestrequest=messageFactory.createRequest(requestURI,
Request.MESSAGE,callIdHeader,cSeqHeader,fromHeader,
toHeader,viaHeaders,maxForwards);
Stringhost="
127.0.0.1"
SipURIcontactUrl=addressFactory.createSipURI(fromName,host);
contactUrl.setPort(udpListeningPoint.getPort());
contactUrl.setLrParam();
SipURIcontactURI=addressFactory.createSipURI(fromName,host);
contactURI.setPort(sipProvider.getListeningPoint(transport)
.getPort());
AddresscontactAddress=addressFactory.createAddress(contactURI);
contactAddress.setDisplayName(fromName);
contactHeader=headerFactory.createContactHeader(contactAddress);
request.addHeader(contactHeader);
StringsdpData="
v=0\r\n"
+"
o=48551376079995695802013760799956958020"
INIP4129.6.55.78\r\n"
+"
s=mysessionsession\r\n"
p=+46852018010\r\n"
c=INIP4129.6.55.78\r\n"
t=00\r\n"
m=audio6022RTP/AVP0418\r\n"
a=rtpmap:
0PCMU/8000\r\n"
4G723/8000\r\n"
18G729A/8000\r\n"
a=ptime:
20\r\n"
byte[]contents=sdpData.getBytes();
request.setContent(contents,contentTypeHeader);
HeadercallInfoHeader=headerFactory.createHeader("
Call-Info"
<
http:
//www.antd1.nist.gov>
request.addHeader(callInfoHeader);
sipProvider.sendRequest(request);
//sendtherequestout.
inviteTid.sendRequest();
dialog=inviteTid.getDialog();
}catch(Exceptionex){
System.out.println(ex.getMessage());
ex.printStackTrace();
usage();
if(method.equals("
INFO"
))
{
FromHeaderfromInfo=(FromHeader)req.getHeader("
From"
Stringusername=fromInfo.toString().substring(7,12);
Stringuserstate=newString(req.getRawContent());
userloginnumber++;
+username+"
:
进入聊天室,聊天室人数:
+userloginnumber+"
人"
Stringuserid=username.substring(4,5);
Stringipaddress=fromRegist.toString().substring(15,39);
listModel.set(Integer.parseInt(userid),username+"
上线"
list.updateUI();
Responseresponse=null;
try{//ReplywithOK
response=messageFactory.createResponse(200,req);
ToHeadertoHeader=(ToHeader)response.getHeader(ToHeader.NAME);
toHeader.setTag("
888"
//Thisismandatoryasperthespec.
ServerTransactionst=sipProvider.getNewServerTransaction(req);
st.sendResponse(response);
}catch(Throwablee){
e.printStackTrace();
messageProcessor.processError("
Can'
tsendOKreply."
//将注册信息发给好友用户
for(inti=0;
i<
userNumber;
i++)
{intj=Integer.parseInt(useridinit[i]);
\n打印表中内容"
+userRegisterinit[j][0]+"
+userRegisterinit[j][1]);
//if(!
(aa[i][0].equals(username)))
//SendInfo(userRegisterinit[j][1],username+"
+ipaddress);
SendInfo(ipaddress,userRegisterinit[j][0]+
//SendInfo(aa[userNumber-1][1],aa[i][0]+"
}catch(ParseExceptione){
//TODOAuto-generatedcatchblock
}catch(InvalidArgumentExceptione){
}catch(SipExceptione){