UDP聊天程序设计报告
- 格式:doc
- 大小:111.50 KB
- 文档页数:5
长沙理工大学计算机与通信工程学院《网络协议编程》课程设计报告院系计算机与通信工程学院专业网络工程班级网络1101班学号 201158080110 学生姓名赵思雨指导教师谢晓巍课程成绩完成日期2014年9月24日课程设计成绩评定院系计算机与通信工程专业网络工程班级网络1101班学号 201158080110 学生姓名赵思雨指导教师谢晓巍指导教师对学生在课程设计中的评价指导教师成绩指导教师签字年月日课程设计答辩组对学生在课程设计中的评价答辩组成绩答辩组长签字年月日课程设计综合成绩注:课程设计综合成绩=指导教师成绩×60%+答辩组成绩×40%课程设计任务书计算机与通信工程学院网络工程专业基于UDP网络通信系统的服务端程序设计学生姓名:赵思雨指导老师:谢晓巍摘要随着网络技术的发展及人们生活的需求,网络聊天已越来越受到人们的青睐。
网络聊天已经成为人们工作生活中传递信息、交流感情的重要工具,给人们带来了很大的方便。
本课题是开发一个基于UDP的局域网聊天系统,运用软件工程的设计流程,综合运用数据库编程技术、Windows程序设计技术、网络通讯技术,此网络聊天工具采用客户端/服务器(C/S)模式,客户端采用UDP与服务器连接,客户端与客户端之间通过UDP互相通讯。
服务器端具有服务器端口设置,此聊天工具能实现多人聊天功能,适用于局域网使用的网络聊天工具,其操作简单,灵活性好,运行也比较稳定。
关键词网络通讯;客户端/服务器模型;用户数据报协议;套接字1 引言自进入信息化社会以来,人们的生活发生了翻天覆地的变化,所有这一切的实现都要归功于计算机网络。
自从计算机网络出现以来,网络发展越来越迅速,其重要性更是不可估量。
现在,网络已经进入到我们生活的各个角落,大到网上理财、网上会议、网上战争,小到上网购物、查找资料,网上聊天等,可以说网络把我们的世界变“小”了,即使在天涯海角,我们也可以随时联系。
一个最简单且应用最广泛的例子——网上聊天,就是最好的证明。
实验报告课程计算机网络(双语)(课程设计)实验名称UDP及TCP通信程序的设计与实现专业班级姓名学号2013年 5 月30日目录实验目的和内容ﻩ错误!未定义书签。
实验目的ﻩ错误!未定义书签。
实验内容ﻩ错误!未定义书签。
实验环境ﻩ错误!未定义书签。
程序的逻辑框图ﻩ错误!未定义书签。
UDP通信程序的逻辑框图:ﻩ错误!未定义书签。
TCP通信程序的逻辑框图:ﻩ错误!未定义书签。
程序源代码(数据结构的描述、核心算法)ﻩ错误!未定义书签。
1.TCP通信程序源代码............................................. 错误!未定义书签。
2.TCP通信程序数据结构的描述ﻩ73.TCP通信程序的核心算法ﻩ错误!未定义书签。
4.UDP通信程序源代码.................................................. 错误!未定义书签。
5.UDP通信程序数据结构的描述.................................. 错误!未定义书签。
6.UDP通信程序的核心算法.......................................... 错误!未定义书签。
实验数据、结果分析.................................................................... 错误!未定义书签。
TCP通信程序实验结果分析ﻩ错误!未定义书签。
UDP通信程序实验结果分析......................................... 错误!未定义书签。
总结................................................................................................ 错误!未定义书签。
实验目的和内容实验目的掌握win32平台下,使用winsock API来实现UDP通信程序和TCP通信程序。
c udp聊天程序课程设计一、课程目标知识目标:1. 学生能理解UDP协议的工作原理和特点,掌握UDP编程的基本方法;2. 学生能运用C语言实现简单的UDP聊天程序,了解网络编程中的数据传输和接收过程;3. 学生了解网络通信中IP地址、端口号等基本概念,并掌握其在编程中的应用。
技能目标:1. 学生能够独立编写和调试C语言UDP聊天程序,具备基本的网络编程能力;2. 学生能够分析并解决网络编程过程中遇到的问题,具备问题解决能力;3. 学生能够通过实际操作,提高编程实践能力和团队协作能力。
情感态度价值观目标:1. 学生通过学习UDP聊天程序的制作,培养对网络编程的兴趣和热情;2. 学生在编程实践中,学会克服困难,培养坚持不懈、勇于探索的精神;3. 学生通过团队协作,培养良好的沟通能力和团队合作精神。
分析课程性质、学生特点和教学要求,本课程将目标分解为以下具体学习成果:1. 学生能够掌握UDP协议的基本原理,并能够运用C语言实现简单的网络通信;2. 学生能够独立编写和调试UDP聊天程序,具备基本的网络编程能力;3. 学生能够在课程实践中,培养良好的编程习惯和团队合作精神。
二、教学内容1. UDP协议原理:介绍UDP协议的特点、工作原理及其在网络通信中的应用,关联课本第三章第二节。
2. C语言网络编程基础:回顾C语言的基本语法,重点讲解socket编程、数据类型转换等在网络编程中的应用,关联课本第四章。
3. UDP聊天程序设计:详细讲解UDP聊天程序的设计思路、步骤及关键代码实现,包括以下内容:- 创建UDP套接字;- 绑定IP地址和端口号;- 发送和接收数据;- 关闭套接字。
关联课本第五章第三节。
4. 编程实践:安排学生进行UDP聊天程序的编写和调试,分为以下阶段:- 阶段一:实现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。
udp实验报告UDP实验报告引言:UDP(User Datagram Protocol)是一种无连接的传输协议,它在网络通信中扮演着重要的角色。
本实验旨在通过对UDP协议的实际应用,深入了解其特点和工作原理。
一、UDP的特点UDP与TCP相比,具有以下几个显著特点:1. 无连接:UDP在发送数据之前不需要建立连接,因此传输效率更高。
2. 不可靠:UDP不提供可靠的数据传输保证,数据包可能丢失、顺序错乱或重复。
3. 高效:UDP的头部开销较小,适用于对实时性要求较高的应用场景。
4. 简单:UDP的实现相对简单,占用的系统资源较少。
二、UDP的应用场景UDP广泛应用于以下场景:1. 实时通信:如音频、视频传输、实时游戏等。
由于UDP的低延迟特性,适合于对实时性要求较高的应用。
2. DNS(Domain Name System):域名解析过程中,UDP用于快速传输查询请求和响应。
3. SNMP(Simple Network Management Protocol):网络管理中,UDP用于传输管理信息。
4. TFTP(Trivial File Transfer Protocol):简单文件传输协议,基于UDP实现。
三、实验目的本实验旨在通过编写UDP程序,验证UDP协议的特点和应用场景。
四、实验环境与工具1. 操作系统:Windows 102. 编程语言:Python3. 开发工具:PyCharm4. 网络模拟器:GNS3五、实验步骤1. 设计并实现一个基于UDP的简单聊天程序,包括客户端和服务器端。
2. 在GNS3网络模拟器中配置两台虚拟机,分别作为客户端和服务器端。
3. 在客户端和服务器端分别运行聊天程序,并进行通信测试。
4. 分析测试结果,验证UDP协议的特点。
六、实验结果与分析通过测试,我们得到了以下实验结果:1. UDP传输速度较快:在实时聊天过程中,消息几乎是即时传输的,延迟较低。
2. 数据包丢失现象:由于UDP不提供可靠的传输保证,部分数据包可能会丢失,导致聊天内容不完整。
3.2 类库的设计在本局域网聊天软件中,因为在后台服务器端的用户信息管理平台以及前台的客户端的登录窗口、主界面窗口以及聊天窗口都需要用到UDP协议。
所以本程序中,将UDP 协议封装成了一个控件,主要是为了便于客户端和服务器端的调用,并且将UDP控件和自定义类存储在了Controls文件夹中。
当需要使用到UDP协议的时候,只需要在相应的窗口中加入SockUDP控件,然后设置SockUDP控件的相关的属性即可。
下面对Controls 中的SockUDP控件和其他的类分别进行说明。
(1)SockUDP控件该控件主要是将UDP协议中的IP地址和端口号以及开启或者关闭的状态以控件的形式进行设置,并自定义一个了DataArrival事件,用于对主机的端口号进行监听,以获取远程计算机发送过来的消息。
在自定义控件上制作了.IPEndPoint 类的server属性,来获得对方IP 地址和端口号信息UDPSocket控件中包含CloseSocket()方法分别用于关闭UDP协议端口的监听功能,并在监听关闭的同时关闭用于接收信息的子线程。
Listener()方法用于实现主机端口号的监听功能,主要是将IP地址和端口号以网络端点进行存储,然后创建一个新的端口号,再设置接收缓冲区和发送缓冲区的大小。
此外,还创建了一个线程,主要是用于获取当前接收到的信息,就是将获取的远程信息转换成二进制流。
在线程打开时,将GetUDPData()方法所接收的信息传递给线程的委托。
GetUDPData()方法是在获取远程消息时,将消息转发给UDPSocket控件的DataArrival事件,可以通过该事件将消息发送给远程客户端。
Send()方法用于将主机获取的消息,通过IP地址和端口号发送给远程客户端。
Dispose()函数用以清理正在使用的资源通过以上的方法,便制作完成了一个SockUDP控件。
(2)Publec_Class类该类用于记录服务器端和客户端的基本信息,并通过自定义的方法MyHostIP()获取服务器端的所有IP地址,通过自定义方法Get_Windows()获取Windows目录。
X X X XXX大学专业名称软件工程实验室2号实验楼201室实验课程JAVA高级程序设计实验名称聊天程序设计(客户端、服务端)姓名学号同组人员无实验日期2013年12月12日一、实验目的掌握基于TCP、UDP协议的聊天服务器端与客户端程序设计,掌握Socket, ServerSocket, DatagramSocket, DatagramPacket类的使用。
二、实验原理TCP和UDP协议的支持。
ServerSocket和Socket的使用。
三、实验内容实验截图代码import java.awt.Point;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .ServerSocket;import .Socket;import java.text.DateFormat;import java.util.Date;import java.util.HashMap;import java.util.Vector;import java.util.logging.Level;import java.util.logging.Logger;/**** @author Hsidar*/public class TalkHome extends javax.swing.JFrame {private ServerSocket server;private int talkHigh = 0;private char[] chatBuf = new char[2048];private String chatIpAddress = "127.0.0.1";private final int chatPort = 5200;private HashMap<String, Vector<IMessage>> chatRecordsMap;//private HashMap<String, Integer> chatRecordHMap;public TalkHome() {initComponents();chatRecordsMap = new HashMap<String, Vector<IMessage>>();//chatRecordHMap = new HashMap<String, Integer>();try {server = new ServerSocket(Integer.valueOf(chatPort));} catch (IOException ex) {Logger.getLogger(TalkHome.class.getName()).log(Level.SEVERE, null, ex);}new Thread(new Runnable() {@Overridepublic void run() {while(true){try {Socket socket = server.accept();BufferedReader sin = new BufferedReader(new InputStreamReader(socket.getInputStream()));int tmp_len = -1;StringBuilder chatStrBuilder = new StringBuilder();while((tmp_len = sin.read(chatBuf)) != -1) {chatStrBuilder.append(chatBuf, 0, tmp_len);}addMessage(socket.getInetAddress().getHostAddress(), chatStrBuilder.toString(), false);sin.close();socket.close();} catch (IOException ex) {Logger.getLogger(TalkHome.class.getName()).log(Level.SEVERE, null, ex);}}}}).start();}private void reChatWindow(String ipAddress) {System.out.println(ipAddress);Vector<IMessage> chatRecords = chatRecordsMap.get(ipAddress);jTextArea1.setText("");if(chatRecords == null) {chatRecords = new Vector<IMessage>();chatRecordsMap.put(ipAddress, chatRecords);}else {for(IMessage iMess : chatRecords) {if(iMess.ismyself) {jTextArea1.append("我 "+iMess.dateString+""+iMess.timeString+"\n"+iMess.messString+"\n\n");}else {jTextArea1.append("TA " +iMess.dateString+""+iMess.timeString+"\n"+iMess.messString+"\n\n");}}}}private void addMessage(final String ipAddress, String messString, boolean ismyself) {Vector<IMessage> chatRecords = chatRecordsMap.get(ipAddress);if(chatRecords == null) {chatRecords = new Vector<IMessage>();chatRecordsMap.put(ipAddress, chatRecords);}final IMessage iMessage = new IMessage(messString, ismyself);chatRecords.add(iMessage);if(ismyself) {new Thread(new Runnable() {@Overridepublic void run() {try {Socket sendMessage = new Socket(ipAddress, chatPort);PrintWriter sendWindow = newPrintWriter(sendMessage.getOutputStream());sendWindow.print(iMessage.messString);sendWindow.flush();sendWindow.close();sendMessage.close();jTextArea1.append("我 " +iMessage.dateString+""+iMessage.timeString+"\n"+iMessage.messString+"\n\n");} catch (IOException ex) {Logger.getLogger(TalkHome.class.getName()).log(Level.SEVERE, null, ex);}}}).start();}else {jTextArea1.append("TA "+iMessage.dateString+""+iMessage.timeString+"\n"+iMessage.messString+"\n\n");}}@SuppressWarnings("unchecked")// <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() {jCheckBox1 = new javax.swing.JCheckBox();jScrollPane2 = new javax.swing.JScrollPane();jTextArea2 = new javax.swing.JTextArea();jButton2 = new javax.swing.JButton();jFormattedTextField1 = new javax.swing.JFormattedTextField();jFormattedTextField2 = new javax.swing.JFormattedTextField();jLabel1 = new javax.swing.JLabel();jLabel2 = new javax.swing.JLabel();jPanel3 = new javax.swing.JPanel();jComboBox1 = new javax.swing.JComboBox();jLabel3 = new javax.swing.JLabel();jScrollPane3 = new javax.swing.JScrollPane();jTextArea1 = new javax.swing.JTextArea();jCheckBox1.setText("jCheckBox1");setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setBackground(new java.awt.Color(255, 255, 255));setBounds(new java.awt.Rectangle(0, 0, 520, 520));setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));setModalExclusionType(java.awt.Dialog.ModalExclusionType.APPLICATION_EXCLUD E);jTextArea2.setColumns(20);jTextArea2.setFont(new java.awt.Font("微软雅黑", 0, 14)); // NOI18NjTextArea2.setLineWrap(true);jTextArea2.setRows(5);jScrollPane2.setViewportView(jTextArea2);jButton2.setText(" 发送 ");jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) {jButton2ActionPerformed(evt);}});jFormattedTextField1.setText("127.0.0.1");jFormattedTextField1.setToolTipText("");jFormattedTextField2.setText("5200");jFormattedTextField2.setToolTipText("");jLabel1.setText("IP:");jLabel2.setText(":");jPanel3.setBackground(new java.awt.Color(255, 255, 255));jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "127.0.0.1", "172.16.202.19", "172.18.254.216" }));jComboBox1.addItemListener(new java.awt.event.ItemListener() {public void itemStateChanged(java.awt.event.ItemEvent evt) {jComboBox1ItemStateChanged(evt);}});jLabel3.setText("对方IP:");jLabel3.setToolTipText("");javax.swing.GroupLayout jPanel3Layout = newjavax.swing.GroupLayout(jPanel3);jPanel3.setLayout(jPanel3Layout);jPanel3Layout.setHorizontalGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel3Layout.createSequentialGroup().addContainerGap().addComponent(jLabel3).addPreferredGap(ponentPlacement. UNRELATED).addComponent(jComboBox1,javax.swing.GroupLayout.PREFERRED_SIZE, 131,javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE)));jPanel3Layout.setVerticalGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel3Layout.createSequentialGroup().addGap(22, 22, 22).addGroup(jPanel3Layout.createParallelGroup(javax.swing.Grou pLayout.Alignment.BASELINE).addComponent(jComboBox1,javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(jLabel3)).addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE)));jTextArea1.setEditable(false);jTextArea1.setColumns(20);jTextArea1.setFont(new java.awt.Font("微软雅黑", 0, 14)); // NOI18NjTextArea1.setLineWrap(true);jTextArea1.setRows(5);jScrollPane3.setViewportView(jTextArea1);javax.swing.GroupLayout layout = newjavax.swing.GroupLayout(getContentPane());getContentPane().setLayout(layout);layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.TRAILING,layout.createSequentialGroup().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup().addGap(2, 2, 2).addComponent(jLabel1).addPreferredGap(ponentPla cement.RELATED).addComponent(jFormattedTextField1,javax.swing.GroupLayout.PREFERRED_SIZE, 104,javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(ponentPla cement.RELATED).addComponent(jLabel2,javax.swing.GroupLayout.PREFERRED_SIZE, 6,javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(ponentPla cement.RELATED).addComponent(jFormattedTextField2,javax.swing.GroupLayout.PREFERRED_SIZE, 43,javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(ponentPla cement.RELATED, 123, Short.MAX_VALUE).addComponent(jButton2)).addComponent(jScrollPane2).addComponent(jScrollPane3)).addPreferredGap(ponentPlacement. RELATED).addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap()));layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false).addComponent(jPanel3,javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE).addComponent(jScrollPane3,javax.swing.GroupLayout.DEFAULT_SIZE, 358, Short.MAX_VALUE)).addPreferredGap(ponentPlacement.RELATED).addComponent(jScrollPane2,javax.swing.GroupLayout.DEFAULT_SIZE, 131, Short.MAX_VALUE).addPreferredGap(ponentPlacement.RELATED).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(jButton2).addComponent(jFormattedTextField1,javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(jFormattedTextField2,javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(jLabel2).addComponent(jLabel1)).addGap(2, 2, 2)));pack();}// </editor-fold>private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { addMessage(chatIpAddress, jTextArea2.getText(), true);jTextArea2.setText("");}private void jComboBox1ItemStateChanged(java.awt.event.ItemEvent evt) { if(evt.getStateChange() == 1) {chatIpAddress = evt.getItem().toString();reChatWindow(chatIpAddress);}}private Point jPanel1_pressed;/*** @param args the command line arguments*/public static void main(String args[]) {try {for (javax.swing.UIManager.LookAndFeelInfo info :javax.swing.UIManager.getInstalledLookAndFeels()) {if ("Nimbus".equals(info.getName())) {javax.swing.UIManager.setLookAndFeel(info.getClassName());break;}}} catch (ClassNotFoundException ex) {java.util.logging.Logger.getLogger(TalkHome.class.getName()).log(java.util. logging.Level.SEVERE, null, ex);} catch (InstantiationException ex) {java.util.logging.Logger.getLogger(TalkHome.class.getName()).log(java.util. logging.Level.SEVERE, null, ex);} catch (IllegalAccessException ex) {java.util.logging.Logger.getLogger(TalkHome.class.getName()).log(java.util. logging.Level.SEVERE, null, ex);} catch (javax.swing.UnsupportedLookAndFeelException ex) {java.util.logging.Logger.getLogger(TalkHome.class.getName()).log(java.util. logging.Level.SEVERE, null, ex);}//</editor-fold>/* Create and display the form */java.awt.EventQueue.invokeLater(new Runnable() {public void run() {new TalkHome().setVisible(true);}});}// Variables declaration - do not modifyprivate javax.swing.JButton jButton2;private javax.swing.JCheckBox jCheckBox1;private javax.swing.JComboBox jComboBox1;private javax.swing.JFormattedTextField jFormattedTextField1;private javax.swing.JFormattedTextField jFormattedTextField2;private javax.swing.JLabel jLabel1;private javax.swing.JLabel jLabel2;private javax.swing.JLabel jLabel3;private javax.swing.JPanel jPanel3;private javax.swing.JScrollPane jScrollPane2;private javax.swing.JScrollPane jScrollPane3;private javax.swing.JTextArea jTextArea1;private javax.swing.JTextArea jTextArea2;}class IMessage {public boolean ismyself;public String messString;public String dateString, timeString;public IMessage(String mess, boolean ismyself) {this.ismyself = ismyself;this.messString = mess;this.dateString = DateFormat.getDateInstance().format(new Date());this.timeString = DateFormat.getTimeInstance().format(new Date()); }}四、实验心得其实java已经将TCP和UDP协议高度封装了,熟练使用ServerSocket和Socket,DataGram会写出想要的网络程序,并不是很难。
计算机网络原理实验报告UDP网络聊天程序设计班级:计算机1301班学号:1307010116姓名:席凤凯实验五UDP网络聊天程序设计一.实验目的:编程设计基于UDP 的简单聊天室程序,实现服务器与客户端之间的对话通信功能。
二.实验原理:网络编程一般都是基于TCP 或UDP 的,一般过程如下:(1)TCP 编程的服务器端与客户端一般步骤:服务器端:1、创建一个socket,用函数socket();2、绑定IP 地址、端口等信息到socket 上,用函数bind();3、开启监听,用函数listen();4、接收客户端上来的连接,用函数accept();5、收发数据,用函数send()和recv(),或者read()和write();6、关闭网络连接;7、关闭监听;客户端:1、创建一个socket,用函数socket();2、设置要连接的对方的IP 地址和端口等属性;3、连接服务器,用函数connect();4、收发数据,用函数send()和recv(),或者read()和write();5、关闭网络连接;(2) UDP 编程步骤如下:服务器端:1、创建一个socket,用函数socket();2、绑定IP 地址、端口等信息到socket 上,用函数bind();3、循环接收数据,用函数recvfrom();4、关闭网络连接;客户端:1、创建一个socket,用函数socket();2、设置对方的IP 地址和端口等属性;3、发送数据,用函数sendto();4、关闭网络连接;三.实验内容:编辑代码:(1)服务器源程序:#include 〈stdio。
h〉标准输入输出头文件#include 〈netinet/in.h〉互联网地址族#include 〈arpa/inet。
h〉LINUX 下C 语言程序的INTERNET 定义头文件#include 〈unistd.h> 符号常量#include <fcntl。
课题: 基于UDP通信的聊天程序姓名:汤钦磊学号:200817010215同组姓名:李才伟专业班级:计科09101指导教师:刘国清老师设计时间:评阅意见:评定成绩:指导老师签名:年月日基于UDP通信的聊天程序1 协议介绍和使用说明1.1 协议内容本课程设计主要是基于UDP的并用Java实现的简单的聊天程序。
UDP 用户数据报是在运输层的端到端抽象的逻辑信道中传送的。
UDP 在传送数据之前不需要先建立连接。
对方的运输层在收到UDP 报文后,不需要给出任何确认。
虽然UDP 不提供可靠交付,但在某些情况下UDP 是一种最有效的工作方式。
虽然UDP 用户数据报只能提供不可靠的交付,但UDP 在某些方面有其特殊的优点,它有即时通信的功能。
比如说,使用聊天程序聊天的时候,省去的了跟对方通信的时候的链接的麻烦,直接进行通信。
UDP 只在IP 的数据报服务之上增加了很少一点的功能,即端口的功能和差错检测的功能。
UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。
UDP 是面向报文的。
UDP 没有拥塞控制,很适合多媒体通信的要求。
UDP 支持一对一、一对多、多对一和多对多的交互通信。
发送方UDP 对应用程序交下来的报文,在添加首部后就向下交付IP 层。
UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
应用层交给UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。
接收方UDP 对IP 层交上来的UDP 用户数据报,在去除首部后就原封不动地交付上层的应用进程,一次交付一个完整的报文。
1.2 关键技术1.2.1 服务器端Socket的实现Socket又称作套接字,它是使用标准Unix 文件描述符 (file descriptor) 和其它程序通讯的方式。
使用send()和recv()让你更好的控制数据传输。
在Java 网络编程中,socket相当于应用程序的港口码头;在计算机网络中,套接字由ip地址和端口号组成,为进程之间通信提供地址。
基于UDP的java聊天程序设计
一、问题重述:
用C或C++或java语言开发一个基于UDP的聊天程序。
要求:
能相互发送聊天信息。
点击发送就可以发送自己输入到文本中的信息给你输入IP方
自己进一步优化自己的程序。
二、使用开发语言选择:java
三、总体设计:
1):当点击“发送”按钮时,就会向你输入的IP方发送你输入的文本,如果你没有输入对方的IP时,就会提示“输入信息不全,请输入!”
2):当点击“关闭”按钮时,就会关掉整个聊天程序,退出聊天。
总体设计流程图如下:
四、细节设计分析:
1):先建立一个窗体,然后在窗体上添加一些组件。
2):用java的布局管理器对整体容器上的所有组件布局。
3):写出各个组件的控制代码,使各个组件都应自己的需要发出各自的动作。
五、具体实现:
1、窗体的整体布局代码如下:
/*输入、输出面板布局*/
jp1.setLayout(new BorderLayout());
jp1.add(sp2,BorderLayout.NORTH);//输出文本区
jp1.add(jp3,BorderLayout.CENTER);
jp1.add(sp1,BorderLayout.SOUTH);//输入文本区
//在面板jp1中放入关闭和发送按钮
jp2.add(jl2);jp2.add(jtf2);jp2.add(jb1);jp2.add(jb2);
/*窗体的整体布局*/
c.add(jp4,BorderLayout.NORTH);
c.add(jp1,BorderLayout.CENTER);
c.add(jp2,BorderLayout.SOUTH);
c.add(jp5,BorderLayout.EAST);
2、数据接收线程代码如下:
/*数据接收线程*/
new Thread(new Runnable(){
public void run(){
while(true){
try{
byte name[] = new byte[64];//字节数组用于存放昵称
byte data[] = new byte[1024];//字节数组用于存放要发送的信息
DatagramPacket nam = new DatagramPacket(name,64);//将要发送的数据打包DatagramPacket dp= new DatagramPacket(data,1024);//将要发送的数据打包
ds.receive(nam);//接收昵称
ds.receive(dp);//接收信息
Date date1 = new Date();//提取发送时的时间
jta2.append(new String(name,0,nam.getLength())+" "+String.format("%tT",date1)+ " "+"说:"+"\n"+new String(data,0,dp.getLength())+"\n");//输出你发送的内容
jta2.setCaretPosition(jta2.getText().length());//输出信息时跳到最新位置
}catch(Exception e){
if(!ds.isClosed()){
e.printStackTrace();
}
}
}
}
}).start();
}
3、接收数据时提示声音代码如下:
/*接收消息时提示声音*/
try{
mus = Applet.newAudioClip(new URL("file:///f:\\chat\\1.wav"));//要自己修改文件径if(mus!=null)
{mus.play();}
}catch(Exception ex1){
ex1.printStackTrace();
}
4、发送按钮部分代码如下:
/*发送你输入的信息*/
//显示你输入的文本到输出文本域
jta2.append(name+" "+String.format("%tT",date)+" "+"说:\n"+str+"\n");
byte[] buf,jtf;
buf = jta1.getText().getBytes();//提取文本域内容
jtf = jtf1.getText().getBytes();//提取昵称
try{
DatagramPacket nam = new DatagramPacket(jtf,jtf.length,
InetAddress.getByName(jtf2.getText()),8888);//将需发送的数据绑定到本机的8888端口
DatagramPacket dp = new DatagramPacket(buf,buf.length,
InetAddress.getByName(jtf2.getText()),8888);//将需发送的数据绑定到本机的8888端口
ds.send(nam);//发送昵称数据
ds.send(dp);//发送文本域数据
}catch(Exception ex){
ex.printStackTrace();
}
}
六、运行测试:
1)、运行程序情况如下图所示(在命令提示符下运行先要配置环境变量):
2)、没有输入对方IP时提示信息:运行情况如下图:
3)、发送信息给自己时得到下图所示情况:
七、总结:
通过对java的进一步学习和实践,从中学到的更多有用的知识,也学到了一些以前不了解的知识。
进一步明确了自己的学习目标,进一步了解到了java 语言的重要性,也更清楚地明白设计实践的重要性。
通过这次课程设计,对进一步了解了java布局和UDP网络通信,也进一步深化了对java布局的UDP通信的应用。
在本设计的具体实现过程中,遇到了一些小问题。
在实现的过程中,有的问题是通过自己的学习和实践,再不断的改正和上机实现才得以最终实现。
有的东西是在同学的帮助和老师的指导下完成的。
在此,向对本设计提供过帮助的所有老师和同学表示感谢。
在以后的学习中,希望能得到同学和老师们更多的帮助。