下载

0下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 java实现即时通讯 聊天软件

java实现即时通讯 聊天软件.doc

java实现即时通讯 聊天软件

涐们失去曾经
2017-09-01 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《java实现即时通讯 聊天软件doc》,可适用于IT/计算机领域

java实现即时通讯聊天软件网络通信编程大作业聊天程序学院名称:计算机与电子信息学院专业名称:网络工程类班级:姓名:学号:目录(目录„„„„„„„„„„„„„„„„„„„„„„„„„„(简介„„„„„„„„„„„„„„„„„„„„„„„„„„(开发平台和工具„„„„„„„„„„„„„„„„„„„„„(设计说明及流程图„„„„„„„„„„„„„„„„„„„„(主要功能实现与代码摘要„„„„„„„„„„„„„„„„„(测试效果„„„„„„„„„„„„„„„„„„„„„„„„(总结„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„简介本学期学习了网络接口编程课程这是学习的过程中让我受益匪浅学到了很多知识通过课本的知识延伸开拓了自己的视野增广了自己的知识。在期末的过程中通过最后的三个实验中更让我熟悉了C与java语言以及对TCPIP协议以及UDP协议有了深刻的理解。在本次大作业我决定用java编写一个聊天程序完成聊天的一些基本功能通过服务器端转发实现客户端之间的相互通信。开发平台和工具操作系统Windows开发环境Java、eclipse设计说明及流程图设计说明如下:(服务器端()打开服务器()监听客户端发送的消息()发送消息给指定客户端()关闭服务器(客户端()打开客户端()登录()发送消息()监听来自服务器的消息()退出客户端()关闭客户端(流程图服务器客户端客户端登录发送登录发送监听服务器端消息监听服务器端消息响应监听客户端消息响应并转发退出退出关闭图主要功能实现与代码摘要这次大作业主要分为服务器端和客户端两部分主要的功能以及代码设计如下:一(服务器端服务器端的功能主要是实现监听和转发功能主要代码如下:()获取客户端发送的数据包bytebuf=newbytereceivePacket=newDatagramPacket(buf,buflength)即创建一个用于接收UDP数据包receiveSocketreceive(receivePacket)等待任何客户机发送数据包()截取相应的字符串以获得相应的信息bytedata=receivePacketgetData()获取包中含有的数据StringreceivedString=newString(data,,receivePacketgetLength())即获取客户机发送的文本内容Stringhostname=receivedStringsubstring(,)获得用户名(前四个)登录用户名Stringtoname=receivedStringsubstring(,)聊天对象名Stringstrto=receivedStringsubstring(,receivedStringlength())发送给另一个客户端的内容()对数据包进行不同的分类处理和转发,用户登录时服务器处理如下:if(tonameequals("into")){namei=hostnameipi=receivePacketgetAddress()porti=receivePacketgetPort()fcountjTAconappend("from"hostname)jTAconappend("用户登录n")for(k=k<countk){Stringstr=tonameconcat(namek)bytedatabyte=strgetBytes()sendPacket=newDatagramPacket(databyte,strlength(),ipi,porti)sendSocketsend(sendPacket)向客户端发送响应信息}},用户退出时服务器处理如下:for(k=ii<counti){namei=nameiipi=ipiporti=porti}fcount,用户发送消息给目的对象用户时,又分为用户对象存在和用户对象不存在的情况当对象存在时:sendPacket=newDatagramPacket(databyte,strlength(),ipj,portj)sendSocketsend(sendPacket)向客户端发送响应信息当对象不存在时:Stringstr=tonameconcat(flag)bytedatabyte=strgetBytes()sendPacket=newDatagramPacket(databyte,strlength(),ipi,porti)sendSocketsend(sendPacket)向客户端发送响应信息jTAconappend("聊天对象不存在或不在线n")()退出服务器处理voidbutcloseactionPerformed(ActionEvente)按关闭按钮时{Systemexit()}处理关闭程序protectedvoidprocessWindowEvent(WindowEvente){superprocessWindowEvent(e)if(egetID()==WindowEventWINDOWCLOSING)点X时退出并关闭(终止应用程序){Systemexit()}}二(客户端客户端有登录、发送、监听、主要有退出功能具体实现如下:()登录登录事件按钮voidbtlogactionPerformed(ActionEvente){Stringhostname=jTFlocgetText()本地机子用户名Stringstrtoname="into"聊天对象用户名Stringstrcon=jTAtocongetText()内容输入Stringstr=hostnameconcat(strtoname)concat(strcon)if(servernamecompareTo("")!=){try{jTAconappend(hostname":"strtoname"n")bytedatabyte=strgetBytes()字符串转化为字节数组生成一个发送给特定客户机的UDP数据包sendPacket=newDatagramPacket(databyte,strlength(),InetAddressgetByName(servername),port)Socketsend(sendPacket)向服务器发送登陆以及用户名信息验证}catch(IOExceptionioe){jTAconappend("网络通讯出现错误问题在"ioetoString())ioeprintStackTrace()}}elsejTAconsetText("pleaseinputyourfriend'sIPfirst!")}()发送发送按钮事件voidbttoactionPerformed(ActionEvente){Stringhostname=jTFlocgetText()本地机子用户名Stringstrtoname=jTFtogetText()聊天对象用户名Stringstrcon=jTAtocongetText()内容输入Stringstr=hostnameconcat(strtoname)concat(strcon)if(servernamecompareTo("")!=){try{jTAconappend(hostname":"strcon"n")bytedatabyte=strgetBytes()字符串转化为字节数组生成一个发送给特定客户机的UDP数据包sendPacket=newDatagramPacket(databyte,strlength(),InetAddressgetByName(servername),port)Socketsend(sendPacket)向服务器发送登陆以及用户名信息验证}catch(IOExceptionioe){jTAconappend("网络通讯出现错误问题在"ioetoString())ioeprintStackTrace()}}elsejTAconsetText("pleaseinputyourfriend'sIPfirst!")}()监听publicvoidwaitForPacket(){while(true){try{bytebuf=newbyte接收数据报方法buf为接收数据报的缓冲区length为数据报中数据的字节数(数据包长度)receivePacket=newDatagramPacket(buf,buflength)即创建一个用于接收UDP数据包Socketreceive(receivePacket)等待任何客户机发送数据包bytedata=receivePacketgetData()获取包中含有的数据StringreceivedString=newString(data,,receivePacketgetLength())即获取客户机发送的文本内容Stringrecname=receivedStringsubstring(,)Stringstrfrom=receivedStringsubstring(,receivedStringlength())receivePacketgetAddress()获取客户机Ip并在添加到文本域if(recnameequals("into")){jTAonlineappend(strfrom"n")jLlogsetText("登录成功~")}elsejTAconappend("from"recname":"strfrom"n")}catch(IOExceptione){jTAconappend("网络通讯出现错误问题在"etoString())eprintStackTrace()}}}()退出退出voidbtexitactionPerformed(ActionEvente){Stringhostname=jTFlocgetText()本地机子用户名Stringstrtoname="exit"聊天对象用户名Stringstrcon=jTAtocongetText()内容输入Stringstr=hostnameconcat(strtoname)concat(strcon)if(servernamecompareTo("")!=){try{jTAconappend(hostname":"strtoname"n")bytedatabyte=strgetBytes()字符串转化为字节数组生成一个发送给特定客户机的UDP数据包sendPacket=newDatagramPacket(databyte,strlength(),InetAddressgetByName(servername),port)Socketsend(sendPacket)向服务器发送登陆以及用户名信息验证}catch(IOExceptionioe){jTAconappend("网络通讯出现错误问题在"ioetoString())ioeprintStackTrace()}}elsejTAconsetText("pleaseinputyourfriend'sIPfirst!")Systemexit()}测试效果服务器端:客户端用户:客户端用户:总结本次大作业中通过java语言实现的这个聊天程序基本完成了聊天用户的需求这里使用的是UDP协议实现了两客户端之间通过服务器端的收发功能其中用到了UDP的newDatagramSocket()、newDatagramPacket(bytebuffer,intlength)、receive(DatagramPacketdp)以及send(DatagramPacketdp)等函数来实现数据报的接收和发送用getAddress()和getPort()函数来获取发送方的ip地址和端口号。根据实验的设计以及所需的代码再根据自己定义的传输数据格式完成了设计所需的功能。完成的过程是艰辛的但当看到自己辛勤劳作把程序成功运行出来有了劳动成功心里还是有许多欣慰的在这个环节中我学会了快速阅读代码明白了实验的前期设计工作的重要性后期的维护和修补漏洞是一个漫长的过程而要想自己的程序不断进步不断完善还需继续努力拼搏、奋斗。附源代码:一(*使用注意事项:、服务器的地址绑定在ClassCF中的第一句servername=“服务器ip地址”(Stringservername=""定义服务器ip)如:运行的服务器ip地址为:则servername=""、本程序中使用了字符串的有关函数来处理用户名本地用户名和聊天对象名都是四个字节的名字。如:本地用户名:聊天对象名:先登录后再发送*二、客户端*使用注意事项:、服务器的地址绑定在ClassCF中的第一句servername=“服务器ip地址”(Stringservername=""定义服务器ip)如:运行的服务器ip地址为:则servername=""、本程序中使用了字符串的有关函数来处理用户名本地用户名和聊天对象名都是四个字节的名字。如:本地用户名:聊天对象名:先登录后再发送*importjavaawt*importjavaawtevent*importjavaxswing*importjavanet*importjavaio*publicclassCFextendsJFrame{Stringservername=""定义服务器ipintport=JPanelcontentPane面板JLabeljLto=newJLabel()聊天对象名JLabeljLcon=newJLabel()内容JLabeljLtocon=newJLabel()发送消息JLabeljLloc=newJLabel()本地用户名JLabeljLlog=newJLabel()本地登录JLabeljLonline=newJLabel()本地登录JTextFieldjTFto=newJTextField()端口号聊天对象用户名JTextFieldjTFloc=newJTextField()单行文本输入框、本地用户名Buttonbtto=newButton()按钮Buttonbtlog=newButton()按钮Buttonbtexit=newButton()按钮JTextAreajTAcon=newJTextArea()多行文本输入框JTextAreajTAtocon=newJTextArea()JTextAreajTAonline=newJTextArea()JScrollPanesponline=newJScrollPane(jTAonline)滚动面板JScrollPanespcon=newJScrollPane(jTAcon)滚动面板JScrollPanesptocon=newJScrollPane(jTAtocon)privateDatagramSocketSocket声明发送数据报Socket和接收数据报SocketprivateDatagramPacketsendPacket,receivePacket声明发送数据报文包和接收数据报文包publicCF()构造函数{try{jbInit()初始化CF}catch(Exceptione){eprintStackTrace()}}初始化privatevoidjbInit()throwsException{contentPane=(JPanel)thisgetContentPane()contentPanesetLayout()thissetSize(newDimension(,))thissetTitle("客户端界面")jLlocsetText("本地用户名:")jLlocsetBounds(newRectangle(,,,))jTFlocsetText("")jTFlocsetBounds(newRectangle(,,,))btlogsetLabel("登录")btlogsetBounds(newRectangle(,,,))jLlogsetBounds(,,,)btexitsetLabel("退出")btexitsetBounds(newRectangle(,,,))jLonlinesetText("在线用户:")jLonlinesetBounds(,,,)jTAonlinesetBounds(newRectangle(,,,))sponlinesetBounds(newRectangle(,,,))jLtosetText("对象用户名:")jLtosetBounds(newRectangle(,,,))jTFtosetText("")jTFtosetBounds(newRectangle(,,,))jLconsetText("聊天内容:")jLconsetBounds(newRectangle(,,,))jTAconsetBounds(newRectangle(,,,))spconsetBounds(newRectangle(,,,))jLtoconsetText("发送信息:")jLtoconsetBounds(newRectangle(,,,))jTAtoconsetBounds(newRectangle(,,,))sptoconsetBounds(newRectangle(,,,))bttosetLabel("发送")bttosetBounds(newRectangle(,,,))发送按钮事件btlogaddActionListener(newjavaawteventActionListener(){publicvoidactionPerformed(ActionEvente){btlogactionPerformed(e)}})bttoaddActionListener(newjavaawteventActionListener(){publicvoidactionPerformed(ActionEvente){bttoactionPerformed(e)}})btexitaddActionListener(newjavaawteventActionListener(){publicvoidactionPerformed(ActionEvente){btexitactionPerformed(e)}})contentPaneadd(jLto,)contentPaneadd(jLcon,)contentPaneadd(jLtocon,)contentPaneadd(jLloc,)contentPaneadd(jLlog,)contentPaneadd(jLonline,)jTAconsetLineWrap(true)jTAtoconsetLineWrap(true)jTAonlinesetLineWrap(true)contentPaneadd(spcon,)contentPaneadd(sptocon,)contentPaneadd(sponline,)contentPaneadd(jTFto,)contentPaneadd(jTFloc,)contentPaneadd(btto,)contentPaneadd(btlog,)contentPaneadd(btexit,)try{通过数据报套接字可以发送、接收数据包收发DatagramPacket必须打开数据报套接字Socket=newDatagramSocket()实例化一个发送数据报Socket对象匿名端口receiveSocket=newDatagramSocket()实例化一个接收数据报Socket对象指明使用的端口可以作为服务器端口}catch(SocketExceptione){eprintStackTrace()Systemexit()遇到异常退出通常如果端口号一样的两个程序在同一台机子上运行第二个会不执行发生异常}}处理关闭程序protectedvoidprocessWindowEvent(WindowEvente){superprocessWindowEvent(e)if(egetID()==WindowEventWINDOWCLOSING)点X时退出并关闭(终止应用程序){Systemexit()}}监听来自服务器的数据报publicvoidwaitForPacket(){while(true){try{bytebuf=newbyte接收数据报方法buf为接收数据报的缓冲区length为数据报中数据的字节数(数据包长度)receivePacket=newDatagramPacket(buf,buflength)即创建一个用于接收UDP数据包Socketreceive(receivePacket)等待任何客户机发送数据包bytedata=receivePacketgetData()获取包中含有的数据StringreceivedString=newString(data,,receivePacketgetLength())即获取客户机发送的文本内容Stringrecname=receivedStringsubstring(,)Stringstrfrom=receivedStringsubstring(,receivedStringlength())receivePacketgetAddress()获取客户机Ip并在添加到文本域if(recnameequals("into")){jTAonlineappend(strfrom"n")jLlogsetText("登录成功~")}elsejTAconappend("from"recname":"strfrom"n")}catch(IOExceptione){jTAconappend("网络通讯出现错误问题在"etoString())eprintStackTrace()}}}登录事件按钮voidbtlogactionPerformed(ActionEvente){Stringhostname=jTFlocgetText()本地机子用户名Stringstrtoname="into"聊天对象用户名Stringstrcon=jTAtocongetText()内容输入Stringstr=hostnameconcat(strtoname)concat(strcon)if(servernamecompareTo("")!=){try{jTAconappend(hostname":"strtoname"n")bytedatabyte=strgetBytes()字符串转化为字节数组生成一个发送给特定客户机的UDP数据包sendPacket=newDatagramPacket(databyte,strlength(),InetAddressgetByName(servername),port)Socketsend(sendPacket)向服务器发送登陆以及用户名信息验证}catch(IOExceptionioe){jTAconappend("网络通讯出现错误问题在"ioetoString())ioeprintStackTrace()}}elsejTAconsetText("pleaseinputyourfriend'sIPfirst!")}发送按钮事件voidbttoactionPerformed(ActionEvente){Stringservername=""Stringhostname=jTFlocgetText()本地机子用户名Stringstrtoname=jTFtogetText()聊天对象用户名Stringstrcon=jTAtocongetText()内容输入Stringstr=hostnameconcat(strtoname)concat(strcon)if(servernamecompareTo("")!=){try{jTAconappend(hostname":"strcon"n")bytedatabyte=strgetBytes()字符串转化为字节数组生成一个发送给特定客户机的UDP数据包sendPacket=newDatagramPacket(databyte,strlength(),InetAddressgetByName(servername),port)Socketsend(sendPacket)向服务器发送登陆以及用户名信息验证}catch(IOExceptionioe){jTAconappend("网络通讯出现错误问题在"ioetoString())ioeprintStackTrace()}}elsejTAconsetText("pleaseinputyourfriend'sIPfirst!")}退出voidbtexitactionPerformed(ActionEvente){Stringhostname=jTFlocgetText()本地机子用户名Stringstrtoname="exit"聊天对象用户名Stringstrcon=jTAtocongetText()内容输入Stringstr=hostnameconcat(strtoname)concat(strcon)if(servernamecompareTo("")!=){try{jTAconappend(hostname":"strtoname"n")bytedatabyte=strgetBytes()字符串转化为字节数组生成一个发送给特定客户机的UDP数据包sendPacket=newDatagramPacket(databyte,strlength(),InetAddressgetByName(servername),port)Socketsend(sendPacket)向服务器发送登陆以及用户名信息验证}catch(IOExceptionioe){jTAconappend("网络通讯出现错误问题在"ioetoString())ioeprintStackTrace()}}elsejTAconsetText("pleaseinputyourfriend'sIPfirst!")Systemexit()}publicstaticvoidmain(Stringargs){CFframe=newCF()DimensionscreenSize=ToolkitgetDefaultToolkit()getScreenSize()DimensionframeSize=framegetSize()if(frameSizewidth>screenSizewidth){frameSizewidth=screenSizewidth}if(frameSizeheight>screenSizeheight){frameSizeheight=screenSizeheight}framesetLocation((screenSizewidthframeSizewidth),(screenSizeheightframeSizeheight))framesetVisible(true)framewaitForPacket()}}三、服务器端importjavaawt*importjavaawtevent*importjavaxswing*importjavanet*importjavaio*publicclassSSextendsJFrame{Stringname=newStringInetAddressip=newInetAddressintport=newintintcountintfcount=JPanelcontentPane面板JLabeljLcon=newJLabel()内容JTextAreajTAcon=newJTextArea()多行文本框JScrollPanespcon=newJScrollPane(jTAcon)滚动面板Buttonbtclose=newButton()关闭按钮privateDatagramSocketsendSocket,receiveSocket声明发送数据报Socket和接收数据报SocketprivateDatagramPacketsendPacket,receivePacket声明发送数据报文包和接收数据报文包publicSS()构造函数{try{jbInit()初始化CF}catch(Exceptione){eprintStackTrace()}}初始化privatevoidjbInit()throwsException{contentPane=(JPanel)thisgetContentPane()contentPanesetLayout()thissetSize(newDimension(,))thissetTitle("服务器界面")jLconsetText("通讯记录:")jLconsetBounds(newRectangle(,,,))jTAconsetBounds(newRectangle(,,,))spconsetBounds(newRectangle(,,,))btclosesetLabel("关闭")btclosesetBounds(newRectangle(,,,))发送按钮事件btcloseaddActionListener(newjavaawteventActionListener(){publicvoidactionPerformed(ActionEvente){butcloseactionPerformed(e)}})contentPaneadd(btclose,)contentPaneadd(jLcon,)jTAconsetLineWrap(true)contentPaneadd(spcon,)try{通过数据报套接字可以发送、接收数据包收发DatagramPacket必须打开数据报套接字sendSocket=newDatagramSocket()实例化一个发送数据报Socket对象匿名端口receiveSocket=newDatagramSocket()实例化一个接收数据报Socket对象指明使用的端口可以作为服务器端口}catch(SocketExceptione){eprintStackTrace()Systemexit()遇到异常退出通常如果端口号一样的两个程序在同一台机子上运行第二个会不执行发生异常}}voidbutcloseactionPerformed(ActionEvente){Systemexit()}处理关闭程序protectedvoidprocessWindowEvent(WindowEvente){superprocessWindowEvent(e)if(egetID()==WindowEventWINDOWCLOSING)点X时退出并关闭(终止应用程序){Systemexit()}}监听来自客户端的数据报publicvoidwaitForPacket(){while(true){try{intiintjintkcount=fcountbytebuf=newbyte接收数据报方法buf为接收数据报的缓冲区length为数据报中数据的字节数(数据包长度)receivePacket=newDatagramPacket(buf,buflength)即创建一个用于接收UDP数据包receiveSocketreceive(receivePacket)等待任何客户机发送数据包bytedata=receivePacketgetData()获取包中含有的数据StringreceivedString=newString(data,,receivePacketgetLength())即获取客户机发送的文本内容Stringflag="聊天对象不存在或不在线"Stringhostname=receivedStringsubstring(,)获得用户名(前四个)登录用户名Stringtoname=receivedStringsubstring(,)聊天对象名Stringstrto=receivedStringsubstring(,receivedStringlength())发送给另一个客户端的内容for(i=i<counti)if(hostnameequals(namei)){Stringstr=hostnameconcat(strto)jTAconappend("from"hostname":"strto"n")bytedatabyte=strgetBytes()for(j=j<countj)if(tonameequals(namej))用户点发送按钮时{sendPacket=newDatagramPacket(databyte,strlength(),ipj,portj)sendSocketsend(sendPacket)向客户端发送响应信息break}if(tonameequals("exit"))用户点退出按钮时{for(k=ii<counti){namei=nameiipi=ipiporti=porti}fcountbreak}if(j==count)用户对象不存在时{Stringstr=tonameconcat(flag)bytedatabyte=strgetBytes()sendPacket=newDatagramPacket(databyte,strlength(),ipi,porti)sendSocketsend(sendPacket)向客户端发送响应信息jTAconappend("聊天对象不存在或不在线n")}break}if(i==count){if(tonameequals("into")){namei=hostnameipi=receivePacketgetAddress()porti=receivePacketgetPort()fcountjTAconappend("from"hostname)jTAconappend("用户登录n")for(k=k<countk){Stringstr=tonameconcat(namek)bytedatabyte=strgetBytes()sendPacket=newDatagramPacket(databyte,strlength(),ipi,porti)sendSocketsend(sendPacket)向客户端发送响应信息}}}}catch(IOExceptione){jTAconappend("网络通讯出现错误问题在"etoString())eprintStackTrace()}}}主函数publicstaticvoidmain(Stringargs){SSframe=newSS()DimensionscreenSize=ToolkitgetDefaultToolkit()getScreenSize()DimensionframeSize=framegetSize()if(frameSizewidth>screenSizewidth){frameSizewidth=screenSizewidth}if(frameSizeheight>screenSizeheight){frameSizeheight=screenSizeheight}framesetLocation((screenSizewidthframeSizewidth),(screenSizeheightframeSizeheight))framesetVisible(true)framewaitForPacket()}}

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/35

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利