java版基于UDP协议网上聊天程序课程设计
计算机网络课程设计利用java实现UDP协议
计算机网络课程设计利用java实现UDP协议实现UDP协议系别计算机与通信工程学院专业计算机科学与技术学号4110415姓名张振指导教师王聪xx年7月4日1、需求分析程序是如何通过网络进行相互通信的呢?各个孤立的工作站或主机用物理链路相连在一起,组成数据链路,从而达到资源共享和通信的目的,就形成网络。
通信是人与人之间同过某种媒体进行的信息交流与传递。
网络通信一般指网络协议。
当今网络协议有很多,其中基本最常用的就是TCP/IP 协议族。
UDP协议就是属于TCP/IP协议族中的协议。
在网络中它与TCP协议一样用于处理数据包。
在OSI模型中,UDP协议在第四层传输层,处于IP协议的上一层。
与TCP相比,UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
本文利用Java语言网络编程的思想,编写UDP协议程序,实现UDP协议在网络中所要完成的功能。
在Java语言为实现程序的相互通信提供了许多有用的抽象应用程序接口(API, Application Programming Interface),这类应用程序接口被称为套接字(sockets)。
因此,本文UDP协议的编程所需要用到的接口就是套接字。
2、实验环境开发环境: 个人PC+win8、1+myeclipse103、实验原理以及相关内容3、1 UDP简介UDP 是User Datagram Protocol的简称,中文全称是用户数据包协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
在网络中它与TCP协议一样用于处理数据包。
在OSI模型中,UDP协议在第四层传输层,处于IP协议的上一层。
与TCP相比,UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
UDP用来支持那些需要在计算机之间传输数据的网络应用。
包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。
计算机网络课程设计利用java实现UDP协议
文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.计算机网络课程设计利用java 实现UDP协议2014年7月4日1.需求分析程序是如何通过网络进行相互通信的呢?各个孤立的工作站或主机用物理链路相连在一起,组成数据链路,从而达到资源共享和通信的目的,就形成网络。
通信是人与人之间同过某种媒体进行的信息交流与传递。
网络通信一般指网络协议。
当今网络协议有很多,其中基本最常用的就是TCP/IP 协议族。
UDP 协议就是属于TCP/IP协议族中的协议。
在网络中它与TCP协议一样用于处理数据包。
在OSI模型中,UDP协议在第四层——传输层,处于IP协议的上一层。
与TCP相比,UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
本文利用Java语言网络编程的思想,编写UDP协议程序,实现UDP协议在网络中所要完成的功能。
在Java语言为实现程序的相互通信提供了许多有用的抽象应用程序接口(API,Application Programming Interface),这类应用程序接口被称为套接字(sockets)。
因此,本文UDP协议的编程所需要用到的接口就是套接字。
2.实验环境开发环境: 个人PC+win8.1+myeclipse 103.实验原理以及相关内容3.1 UDP简介UDP 是User Datagram Protocol的简称,中文全称是用户数据包协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
在网络中它与TCP 协议一样用于处理数据包。
在OSI模型中,UDP协议在第四层——传输层,处于IP协议的上一层。
与TCP相比,UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
UDP用来支持那些需要在计算机之间传输数据的网络应用。
包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。
java网络聊天软件课程设计
《面向对象程序设计课程设计》报告基于C/S结构的网络聊天室姓名:学院:信息技术学院专业:班级:学号:Eastern Liaoning University目录目录 (1)一、需求分析 (2)二、系统设计 (3)1、服务器端功能 (3)2、客户端功能 (3)3、通讯流程 (4)三、系统实现 (5)(一)总体设计 (5)1.服务器端设计 (5)2.客户端设计 (5)(二)代码思路 (6)1.定义服务端类Serverly继承Frame类 (6)2.定义Cliently类继承Frame类 (6)四.具体设计 (8)五、系统测试 (12)六、总结 (13)一、需求分析电信服务离不开网络编程,资料的传输离不开网络编程,还有很多很多,人们的生活已经离不开网络。
为了能迎合人们的需要,本小组决定利用java stocker编程开发一种可以在多操作系统中运行的聊天室软件,以满足人们业余生活的需要。
本软件采用Client/Server结构,将聊天系统划分为两个子系统:客户端子系统,服务器端子系统。
网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。
目前较为流行的网络编程模型是客户机/服务器结构。
即通信双方一方作为服务器等待客户提出请求并予以响应。
客户则在需要服务时向服务器提出申请。
服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。
因此,本项目即设计一个网络聊天程序,并根据这个程序说明TCP连接的建立,套接字Socket的使用,以及端口等问题,实现基于C/S模式的聊天室程序。
聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需要登录到服务器端才可以实现正常的聊天功能。
二、系统设计1、服务器端功能◆在特定端口上进行侦听,等待客户端连接。
基于UDP协议的网上聊天程序范例
湖南工业大学课程设计资料袋计算机与通信学院学院(系、部)2011 ~ 2012 学年第 1 学期课程名称计算机网络原理指导教师李建设职称副教授学生姓名蒋政专业班级软件092 学号题目基于UDP协议网上聊天程序成绩起止日期2011 年11 月24 日~2011 年12 月4 日目录清单课程设计任务书2010 —2011学年第 2 学期学院(系、部) 计算机与通信学院 专业软件工程 班级 091-3 课程名称: 计算机网络原理 学生姓名: 蒋政 设计题目: 基于UDP 协议网上聊天程序 指导教师: 李建设 完成期限:自 2011 年 11 月 24 日至 2011 年 12 月 4 日 共 2 周内 容 及 任 务一、设计内容实现一简单的聊天程序实现网上聊天,包括服务器和客户端。
1. 支持多人聊天。
2. 客户端具有图形化用户界面。
二、设计任务课程设计说明书(纸质+电子版),内容包括:设计内容、系统分析(包括可行性分析、需求分析等)及功能分析;系统设计(要求画出系统整体功能框图、流程图、并给出相应地关键的代码且对所使用的主要数据结构进行说明等。
)、设计总结(评价/遇到的问题/体会/建议等)、使用说明等。
三、设计要求1. 按功能要求开发系统,能正确运行。
程序代码书写规范,有充足的注释。
2. 课程设计所使用的编程语言任选,但建议使用C 或C++;3. 绿色软件:程序运行不需安装,避免写系统和注册表;进 度 安 排 起止日期工作内容2011-11-24~2011-11-27 选题2011-11-28~2011-11-29 系统分析和设计;2011-11-30~2011-12-3 熟悉软件开发工具、编码系统、系统测试2011-12-04~2011-12-05撰写并提交课程设计说明书 (含电子文档)、源程序等。
主 要 参 考 资 料[1] (美) Larry Peterson 著,薛静锋等译. 《计算机网络:系统方法》 (第4版) ,机械工业出版社,2009[2] (荷) Andrew S.Tanenbaum 著,潘爱民译. 《计算机网络》(第4版),清华大学出版社, 2004 [3] 谢希仁著.《计算机网络》((第5版) ,电子工业出版社, 2008.1 [4] 吴功宜等著.《计算机网络课程设计》,机械工业出版社,2005指导教师(签字): 年 月 日系(教研室)主任(签字):年月日课程设计说明书课程名称:计算机网络原理设计题目:基于UDP协议的聊天程序专业:软件工程班级:092学生姓名: 蒋政学号:指导教师:李建设年月日目录1. 课程设计具体实现过程 (4)2. 具体代码的实现 (8)3.注意事项 (12)4.参考文献 (12)一. 多线程编程聊天程序的具体实现1 创建MFC-EXE 工程,工程名为Chat,Dialog based。
Java基于UDP协议实现简单的聊天室程序
Java基于UDP协议实现简单的聊天室程序最近⽐较闲,⼀直在抽空回顾⼀些Java⽅⾯的技术应⽤。
今天没什么事做,基于UDP协议,写了⼀个⾮常简单的聊天室程序。
现在的⼯作,很少⽤到socket,也算是对Java⽹络编程⽅⾯的⼀个简单回忆。
先看⼀下效果:实现的效果可以说是⾮常⾮常简单,但还是可以简单的看到⼀个实现原理。
“聊天室001”的⽤户,⼩红和⼩绿相互聊了两句,“聊天室002”的⼩⿊⽆⼈理会,在⼀旁寂寞着。
看⼀下代码实现:1、⾸先是消息服务器的实现,功能很简单:•将客户端的信息(进⼊了哪⼀个聊天室等)进⾏登记;•构造UDP协议套接字对象,接受各个客户端发送的消息;•解析消息内容,将聊天信息推送回对应聊天室的各个客户端;package com.tsr.simplechat.receive_server;import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .SocketException;import java.util.ArrayList;import java.util.HashMap;import com.google.gson.Gson;import com.tsr.simplechat.bean.MessageEntity;import com.tsr.simplechat.client.ChatClient;//聊天服务器public class ChatServer extends Thread {// 程序占⽤端⼝号private static final int PORT = 10000;// 消息接受套接字对象private static DatagramSocket server = null;// 字典对象(Key:聊天室ID,Value:该聊天室下的客户端⽤户集合);private static HashMap<String, ArrayList<ChatClient>> groups = new HashMap<String, ArrayList<ChatClient>>();// 构造器public ChatServer() {try {// 消息接受套接字对象的构造初始化server = new DatagramSocket(PORT);} catch (SocketException e) {e.printStackTrace();}}// 注册聊天室新登录⽤户public static void logInGroup(String groupID, ChatClient client) {// 通过聊天室ID,获取该聊天室的所有在线⽤户ArrayList<ChatClient> clients = groups.get(groupID);if (clients == null) {clients = new ArrayList<ChatClient>();}// 将此次进⼊聊天室的⽤户登记clients.add(client);// 更新聊天室信息groups.put(groupID, clients);}// 循环接收消息@Overridepublic void run() {while (true) {receiveMessage();}}private void receiveMessage() {// UDP数据包byte[] buf = new byte[1024];DatagramPacket packet = new DatagramPacket(buf, buf.length);while (true) {try {// 接受数据包server.receive(packet);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 解析数据包,获取聊天信息String content = new String(packet.getData(), 0, packet.getLength()); // 通过第三⽅包解析json数据Gson gson = new Gson();MessageEntity me = gson.fromJson(content, MessageEntity.class); // 解析消息内容,通过聊天室ID,获取该聊天室的所有在线⽤户ArrayList<ChatClient> clients = groups.get(me.getGroupId());// 将接收到的消息推送回该聊天室的各个⽤户for (ChatClient client : clients) {client.pushBackMessage(me);}}}}2、客户端程序,依然很简单:•简单的定义客户端聊天室界⾯。
java版基于UDP协议网上聊天程序课程设计
工业大学课程设计资料袋计算机与通信学院学院(系、部)2013 ~ 2014 学年第 1 学期课程名称网络协议分析指导教师建设职称副教授学生专业班级网络工程学号题目基于UDP协议网上聊天程序成绩起止日期2013 年11 月25 日~2013 年12 月13 日目录清单56课程设计任务书2013 —2014学年第1 学期学院(系、部)计算机与通信学院专业网络工程班级102课程名称:网络工程学生:设计题目:基于UDP协议网上聊天程序指导教师:建设完成期限:自2013 年11 月25 日至2013 年12 月13 日共 3 周容及任务一、设计容实现一个基于UDP协议的简单的聊天程序,包括服务器和客户端。
1.支持多人聊天。
2.客户端具有图形化用户界面。
二、设计任务课程设计说明书(纸质+电子版),容包括:设计容、系统分析(包括可行性分析、需求分析等)及功能分析;系统设计(要求画出系统整体功能框图、流程图、并给出相应地关键的代码且对所使用的主要数据结构进行说明等。
)、设计总结(评价/遇到的问题/体会/建议等)、使用说明等。
三、设计要求1.按功能要求开发系统,能正确运行。
程序代码书写规,有充足的注释。
2.课程设计所使用的编程语言任选,但建议使用C或C++;3.绿色软件:程序运行不需安装,避免写系统和注册表;进度安排起止日期工作容2013-11-25~2013-11-3选题2013-12-1~2013-12-3 系统分析和设计;2013-12-4~2013-12-8 熟悉软件开发工具、编码系统、系统测试2013-12-9~2013-12-13 撰写并提交课程设计说明书(含电子文档)、源程序等。
指导教师(签字):年月日系(教研室)主任(签字):年月日课程设计说明书课程名称:网络协议分析设计题目:基于UDP协议网上聊天程序专业:班级:学生: 学号:指导教师:建设2013年12 月13 日目录1 课程设计简介 (4)1.1 课程设计的目的 (4)1.2 课程设计容 (4)2课程设计实现过程 (5)2.1 协议原理 (5)2.2 客户机/服务器模式 (7)2.3 关键技术 (8)2.4 流程图 (10)2.5 系统结构图 (11)2.6 程序调试及界面效果图 (11)2.7 源代码 (15)3设计总结 (22)4参考文献 (23)1 课程设计简介1.1 课程设计的目的开发一个专用于实现两台计算机之间即时通讯的软件,以方便两台或两台以上的计算机之间信息的交流。
计算机网络课程设计利用java实现UDP协议详情
实用文档计算机网络课程设计利用java 实现UDP协议系别计算机与通信工程学院专业计算机科学与技术学号4110415姓名张振指导教师王聪2014年7月4日1.需求分析程序是如何通过网络进行相互通信的呢?各个孤立的工作站或主机用物理链路相连在一起,组成数据链路,从而达到资源共享和通信的目的,就形成网络。
通信是人与人之间同过某种媒体进行的信息交流与传递。
网络通信一般指网络协议。
当今网络协议有很多,其中基本最常用的就是TCP/IP 协议族。
UDP 协议就是属于TCP/IP协议族中的协议。
在网络中它与TCP协议一样用于处理数据包。
在OSI模型中,UDP协议在第四层——传输层,处于IP协议的上一层。
与TCP 相比,UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
本文利用Java语言网络编程的思想,编写UDP协议程序,实现UDP协议在网络中所要完成的功能。
在Java语言为实现程序的相互通信提供了许多有用的抽象应用程序接口(API, Application Programming Interface),这类应用程序接口被称为套接字(sockets)。
因此,本文UDP协议的编程所需要用到的接口就是套接字。
2.实验环境开发环境: 个人PC+win8.1+myeclipse 103.实验原理以及相关内容3.1 UDP简介UDP 是User Datagram Protocol的简称,中文全称是用户数据包协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
在网络中它与TCP协议一样用于处理数据包。
在OSI模型中,UDP协议在第四层——传输层,处于IP协议的上一层。
与TCP相比,UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
UDP用来支持那些需要在计算机之间传输数据的网络应用。
java网络通信课程设计
java网络通信课程设计一、课程目标知识目标:1. 理解网络通信的基本概念,掌握Java网络编程的基本原理;2. 学会使用Java语言实现TCP和UDP协议的网络通信;3. 掌握多线程在网络编程中的应用,能够实现简单的服务器与客户端通信程序;4. 了解网络编程中的安全问题,掌握基本的异常处理和输入输出流操作。
技能目标:1. 能够运用所学知识设计并实现基于TCP/UDP协议的聊天程序;2. 能够运用多线程技术优化网络通信程序,提高程序性能;3. 能够分析网络通信过程中可能出现的异常,并编写相应的异常处理代码;4. 能够运用网络通信知识解决实际问题,具备一定的网络编程能力。
情感态度价值观目标:1. 培养学生对网络编程的兴趣,激发学习主动性和积极性;2. 培养学生的团队协作精神,学会与他人共同解决问题;3. 增强学生的网络安全意识,培养良好的网络道德观念;4. 提高学生的实践能力,培养创新精神和解决问题的能力。
课程性质:本课程为Java网络通信的实践课程,以理论知识为基础,注重实际操作能力的培养。
学生特点:学生具备一定的Java编程基础,对网络通信有一定了解,但实践经验不足。
教学要求:教师应注重理论与实践相结合,引导学生通过实际操作掌握网络编程技能,培养解决问题的能力。
在教学过程中,关注学生的个体差异,提供个性化指导,确保学生能够达到课程目标。
同时,注重培养学生的团队协作能力和创新精神,提高学生的综合素质。
二、教学内容1. 网络通信基本概念:介绍网络通信的基本原理,包括OSI七层模型、TCP/IP协议栈,重点讲解IP、TCP、UDP协议的工作原理。
教材章节:第一章 网络通信基础2. Java网络编程API:讲解Java提供的网络编程相关类和接口,如InetAddress、Socket、ServerSocket、DatagramPacket、DatagramSocket等。
教材章节:第二章 Java网络编程API3. TCP网络编程:通过实例讲解TCP协议下客户端与服务器端的通信过程,包括建立连接、数据传输、关闭连接等。
基于UDP的聊天程序实验报告
计算机网络实验报告实验名称:基于UDP的网络聊天程序实验目的及要求:通过设计网络协议及应用程序来加深理解网络各层的功能和机理,特别是对网络层、运输层、应用层的理解。
独立编写基于UDP的网络应用程序,独立上机调试程序,掌握基于UDP的网络应用基本技术。
培养独立思考问题、分析问题的能力和规范化工程设计的能力。
综合运用所学的知识去解决实践中的应用问题,掌握实验技能。
为以后的毕业设计与实际工作打下基础。
需求分析及技术路线:基于C/S的一对一聊天程序客户端对服务器呼叫,双方确认,建立连接。
双方进行消息发送。
使用c++语言在vc++6.0环境下编程。
在同一工作区内建立基于对话框的客户端client和服务器端server。
在类ClientDlg中添加函数Onsend和函数Onsendtest,Onsend用于发送消息,Onsendtest用于发送测试消息。
在类ServerDlg中添加函数Onsends,用于回复客户端的消息。
并建立类UDPClient和类UDPServer。
在类UDPClient中重载函数:UDPClient::UDPClient(CClientDlg *pdlg)用于与类ClientDlg的交互。
在类UDPClient中新建函数OnReceive,用于接收消息,记录发送方IP地址。
在类UDPServert中重载函数:UDPServer::UDPServer(CServerDlg *pdlg)用于与类ClientDlg的初始连接的确认。
在类UDPServer中新建函数OnReceive,用于接收消息,记录发送方IP地址,和记录消息。
实验(设计)方案及说明建立基于对话框的工作区UDP,在工作区内建立基于MFC AppWizard[exe] 的client 与server工程。
客户端client:界面设计与界面有关代码Server_IP 编辑框,用于输入服务器的IP地址,设计默认IP地址为127.0.0.1(给本机发送消息)接收消息列表框,用于显示对方的消息记录发送消息编辑框消息记录列表框,用于记录聊天记录(有关代码见上两图)建立连接服务器端server:界面设计与界面有关代码确认连接相关代码接收消息列表框发送并保存记录实验结果及分析运行客户端,建立连接,出现服务器端呼叫,建立连接,互相通信确认连接双方通信:分析:只有先打开客户端,并呼叫服务器,才能正确连接,否则连接出错结论UDP不面向连接,通信协议较简单。
基于UDP协议的聊天工具的方案设计书(最终版)
研究生课程论文课程名称面向对象程序设计VC++授课学期 2012 学年至 2013 学年第 1 学期学院电子工程学院专业电子与通信工程学号 2012011597姓名潘睿哲任课教师黄守麟李廷会交稿日期 2013.4.10成绩阅读教师签名日期广西师范大学研究生学院制基于UDP协议的聊天工具的设计第一章 需求分析1.1 功能需求① 用户之间能够通过输入IP 地址建立连接② 用户能够输入所需发送的信息,并能够在界面上发看到输入的信息 ③ 用户之间可以相互通信1.2 应用平台需求安装有VS2008的操作系统,能够正常运行EXE 文件。
1.3 界面的设计需求本程序利用UDP 协议来进行通信,因此可以简单地将发送端和接收端集成在同一个对话框界面上,并可以通过利用多线程技术以保证接受信息功能的顺畅。
1.4 简单流程图图1-1第二章 概要设计2.1 程序总体结构图发送端 接收端图2-12.2 发送端流程图2-22.3 接收端流程图2-3第三章详细设计3.1 界面设计图3-1说明:界面由一个对话框,两个编辑框,一个按钮和一个IP地址编辑框组成。
其中接收数据栏中的编辑框可以显示发送的信息和接收到的信息,发送数据栏中编辑框则可以编辑发送信息,按回车键后即可发送信息。
IP地址栏中可以输入需要连接的主机的IP地址。
为了美观和方便,在添加按钮后,选中按钮控件的DEFAULT和VISIALBE属性,将其设定为不可见,并通过回车能够实现按钮功能。
3.2 多线程由于该聊天工具是将利用UDP协议实现聊天功能,并将发送端和接收端(某种意义上也可以算是服务器和客户端)集成在一起,为了将发送功能和接受功能同时实现,需要用到多线程技术。
因为在接收端接收数据时,如果数据没有来到,recvfrom函数会阻塞,从而导致程序暂停运行。
所以,将接收数据的操作放置在一个单独的线程中完成。
并给这个线程函数传递两个参数,一个是已创建的套接字,一个是对话框空间的句柄,这样,在该函数中,当接到数据后,可以将该数据传回给对话框,经过处理后显示在接受编辑框控件上。
Java UDP网络通信案例-模拟微信聊天功能
模拟微信聊天【案例介绍】1.案例描述在如今,微信聊天已经人们生活中必不可少的重要组成部分,人们的交流很多都是通过微信来进行的。
本案例要求:将多线程与UDP通信相关知识结合,模拟实现微信聊天小程序。
通过监听指定的端口号、目标IP地址和目标端口号,实现消息的发送和接收功能,并显示聊天的内容。
2.运行结果运行结果【案例目标】●学会分析“模拟微信聊天”任务的实现思路。
●根据思路独立完成“模拟微信聊天”任务的源代码编写、编译及运行。
●掌握网络通信中UDP协议的编程原理。
●掌握UDP网络通信DatagramPacket和DatagramSocket的使用。
【案例分析】(1)第一要知道用什么技术实现,通过上述任务描述可知此任务是使用多线程与UDP通信相关知识实现的。
要实现图中的聊天窗口界面。
首先需要定义一个实现微信聊天功能的类,类中需要定义访问微信聊天的输出语句,从而获取输入的发送端端口号、接收端端口号以及实现发送和接收功能的方法。
(2)实现发送数据的功能。
该功能通过一个实现了Runnable接口的类实现,类中需要定义获取发送数据的端口号,并在实现run()的方法中,编写发送数据的方法。
(3)实现接收数据的功能。
该功能通过一个实现了Runnable接口的类实现,类中需要定义获取接收数据的端口号,并在实现run()的方法中,编写显示接收到的数据的方法。
(4)创建完所有的类与方法后,运行两次程序,同时开启两个窗口来实现聊天功能。
【案例实现】(1)创建微信聊天程序,开启两个聊天窗口,需要创建两个聊天程序。
两个聊天程序代码分别如下所示。
Room.java1 package chapter0901;2 import java.util.Scanner;3 public class Room {4 public static void main(String[] args) {5 System.out.println("微信聊天欢迎您!");6 Scanner sc = new Scanner(System.in);7 System.out.print("请输入您的微信号登录:");8 int sendPort = sc.nextInt();9 System.out.print("请输入您要发送消息的微信号:");10 int receivePort = sc.nextInt();11 System.out.println("微信聊天系统启动!!");12 //发送操作13 new Thread(new SendTask(sendPort), "发送端任务").start();14 //接收操作15 new Thread(new ReceiveTask(receivePort), "接收端任务").start();16 }17 }上述代码中,第12行代码用多线程实现发送端口号以及实现发送端功能的方法。
UDP的Java聊天程序
究,先看代码片断1:
private DatagramPacket recvPacket; private DamgramPacket sendPacket; private InetAddress IP=null;
,,用来接收的数据报 fl用来发送的数据报 ,,得到主机的IP地址
private final int myPon=9000;
SOFTWARE DEVELOPMENT AND DESIGN
软件开发与设计
UDP的Java聊天程序
蔡毓 (中山市技师学院计算机应用系,中山528403)
摘要:UDP是OSI参考模型中一种无连接的传输层协议,它提供了简单不可靠的信息传送服务。由于UDP比较 简单,UDP头包含很少的字节,所以它在速度方面有很大优势。很多常用的即时通软件,如QQ程序,都会使用 UDP实现很多基本功能。Java语言是当今流行的网络编程语言,它的API封装了UDP编程的类.用来实现UDP聊 天程序很容易。 关键词:UDP;Java;聊天程序
recvPacket.getLength 0); jtaReceive.append(str+” (对方口:”+rPA2V—
Packet.getAddress()+”对方端El:”+recvPacket.getPort ()+”)、n”);
) ) catch(Exception e) {
jtaReceive.append(e.toString 0+”、Il”); } ) 以上代码中,run函数定义在主界面类FrameMain中,它
图1两台主机运行聊天程序的运行结果 由此可见,用Java语言实现简单的UDP聊天程序是相当 容易的,核心的收发数据报功能只要借助DatagramSocket和 DatagramPacket两个类就可以完成,如果再把其他功能完善一 下,就可以编写出更有实际用途的网络聊天程序。
课程设计报告-基于udp协议的网络聊天程序设计
《计算机网络编程》综合程序设计项目基于UDP协议的网络聊天程序设计院(系、部):信息工程学院姓名:班级:指导教师签名:2011年 4 月 16 日·北京目录1 需求分析 (2)1.1 课程设计目的 (2)1.2 课程设计内容 (2)1.3 课程设计要求 (2)2 概要设计 (2)2.1 原理概述 (2)2.2功能模块调用流程设计 (3)3 详细设计 (4)3.1 流程图 (4)3.2 运行效果图 (5)3.3 主要源代码 (12)4 项目分析与总结 (17)4.1 遇到的问题和解决方法 (17)4.2 心得体会 (18)1、需求分析1.1课程设计目的开发一个专用于实现两台计算机之间即时通讯的软件,以方便两台计算机之间信息的交流。
,在连接并通信时,尤其是近程的即时通讯,彻底的脱离了远程的服务器,避免了和远程服务器连接时过多的浪费网络资源。
并且避免了服务器忙或与服务器无法连接时,浪费过多时间用于和服务器建立连接!因此,这个软件是极具适应性和实用性的即时通讯软件!本次课程设计的目的是学习基于UDP协议实现网络聊天程序,已达到学会面向无连接方式的程序设计方法,并理解网络编程中面向无连接的概念。
1.2课程设计的内容用户数据报(UDP)是一个无连接协议,使用这种协议时,并不需要在两台计算机之间建立固定的连接,也就是说,通信双方没有服务器和客户机之分,它们之间进行的是对等通信,所以它的优势很明显,是现代通信不可或缺的一部分。
所以,利用它的优势设计一个可以实现私聊和群聊的软件,实现两台计算机间的即时通讯。
1.3 课程设计要求基于UDP协议实现一对一的聊天和一对多的聊天,提供友好的用户界面,便于用户进行操作。
根据目前使用聊天程序的用户需求显示,用户对于聊天程序主要有以下几点要求:(1)聊天功能:可以实现实时接收和发送文字信息,并能支持公聊和私聊的方式。
(2)用户功能:可以查看对方的开放信息,以及发送方的IP。
JAVA实现UDP组播聊天程序
JAVA实现UDP组播聊天程序分类: Java⼀、实验环境编程语⾔:Java1.5(运⾏在JVM(Java Virsual Machine))开发⼯具:eclipce3.2测试环境:局域⽹⼆、实验⽬的社会已经进⼊信息时代,⽹络技术在飞速发展.⼤量应⽤都依赖于从⼀个主机向多个主机或者从多个主机向多个主机发送同⼀信息的能⼒,在Internet上分布的数⽬可能达数⼗万台,这些都需要更⾼的带宽,并且⼤⼤超出了单播的能⼒.⼀种能最⼤限度地利⽤现有带宽的重要技术是IP组播.三、组播聊天程序的实现:/*** 该程序实现了简单组播聊天功能;* 步骤:* 1、利⽤包中的MulticastSocket⽣成对象s;* 2、设置组播地址group=InetAddress.getByName("228.9.6.8");* 3、加⼊组播s.joinGroup(group);* 4、将要发送的所有信息封装成⼀个数据报data=DatagramPacket的⼀个实例;* 5、数据报的头部放⼊聊天⼈的别名name;* 6、发送处理好的数据包:s.send(data);* 7、创建⼀个接受数据报的队列recv:DatagramPacket(buf, buf.length),队列⼤⼩为100字节;* 8、创建⼀个监听线程,线程中执⾏数据包的接受功能:s.receive(recv);* 9、聊天记录可以⼿动保存⾄”Note.txt”⽂件中;* 作者:蓝蔡*/import .*;import java.awt.event.*;import java.awt.*;import java.io.*;import javax.swing.*;public class MutilCast {public static void main(String[] args){MulticastSocket s = null;InetAddress group = null;JPanel northPanel =new JPanel();JPanel southPanel =new JPanel();JPanel namePanel =new JPanel(new FlowLayout());JLabel sendLabel =new JLabel("发送内容:");JLabel nameChangeLabel =new JLabel("给⾃⼰起个名字:"); final JTextField nameSpace =new JTextField(20);final JTextArea messageArea =new JTextArea("",20,20);final JTextField sendField =new JTextField(30);JScrollPane message =new JScrollPane(messageArea); JButton sendButton =new JButton("发送");JButton saveButton =new JButton("保存记录");JButton clearUpButton =new JButton("清空⾯板");Box centerBox =Box.createVerticalBox();namePanel.add(nameChangeLabel);namePanel.add(nameSpace);centerBox.add(namePanel);centerBox.add(message);//实现组播数据传送的配置信息try {group = InetAddress.getByName("228.9.6.8");} catch (UnknownHostException e1) {System.out.println("组播地址绑定失败");}try {s = new MulticastSocket(6789);} catch (IOException e1) {System.out.println("组播地址创建失败");}try {s.joinGroup(group);} catch (IOException e1) {System.out.println("组播地址加⼊失败");}//end实现组播数据传送的配置信息//“发送”按钮实现信息功能的发送部分class SendMsg implements ActionListener{String msg=null;MulticastSocket s=null;InetAddress group = null;public SendMsg(MulticastSocket s,InetAddress group){this.s=s;this.group=group;}public void actionPerformed(ActionEvent e){try{//如果名字为空给出提⽰信息if(nameSpace.getText().isEmpty())new JOptionPane().showMessageDialog(null, "请⼀定要取别名!"); else{//如果名字不为空则把名字添加到数据报头msg=(nameSpace.getText()+"说:"+sendField.getText()); DatagramPacket data=new DatagramPacket(msg.getBytes(),msg.getBytes().length,group, 6789);s.send(data);}}catch (IOException e1) {System.out.println("发送失败");}}}//实现数据报的接受线程class recevMsg extends Thread{MulticastSocket s=null;public recevMsg(MulticastSocket s){this.s=s;};public void run(){byte[] buf = new byte[100];DatagramPacket recv = new DatagramPacket(buf, buf.length);try{while(true){s.receive(recv);String str=new String(recv.getData());String line =System.getProperty("line.separator");messageArea.append(str);messageArea.append(line);}}catch (IOException e1){System.out.println("接受失败");}}}//聊天记录的保存保存在当前位置下的"Note.txt"⽂件中class SaveMsg implements ActionListener{String msg=null;String line =System.getProperty("line.separator");public void actionPerformed(ActionEvent e){try{msg=messageArea.getText();FileOutputStream Note=new FileOutputStream("Note.txt"); messageArea.append("记录已经保存在Note.txt");Note.write(msg.getBytes());messageArea.append(line);Note.close();}catch (IOException e1) {System.out.println("发送失败");}}}//清除⾯板上的聊天记录class ClearMsg implements ActionListener{public void actionPerformed(ActionEvent e){try{messageArea.setText("");}catch (Exception e1) {System.out.println("清空失败");}}}JFrame mutilCastFrame=new JFrame("组播聊天⼯具");northPanel.add(sendLabel);northPanel.add(sendField);northPanel.add(sendButton);southPanel.add(saveButton);southPanel.add(clearUpButton);mutilCastFrame.getContentPane().add(northPanel,"North");mutilCastFrame.getContentPane().add(southPanel,"South");mutilCastFrame.getContentPane().add(centerBox,"Center"); mutilCastFrame.setDefaultCloseOperation(mutilCastFrame.EXIT_ON_CLOSE); sendButton.addActionListener(new SendMsg(s,group));saveButton.addActionListener(new SaveMsg());clearUpButton.addActionListener(new ClearMsg());mutilCastFrame.setSize(500, 500);mutilCastFrame.setLocation(200, 200);mutilCastFrame.show();recevMsg r=new recevMsg(s);r.start();}}。
java编写聊天程序课程设计
java编写聊天程序课程设计一、课程目标知识目标:1. 学生能理解网络编程的基本概念,掌握TCP/IP协议和套接字编程的基础知识;2. 学生能运用Java语言编写简单的聊天程序,实现客户端与服务器之间的文字通信;3. 学生了解多线程编程在聊天程序中的应用,并能实现简单的多客户端聊天功能。
技能目标:1. 学生掌握使用Java语言进行网络编程的基本方法,具备编写简单聊天程序的能力;2. 学生能够运用所学知识,解决实际编程过程中遇到的问题,如异常处理、线程同步等;3. 学生具备调试和优化程序的能力,提高聊天程序的稳定性和性能。
情感态度价值观目标:1. 学生通过学习Java聊天程序的开发,培养对编程的兴趣和热情,提高主动学习的意识;2. 学生在团队协作中,学会沟通与交流,增强合作意识,培养解决问题的能力;3. 学生认识到编程在现实生活中的应用价值,激发对信息技术的热爱,为未来的学习和发展奠定基础。
课程性质:本课程为实践性较强的课程,以项目为导向,结合课本知识,让学生在实际操作中掌握Java网络编程技术。
学生特点:学生具备一定的Java基础,对网络编程有一定了解,但实践经验不足。
教学要求:教师需结合课本内容,注重实践操作,引导学生掌握Java网络编程的核心技术,培养解决实际问题的能力。
在教学过程中,关注学生的个体差异,给予个性化指导,确保每位学生都能达到课程目标。
通过课程学习,使学生能够独立完成一个简单的Java聊天程序。
二、教学内容1. 网络编程基础- TCP/IP协议原理及其应用- 套接字编程概念及分类- 网络字节序与主机字节序转换2. Java网络编程- Java Socket编程基础- 客户端与服务器的创建与连接- 字符串传输与编码问题3. 多线程编程- 线程的创建与运行- 线程同步与通信- 多线程服务器的设计与实现4. 聊天程序设计与实现- 客户端界面设计- 服务器端处理多客户端连接- 文字消息的发送与接收5. 程序调试与优化- 异常处理与程序健壮性- 性能分析与优化- 代码规范与重构教学内容安排与进度:第一周:网络编程基础,学习TCP/IP协议及套接字编程;第二周:Java网络编程,实现简单的Socket通信;第三周:多线程编程,掌握线程的创建与同步;第四周:聊天程序设计与实现,完成客户端与服务器端功能;第五周:程序调试与优化,提高聊天程序的稳定性和性能。
网络协议课程设计基于UDP的多人聊天系统源代码
基于UDP的多人聊天系统只需把两个客户段代码与一个服务器代码导入就可以了,记得要把服务器ip:192.168.1.77(也可以自己在服务器程序中改一下),每个客户端需要设置一下ip,比如A客户端:192.168.1.78,B客户端:192.168.1.88,A客户端向B客户端通讯时,“请输入对方ip”,这项改为192.168.1.88,就可以了。
客户端源代码程序:ChatFram.javapackage ChatFrame_01;import .*;import java.io.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import ng.*;import java.awt.color.*;import javax.swing.JOptionPane;public class ChatFrame extends JFrame { JPanel contentPane;JLabel label1 = new JLabel();// 发送消息JLabel label2 = new JLabel();// 输入ipLabel label3 = new Label();// 输入端口标签Label label4 = new Label();// 输出端口标签JTextField textField1 = new JTextField();// 发送消息JTextField textField2 = new JTextField();// 输入ipJTextField textField3 = new JTextField();// 获得输入端口JTextField textField4 = new JTextField();// 获得输出端口JButton button1 = new JButton("发送");// 发送消息TextArea textArea1 = new TextArea();JOptionPane jopane = new JOptionPane();DatagramPacket sendpacket, receivepacket;// 声明发送和接收数据包DatagramSocket sendsocket, receivesocket;// 声明发送和接收DatagramSocketpublic ChatFrame() {enableEvents(AWTEvent.WINDOW_EVENT_MASK);try {toInit();} catch (Exception e) {e.printStackTrace();}}private void toInit() throws Exception { contentPane = (JPanel) this.getContentPane();label1.setText("发送信息:");label1.setBounds(new Rectangle(13, 100, 60, 21));contentPane.setLayout(null);contentPane.setBackground(Color.pink);this.setSize(new Dimension(363, 502));this.setTitle("多人聊天室");label2.setText("输入对方IP地址:");label2.setBounds(new Rectangle(12, 19, 109, 23));label3.setText("输入端口:");label3.setBounds(new Rectangle(12, 58, 55, 22));label4.setText("输出端口:");label4.setBounds(new Rectangle(180, 58, 55, 22));textField3.setText("3000");textField4.setText("3001");button1.setBounds(new Rectangle(280, 100, 59, 21));button1.addActionListener(newjava.awt.event.ActionListener() {public void actionPerformed(ActionEvent e) {button1_actionPerformed(e);}});textField1.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_ENTER) {String str = textField2.getText();String str1=textField1.getText();if (pareTo("") !=0&&!"".equals(str1)) {try {textArea1.append("\nto " + textField2.getText()+ ":" + "3000" + " say: "+ textField1.getText());String s = textField1.getText();byte data[] =s.getBytes("UTF-8");sendpacket = new DatagramPacket(data,data.length,InetAddress.getByName("192.168.1.77"),6666);sendsocket.send(sendpacket);} catch (IOException exc) {exc.printStackTrace();}textField1.setText("");}}}});textField4.setBounds(new Rectangle(240, 58, 90, 22));textField3.setBounds(new Rectangle(70, 58, 90,textField2.setBounds(new Rectangle(123, 20, 120, 19));textField1.setBounds(new Rectangle(76, 100, 190, 19));textArea1.setBounds(new Rectangle(11, 140, 333, 315));textArea1.setEditable(false);textArea1.setBackground(Color.white);contentPane.add(label4, null);contentPane.add(label3, null);contentPane.add(label2, null);contentPane.add(label1, null);contentPane.add(textField1, null);contentPane.add(textField2, null);contentPane.add(textField3, null);contentPane.add(textField4, null);contentPane.add(textArea1, null);contentPane.add(button1, null);this.setVisible(true);bind();protected void processWindowEvent(WindowEvent e) {super.processWindowEvent(e);if(e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0);}}public void waitforpackets() {// 检测并接受对方发来的消息while (true) {try {byte[] array = new byte[100];receivepacket= new DatagramPacket(array, array.length);receivesocket.receive(receivepacket);// 接收textArea1.append("\nfrom " + receivepacket.getAddress() + ":"+ receivepacket.getPort() + "get:");String received = newString(receivepacket.getData(), 0,receivepacket.getLength(),"UTF-8");textArea1.append(received);} catch (IOException se) {se.printStackTrace();}}}void bind() {// 和对方建立连try {sendsocket = new DatagramSocket(3000);receivesocket = new DatagramSocket(3333);} catch (Exception e) {}}void button1_actionPerformed(ActionEvent e) {// 发送消息到对方String str = textField2.getText();String str1=textField1.getText();if (pareTo("") != 0&&!"".equals(str1)) {try {textArea1.append("\nto " +textField2.getText() + ":" + "3000"+ " say: " + textField1.getText());String s =textField2.getText()+"|"+textField1.getText();byte data[] = s.getBytes("UTF-8");sendpacket = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.1.77"), 6666);sendsocket.send(sendpacket);} catch (IOException exc) {exc.printStackTrace();}textField1.setText("");}}}ChatApp.javapackage ChatFrame_01;import java.io.*;import javax.swing.UIManager;import java.awt.*;public class ChatApp {boolean packFrame = false;ChatApp() {ChatFrame frame = new ChatFrame();if (packFrame) {frame.pack();} else {frame.validate();}// 放置窗体在屏幕中央Dimension screenSize =Toolkit.getDefaultToolkit().getScreenSize();Dimension frameSize = frame.getSize();if (frameSize.height > screenSize.height) { frameSize.height = screenSize.height;}if (frameSize.width > screenSize.width) { frameSize.width = screenSize.width;}frame.setLocation((screenSize.width - frameSize.width) / 2,(screenSize.height - frameSize.height) / 2);frame.setVisible(true);frame.waitforpackets();}public static void main(String[] args) { new ChatApp();}}服务器端:Server.javapackage ChatFrame_01;import .DatagramPacket; import .DatagramSocket; import .InetAddress; import .Socket;import java.util.*;public class Server {List ips = new ArrayList();DatagramSocket socket;DatagramPacket packet;DatagramSocket ssocket;DatagramPacket spacket;public Server() throws Exception {socket = new DatagramSocket(6666);ssocket=new DatagramSocket(8888);}public void listen() throws Exception {byte[] array = new byte[100];packet = new DatagramPacket(array, array.length);socket.receive(packet);byte[] data=packet.getData();String received = new String(data,0,data.length,"UTF-8");System.out.println(received);String[] ss = received.split("\\|");String ip = ss[0];byte[] dt=ss[1].getBytes("UTF-8");spacket=newDatagramPacket(dt,dt.length,InetAddress.getByName(ip),3333) ;ssocket.send(spacket);}public static void main(String[] args) throws Exception { Server s = new Server();while (true) {s.listen();}}}。
计算机网络课程设计UDP聊天室代码
《计算网络》UDP聊天室学院计算机学院专业软件工程年级班别 2011级1班学号学生姓名指导教师许青林成绩.实验目的UDP是无链接的通信方式,通信开销小,利用UDP实现聊天系统。
通过实验掌握UDP的工作原理及应用方法。
.实验要求1、采用多线程技术,多用户同时在线。
2、实现群聊功能,一个人发消息多人可收到。
3、用JAVA实现UDP开发模型如下:.系统结构聊天系统分为服务器端和客户端。
服务器程序作为一个中转站,所有客户端都只与服务器进行通信。
如图:.程序设计服务器端:服务器与客户间通过套接口Socket连接。
在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类.Socket.,使得编写网络应用程序相对容易.服务器采用多线程以满足多用户的请求,服务端主要用到InetAddress, DatagramSocket, DatagramPacket三个类; InetAddress用于描述和包装一个Internet IP地址;DatagramSocket用于接收和发送UDP的Socket实例;DatagramPacket用于处理报文,它将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。
客户端:客户端是一个Java Application程序,客户通过Socket 建立与服务器的连接。
主要用到InetAddress, DatagramSocket, DatagramPacket三个类三个类。
界面设计:客户端UI设计:Chat Boxes有五个输入框,包括本机端口,服务器端口,本机IP地址,服务器IP地址输入以及消息输入框,依次为Personal port,Server port,Nickname和Server IP以及send按钮左旁的输入框,且在输入的消息中自动获取本机时间,然后和发送消息一起打包发到服务器,服务器接收后发到客户端。
服务器IP不为空。
Server UI设计:Server chat boxes有两个输入框,分别是服务器端口(Server port)和客户端端口(Personal port)和一个连接按钮(Connect);.代码:(按照下面的格式创建相应的java文件,将代码粘贴复制即可)1.Sendmessage,javapackage chatboxes;import java.io.Serializable;import .InetAddress;public class Sendmessage implements Serializable{/****/private static final long serialVersionUID = 1L;private InetAddress addr;private InetAddress destaddr;private String name;private String msg;public Sendmessage(InetAddress addr, InetAddress destaddr, String name, String msg) {this.addr = addr;this.destaddr = destaddr; = name;this.msg = msg;}public InetAddress getAddr() { return addr;}public InetAddress getDestaddr() { return destaddr;}public String getName() {return name;}public String getMsg() {return msg;}}2.Serverchar.javapackage chatboxes;import java.awt.BorderLayout;import java.awt.Container;import java.awt.FlowLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedInputStream;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .MulticastSocket;import .SocketException;import .UnknownHostException;import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;import java.util.List;import java.util.ListIterator;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class Serverchat implements Runnable, ActionListener{private List<InetAddress> addList;JTextArea showArea;JLabel lbl1, lbl2;JTextField sendPortText, receivePortText; JFrame mainJframe;JButton startBtn;JScrollPane JSPane;JPanel pane1, pane2;Container con;Thread thread = null;DatagramPacket sendPack, receivePack; DatagramSocket sendSocket, receiveSocket;private int sendPort, receivePort;private byte inBuf[], outBuf[];private MulticastSocket multiSocket = null;public Serverchat() throws UnknownHostException { addList = new ArrayList<InetAddress>();mainJframe = new JFrame("Server chat boxes");con = mainJframe.getContentPane();showArea = new JTextArea();showArea.setEditable(false);showArea.setLineWrap(true);lbl1 = new JLabel("Server port:");lbl2 = new JLabel("Personal port:"); sendPortText = new JTextField(); sendPortText.setColumns(5); receivePortText = new JTextField(); receivePortText.setColumns(5); startBtn = new JButton("Connect"); startBtn.addActionListener(this); pane1 = new JPanel();pane1.setLayout(new GridLayout(3,2)); pane1.add(lbl1);pane1.add(receivePortText);pane1.add(lbl2);pane1.add(sendPortText);pane1.add(startBtn);JSPane = new JScrollPane(showArea); pane2 = new JPanel();pane2.setLayout(new FlowLayout()); con.add(pane1, BorderLayout.NORTH); con.add(JSPane, BorderLayout.CENTER); con.add(pane2, BorderLayout.SOUTH); mainJframe.setSize(600,600);mainJframe.setVisible(true);mainJframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);showArea.append("====================================== ===============================" +"==============\n");showArea.append("====================================== ===============================" +"==============\n");}public static void main(String[] args) {try {new Serverchat();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void run() {Sendmessage msg;while (true) {try {receiveSocket.receive(receivePack);ByteArrayInputStream byteStream = new ByteArrayInputStream(receivePack.getData());ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(byteStream));Object o = is.readObject();msg = (Sendmessage) o;is.close();InetAddress test = receivePack.getAddress();if(!addList.contains(test))addList.add(test);for(InetAddress iaddr : addList){sendPack = newDatagramPacket(receivePack.getData(), receivePack.getData().length, iaddr,sendPort);sendSocket.send(sendPack);}showArea.append(msg.getAddr() + ":\n" + msg.getMsg() + "\n");} catch (IOException el) {showArea.append(el.getMessage()+"\n");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}@Overridepublic void actionPerformed(ActionEvent e) { try {if (e.getSource() == startBtn) {if(sendPortText.getText().equals("")){sendPort = 10087;}else{sendPort =Integer.parseInt(sendPortText.getText());}if(receivePortText.getText().equals("")){ receivePort = 10086;}else{receivePort =Integer.parseInt(receivePortText.getText());}inBuf = new byte[16384];sendSocket = new DatagramSocket();receivePack = new DatagramPacket(inBuf,inBuf.length);receiveSocket = new DatagramSocket(receivePort);thread = new Thread(this);thread.setPriority(Thread.MIN_PRIORITY);thread.start();startBtn.setEnabled(false);}else {}} catch (SocketException e1) {showArea.append("SystemError"+e1.getMessage()+"\n");} catch (IOException e1) {showArea.append("SystemError"+e1.getMessage()+"\n");}}}3.UIchat.javapackage chatboxes;import java.awt.BorderLayout;import java.awt.Container;import java.awt.FlowLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .SocketException;import .UnknownHostException;import java.text.SimpleDateFormat;import java.util.Date;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class UIchat implements Runnable, ActionListener {JTextArea showArea;JLabel lbl1, lbl2, lbl3, lbl4;JTextField msgText, sendPortText, receivePortText, IPAddressText, name;JFrame mainJframe;JButton sendBtn, startBtn;JScrollPane JSPane;JPanel pane1, pane2;Container con;Thread thread = null;DatagramPacket sendPack, receivePack; DatagramSocket sendSocket, receiveSocket; private String username;private InetAddress sendIP;private int sendPort, receivePort;private byte inBuf[], outBuf[];public UIchat() {mainJframe = new JFrame("Chat Boxes");con = mainJframe.getContentPane();showArea = new JTextArea();showArea.setEditable(false);showArea.setLineWrap(true);lbl1 = new JLabel("Personal port:");lbl2 = new JLabel("Server port:");lbl3 = new JLabel("Server IP:");lbl4 = new JLabel("Nickname:");sendPortText = new JTextField(); sendPortText.setColumns(15); receivePortText = new JTextField(); receivePortText.setColumns(15);name = new JTextField();name.setColumns(15);IPAddressText = new JTextField(); IPAddressText.setColumns(15);startBtn = new JButton("Connect"); startBtn.addActionListener(this);pane1 = new JPanel();pane1.setLayout(new GridLayout(5,2)); pane1.add(lbl1);pane1.add(receivePortText);pane1.add(lbl2);pane1.add(sendPortText);pane1.add(lbl3);pane1.add(IPAddressText);pane1.add(lbl4);pane1.add(name);pane1.add(startBtn);JSPane = new JScrollPane(showArea);msgText = new JTextField();msgText.setColumns(40);msgText.setEditable(false);msgText.addActionListener(this);sendBtn = new JButton("Send");sendBtn.setEnabled(false);sendBtn.addActionListener(this);pane2 = new JPanel();pane2.setLayout(new FlowLayout());pane2.add(msgText);pane2.add(sendBtn);con.add(pane1, BorderLayout.NORTH);con.add(JSPane, BorderLayout.CENTER);con.add(pane2, BorderLayout.SOUTH);mainJframe.setSize(700, 600);mainJframe.setVisible(true);mainJframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);showArea.append("=====================================================================" +"============================\n");showArea.append("Please Keep The Ports Of The Chat Boxes Up With The PortsOf Server chat boxes\n"+"*********The Nickname Is The IP Of Your Personal ComputerIP*********\n"+" **********The Server IP Should Not BeNull!**********\n");showArea.append("=====================================================================" +"============================\n");}public static void main(String[] args) {new UIchat();}@Overridepublic void actionPerformed(ActionEvent e) {try {if (e.getSource() == startBtn) {inBuf = new byte[16384];if(sendPortText.getText().equals("")){sendPort = 10086;}else{sendPort =Integer.parseInt(sendPortText.getText());}if(receivePortText.getText().equals("")){ receivePort = 10087;}else{receivePort =Integer.parseInt(receivePortText.getText());}if(name.getText().equals("")){username =InetAddress.getLocalHost().toString();}else{username = name.getText();}sendIP =InetAddress.getByName(IPAddressText.getText());sendSocket = new DatagramSocket();receivePack = new DatagramPacket(inBuf,inBuf.length);receiveSocket = new DatagramSocket(receivePort);thread = new Thread(this);thread.setPriority(Thread.MIN_PRIORITY);thread.start();startBtn.setEnabled(false);sendBtn.setEnabled(true);msgText.setEditable(true);}else {String msg1 = msgText.getText();SimpleDateFormat format=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");String msg=format.format(new Date())+" : "+msg1;Sendmessage message = newSendmessage(InetAddress.getLocalHost(),sendIP,username,m sg);ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = null;oos = new ObjectOutputStream(baos);oos.writeObject(message);oos.flush();outBuf = baos.toByteArray();sendPack = new DatagramPacket(outBuf,outBuf.length, sendIP,sendPort);sendSocket.send(sendPack);msgText.setText(null);}} catch (UnknownHostException e1) {showArea.append("SystemError"+e1.getMessage()+"\n");} catch (SocketException e1) {showArea.append("SystemError"+e1.getMessage()+"\n");showArea.append("Errors:Network congestion,Please open the second client to test machine\n");} catch (IOException e1) {showArea.append("SystemError"+e1.getMessage()+"\n");}}public void run() {Sendmessage msg;while (true) {try {receiveSocket.receive(receivePack);ByteArrayInputStream byteStream = new ByteArrayInputStream(receivePack.getData());ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(byteStream));Object o = is.readObject();msg = (Sendmessage) o;is.close();showArea.append(msg.getName() + ":\n" + msg.getMsg() + "\n");} catch (IOException el) {showArea.append("SystemError"+el.getMessage()+"\n");} catch (ClassNotFoundException e) {showArea.append("SystemError"+e.getMessage()+"\n");}}}}.运行结果启动服务器启动客户端,连接服务器: 服务器IP为192.168.0.107启动后并发送消息:本机(zhizhou)发送到另外的客户端(lin):服务器端显示:6.心得通过这次课程设计让我进一步掌握了网络和Java的结合,实现了网络编程。
基于UDP协议的聊天工具的设计研究生课程论文
研究生课程论文课程名称面向对象程序设计VC++学院电子工程学院专业电子与通信工程基于UDP 协议的聊天工具的设计第一章 需求分析1.1 功能需求① 用户之间能够通过输入IP 地址建立连接② 用户能够输入所需发送的信息,并能够在界面上发看到输入的信息③ 用户之间可以相互通信1.2 应用平台需求安装有VS2008的操作系统,能够正常运行EXE 文件。
1.3 界面的设计需求本程序利用UDP 协议来进行通信,因此可以简单地将发送端和接收端集成在同一个对话框界面上,并可以通过利用多线程技术以保证接受信息功能的顺畅。
1.4 简单流程图图1-1第二章 概要设计2.1 程序总体结构图发送端 接收端图2-12.2 发送端流程图2-22.3 接收端流程图2-3第三章详细设计3.1 界面设计图3-1说明:界面由一个对话框,两个编辑框,一个按钮和一个IP地址编辑框组成。
其中接收数据栏中的编辑框可以显示发送的信息和接收到的信息,发送数据栏中编辑框则可以编辑发送信息,按回车键后即可发送信息。
IP地址栏中可以输入需要连接的主机的IP地址。
为了美观和方便,在添加按钮后,选中按钮控件的DEFAULT和VISIALBE属性,将其设定为不可见,并通过回车能够实现按钮功能。
3.2 多线程由于该聊天工具是将利用UDP协议实现聊天功能,并将发送端和接收端(某种意义上也可以算是服务器和客户端)集成在一起,为了将发送功能和接受功能同时实现,需要用到多线程技术。
因为在接收端接收数据时,如果数据没有来到,recvfrom函数会阻塞,从而导致程序暂停运行。
所以,将接收数据的操作放置在一个单独的线程中完成。
并给这个线程函数传递两个参数,一个是已创建的套接字,一个是对话框空间的句柄,这样,在该函数中,当接到数据后,可以将该数据传回给对话框,经过处理后显示在接受编辑框控件上。
传递的结构体的代码如下:struct RECVPARAM{SOCKET sock ; //已创建的套接字HWND hwnd; //对话框句柄};编写接受线程函数,并在一定情况下启动线程,具体代码请参阅附录。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
湖南工业大学课程设计资料袋计算机与通信学院学院(系、部)2013 ~ 2014 学年第 1 学期课程名称网络协议分析指导教师李建设职称副教授学生姓名专业班级网络工程学号题目基于UDP协议网上聊天程序成绩起止日期2013 年11 月25 日~2013 年12 月13 日目录清单56课程设计任务书2013 —2014学年第1 学期学院(系、部)计算机与通信学院专业网络工程班级102课程名称:网络工程学生姓名:设计题目:基于UDP协议网上聊天程序指导教师:李建设完成期限:自2013 年11 月25 日至2013 年12 月13 日共 3 周容及任务一、设计内容实现一个基于UDP协议的简单的聊天程序,包括服务器和客户端。
1.支持多人聊天。
2.客户端具有图形化用户界面。
二、设计任务课程设计说明书(纸质+电子版),内容包括:设计内容、系统分析(包括可行性分析、需求分析等)及功能分析;系统设计(要求画出系统整体功能框图、流程图、并给出相应地关键的代码且对所使用的主要数据结构进行说明等。
)、设计总结(评价/遇到的问题/体会/建议等)、使用说明等。
三、设计要求1.按功能要求开发系统,能正确运行。
程序代码书写规范,有充足的注释。
2.课程设计所使用的编程语言任选,但建议使用C或C++;3.绿色软件:程序运行不需安装,避免写系统和注册表;进度安排起止日期工作内容2013-11-25~2013-11-3选题2013-12-1~2013-12-3 系统分析和设计;2013-12-4~2013-12-8 熟悉软件开发工具、编码系统、系统测试2013-12-9~2013-12-13 撰写并提交课程设计说明书(含电子文档)、源程序等。
指导教师(签字):年月日系(教研室)主任(签字):年月日课程设计说明书课程名称:网络协议分析设计题目:基于UDP协议网上聊天程序专业:班级:学生姓名: 学号:指导教师:李建设2013年12 月13 日目录1 课程设计简介 (4)1.1 课程设计的目的 (4)1.2 课程设计内容 (4)2课程设计实现过程 (5)2.1 协议原理 (5)2.2 客户机/服务器模式 (7)2.3 关键技术 (8)2.4 流程图 (10)2.5 系统结构图 (11)2.6 程序调试及界面效果图 (11)2.7 源代码 (15)3设计总结 (22)4参考文献 (23)1 课程设计简介1.1 课程设计的目的开发一个专用于实现两台计算机之间即时通讯的软件,以方便两台或两台以上的计算机之间信息的交流。
,在连接并通信时,尤其是近程的即时通讯,彻底的脱离了远程的服务器,避免了和远程服务器连接时过多的浪费网络资源。
并且避免了服务器忙或与服务器无法连接时,浪费过多时间用于和服务器建立连接!因此,这个软件是极具适应性和实用性的即时通讯软件!本次课程设计的目的是学习基于UDP协议实现网络聊天程序,已达到学会面向无连接方式的程序设计方法,并理解网络编程中面向无连接的概念。
1.2 课程设计内容1.实现一个基于UDP协议的简单的聊天程序,包括服务器和客户端。
2.支持多人聊天。
3.客户端具有图形化用户界面。
2课程设计实现过程2.1 协议原理UDP协议的全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。
在OSI模型中,在第四层——传输层,处于IP协议的上一层。
UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
UDP 用来支持那些需要在计算机之间传输数据的网络应用。
包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。
UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。
UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务的简单不可靠信息传送服务。
UDP 协议基本上是IP协议与上层协议的接口。
UDP协议适用端口分别运行在同一台设备上的多个应用程序。
与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。
根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。
UDP协议的主要作用是将网络数据流量压缩成数据包的形式。
一个典型的数据包就是一个二进制数据的传输单位。
每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
UDP是无连接的,即发送数据之前不需要建立连接(当然发送数据结束时也没有连接可释放)因此减少了开销和发送数据之前的时延。
UDP使用的是尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。
UDP是面向报文的。
发送方的UDP对应程序交下来的报文,在添加首部后就向下交付给IP层。
UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
UDP是定义用来在互连网络环境中提供数据报交换的计算机通信的协议。
此协议默认是IP下层协议。
此协议提供了向另一用户程序发送信息的最简便的协议机制,不需要连接确认和保护复制,所以在软件实现上比较简单,需要的内存空间比起TCP相对较小。
UDP包头由4个域组成,其中每个域各占用2个字节。
(1)源端口号(16位):UDP数据包的发送方使用的端口号。
(2)目标端口号(16位):UDP数据包的接收方使用的端口号。
UDP协议使用端口号为不同的应用保留其各自的数据传输通道。
UDP和rap协议正是采用这一机制,实现对同一时刻内多项应用同时发送和接收数据的支持。
(3)数据报长度(16位)。
数据报的长度是指包括报头和数据部分在内的总的字节数。
理论上,包含报头在内的数据包的最大长度为65535字节。
不过,一些实际应用往往会限制数据包的大小,有时会降低到8192字节。
(4)校验值(16位)。
UDP协议使用包头中的校验值来保证数据的安全。
××××××(正文字体要求为宋体,字号为小四,行间距20磅,每段前空2字符)2.2 客户机/服务器模式由于这次课程设计是实现点到点的可靠连接,所以在此使用UDP连接方式。
在这个连接中,双方分为客户和服务器,他们各自的功能不同。
客户机一方,UDP应用程序功能如下:(1)打开通信信道(申请一套接字),并连接到服务器在主机的保留端口,该端口对应服务器的UDP进程。
(2)向服务器发出请求报文,等待接收应答。
(3)从服务器方收到最终应答结果,或在不再请求时关闭信道并终止客户机进程。
服务器一方,UDP应用程序动作如下:(1)打开通信信道(申请一套接字),通知本地主机在某一保留端口接收客户机请求。
(2)等待客户请求到达指定端口。
(3)接收到请求,启动一新进程处理用户请求,同时释放旧进程以响应新的客户请求,一旦服务完成,关闭新进程与客户的通信链路。
(4)继续等待客户机请求。
(5)如果不想响应客户机请求,关闭服务器进程。
2.3 关键技术Socket又称作套接字,它是使用标准Unix文件描述符(file descriptor)和其它程序通讯的方式。
使用send()和recv()让你更好的控制数据传输。
在Java 网络编程中,socket相当于应用程序的港口码头;在计算机网络中,套接字由ip地址和端口号组成,为进程之间通信提供地址。
两个主机进行通信实际上就是两个主机中的应用进程互相通信,应用进程之间的通信又称为端到端的通信。
为应用进程之间的通信提供运输服务的是运输层的运输协议,运输层需要有两种不同的运输协议,即面向连接的TCP和无连接的UDP。
在Java中,用于实现基于UDP的聊天程序,使用两个重要的类(DatagramSocket类和DatagramPacket类)。
DatagramSocket类表示用来发送和接收数据报包的套接字。
数据报套接字是包投递服务的发送或接收点。
每个在数据报套接字上发送或接收的包都是单独编址和路由的。
从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
在DatagramSocket上总是启用UDP广播发送。
为了接收广播包,应该将DatagramSocket绑定到通配符地址。
在某些实现中,将DatagramSocket绑定到一个更加具体的地址时广播包也可以被接收。
DatagramPacket类表示数据报包。
数据报包用来实现无连接包投递服务。
每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。
从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
不对包投递做出保证。
服务程序工作在服务器的某个端口上,一旦启动服务,它将在这个端口上监听,等待客户程序发来请求,当有客户连接到该端口,accept()方法就返回一个Socket对象,可以用该对象获得一个输入输出流。
服务器的套接字用服务器套接字类(ServerSocket)来建立。
具体实现如下:(1)建立一个服务者,端口为6666。
(2)服务者永远等待,一旦客户送来正确的请求,连接至该端口,accept()方法就返回一个Socket对象。
(3)用返回的Socket对象创建数据输入流类的实例6666。
用返回的Socket 对象创建数据输出流的实例8888。
以上实例in和out是服务者用于从客户接受输入信息和向客户程序发送信息所用。
此外,还需要用方法receive()和printIn()读取或输出一行数据。
(4)在客户端建立Socket对象,并进行异常处理,主机名和端口号与连接的服务器名和提供该服务的服务程序的监听端口必须一致。
建立连接后用Socket 类提供的Datagramsocket()和Datagrampacket()方法取得输入输出流。
在服务器端,获得的输入流是客户端的输出流,而Socket获得的输出流是发向客户端的输入流,在客户端也是这样。
获得socket的输入输出流之后,为了便于读写操作,需要在这两个流对象基础上建立易于操作的数据流Datagramsocket, Datagrampacket。
然后对输入输出流进行读写操作。
在通信结束时关闭socket,以断开连接,释放资源。
先关闭对应的输入输出流,再关闭socket本身。
2.4 流程图服务器端客户端2.5 系统结构图2.6 程序调试及界面效果图2.6.1 调试前的准备安装jdk1.6.0并在计算机的环境变量中配置好java环境。
使用的实验环境是Windows XP,Eclipse 6.0,。
使用3太主机进行通信,一台作为服务器,另外两台作为客户端。