第一篇:计算机网络课设点对点聊天
《计算机网络》课程设计说明书
(点对点聊天程序)
学
院:
计算机与信息科学学院
学生姓名: 专
业:软件工程 班
级:1401班
完成时间:2016年12月
摘 要
目前即时通讯软件在平时的生活中有着十分广泛的应用,但是对绝大部分的软件来说,都必须得应用在互联网上,必须在一个Internel环境下才能使用。有的时候单位内部的员工,同学,可能没有互联网环境或者其他的原因希望不用上Internet就可以进行通讯,这样开发局域网通讯程序就有了必要性。本文提出了局域网通讯软件的需求,并详细对网络协议TCP/IP协议族进行了介绍和研究,如TCP,UDP,广播,IP等相关的技术。并对网络通讯原理进行了说明,采用了Client/Server模型, 程序基于TCP协议,通过socket接口来实现局域网内的即时通信工功能即聊天的功能。服务器端的一个端口用来监听对服务的请求,另外有一个临时端口用来给客户端发送数据,当客户端向该地址提出连接请求时,服务器端会对它的请求做出相应的反应。该软件采用多线程技术支持多用户操作,能够帮助企业在局域网内搭建起自己的聊天系统。避免了必须的经过互联网的过程。经过测试,程序能够有效达到基本的预期要求
关键词 课程设计;计算机;TCP/IP协议;服务器/客户端;JAVA;
引言
近年来,随着全球信息化进程的不断发展,网络也在飞速发展。出于高效、快速地处理各种事务的目的,越来越多的企业在其内部使用局域网来进行工作。在内部局域网的帮助下,企业得以简化信息流程,提高信息交换的速度,从而提高工作效率。然而,随着企业规模的扩大,业务量的增加,在局域网上运行的应用越来越多,如知识库、网络会议、数据库应用和数据的同步与备份等,这些应用对局域网的信息吞吐、处理能力的要求也越来越高。这些在企业内部原有局域网设计之初未曾考虑到的新情况的出现使得局域网不堪重负,容易发生信息阻塞,此时,局域网不但不能提高生产效率,反而成为企业发展的瓶颈。
了解决上述矛盾,人们提出了许多方法。提升网络带宽及增加服务器的吞吐能力是解决此矛盾的一种方法。然而,从企业运行的成本方面考虑,无论是单纯地提升网络带宽或增加服务器的吞吐能力都不能从根本上解决局域网资源紧张的问题,对旧有局域网的大规模硬件改造反而会增加企业的负担。
基于Socket的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业内部局域网的各种通信需求。
基于Socket的局域网聊天工具是此类局域网通信软件的具体实例之一,它很好地诠释了Socket通信的原理,并且在企业内部通信、教学、讨论等应用中都具有一定的实用价值。它具有信息收发速度快,保密性好,占用网络带宽资源低,占用服务器吞吐能力低,易于编程实现等优点。
基于Socket的局域网通信软件应用范围广阔,不但可以处理传统的通信需求,而且也能扩展以适应新型的网络应用,如网络教育,数据影音传输等,拥有广泛的应用前景。
目录
1设计原理基础.........................................................2 1.1 TCP/IP简介....................................................2 1.1.1 TCP/IP概念..................................................2 1.1.2 TCP:传输控制协议............................................3 1.1.3 TCP连接建立与终止...........................................3 1.2 IP:网际协议...................................................4 1.3 UDP:用户数据报协议............................................5 1.4 Socket网络编程原理............................................6 2设计方法及思路.......................................................7 2.1 思路...........................................................7 2.2编程方法.......................................................7 3系统需求分析与概要设计..............................................10 3.1功能需求分析..................................................10 3.4运行需求分析..................................................11 4.程序源码...........................................................12 4.1接收消息......................................................12 4.2监听..........................................................14 4.3发送消息......................................................15 4.5运行结果......................................................19 4.5.1 发送消息................................................19 4.5.2 接收消息................................................19 4.5.3 群发....................................................20 4.5.4 退出系统................................................21 5出现问题及解决方法..................................................23 6 课程设计的总结体会.................................................25 6.1总结..........................................................25 6.2展望..........................................................26 参考文献.............................................................27 致 谢...............................................................28
1设计原理基础
1.1 TCP/IP简介
1.1.1 TCP/IP概念
首先网络协议一般是通过分不同的level进行开发的,每一层都有自己的通信功能。对于某一个协议族,比如TCP/IP,是一组不同层次上的多个协议的组合。TCP/IP通常被认为是一个四层协议系统,如图所示。
图1 TCP/IP结构
如图所示,每个level都有不同工作:
1)链路层,也称为数据链路层或网络接口层,通常包括PC机自身的网络接口卡和本
机操作系统中的设备驱动程序,用来处理相关的物理接口。
2)网络层,也被称为互联网层,通常用于处理网络活动中的分组活动,例如分组的选路。在协议族中,如图所示,网络层协议主要包括了3个重要的协议。
3)传输层,其目的主要是为通过网络相连的两台主机的应用程序间提供end-to-end的通信。在TCP/IP协议族中,有两个主要的且互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。其中,TCP是提供高可靠性的数据通信。它可以通过三次握手,超时设置等机制来有效地保证了数据传输的可靠性。而另外一个协议,UDP则为应用层提供一种相对要简单些的服务。它的工作只是把数据分组从发送方传输到接收方,但是数据分组能否成功达到接收方它不会给予保证。如果需要可靠性就必须得通过其他层来完成。4)应用层,主要同于上层的应用程序进行的操作。
1.1.2 TCP:传输控制协议
TCP提供的是一种有保障的服务。确保了传输的可靠性,运用TCP协议的主机在交换数据之前必须首先建立一个连接。TCP主要是利用下面的步骤来确保其服务的:
1)首先在应用程序产生TCP报文时会进行大小控制,根据算法决定的发送的数据块
大小。然后再进行发送。
2)当主机利用发出一个数据段之后,它会启动一个定时机制,如果在规定的时间内接收不到确认数据,发送方就会重发。
3)TCP的一端收到另一端发送来的数据时,它将发送一个确认。
4)TCP还有头部检测。工作是检测数据在传输过程中是否发生改变。如果存在改变,那么TCP将丢弃这个报文段并且不会发送收到这个报文段的确认。
5)IP数据报的顺次在传输过程中可能会发生改变,所以TCP将对收到的数据进行重新排序,将收到的数据重新排列以后再交给应用层处理。6)TCP的接收端会丢弃重复的数据。
7)TCP还提供控制传输数据大小的机制。如利用滑动窗口机制来控制发送和接收数 据的大小。
1.1.3 TCP连接建立与终止
建立连接(如图2):
1)一方首先发送一个连接申请。
2)接收方发回包含服务器的初始序号的应答。同时,也发送一个收到客户方报文的一个确认。
3)发送申请方接收到接收方的确认序号,建立连接。这个过程就是建立TCP连接的“三次握手”过程。
连接终止(如图2):
1)提出终止的一方首先发送了一个终止连接的申请。
2)当接收方收到这个请求,会发送一个确认,再发送文件终止标志。3)然后这个接收方程序结束连接,此时也会发送一个结束标志和确认。
图二三次握手与四次挥手
1.2 IP:网际协议
IP协议是TCP/IP协议族中最为重要的协议。所有的其他协议产生的数据都需要以IP数据报形式来进行发送传输。而且IP提供无连接、不可靠的数据报传送服务:
1)IP协议不能保证IP数据报能成功地传输到接收方。如果发生某种错误时,如某个路由器暂时处于阻塞状态,IP也有一个简单的错误处理算法:丢弃数据,再通过发送一个特定的消息报给发送端,发送端接收到之后再进行处理。2)IP在发送数据报之后就不在关心次数据报的状态信息。每个数据报的处理是相互独立的。
IP地址分类如下图所示:
图三IP地址分类
1.3 UDP:用户数据报协议
UDP是一个面向数据报的传输层协议:进程的每个输出都会被封装成一个UDP数据报,并组装成一份待发送的IP数据报。
UDP不提供可靠性:其会把应用程序传给IP层的数据发送出去,它们能否达到目的地协议并不能保证。应用程序必须关心IP数据报的长度。如果它超过网络的MTU,那么就需要对IP数据报进行分片。
1.4 Socket网络编程原理
通常套接口分类:原始socket,流式socket和数据报socket.流式socket确保无差错无重复的顺序的数据传送.数据报socket定义了一种无连接的服务,传输数据时相互独立,无序的,也不确保可靠性.原始socket主要用于其他的网络协议实现的测试等。
无连接设计时,服务器方通常都是在等待客户机发来信息,一有信息到来就开始进行处理,不需要先进行连接。其程序的流程可以用图四表示。
图四
2设计方法及思路
2.1 思路
客户端与服务器建立连接,连接是通过申请的套接字实现的,客户打开一个套接字并把它约束在一个端口上如果成功就相当于建立一个虚拟文件以后就可以在虚拟文件上写数据并通过网络向外传送,完成连接后就可以通信了。客户机向服务器发送请求,打开一个连接后,客户机把请求消息送到服务器的停留端口上,完成提出请求操作。服务器在处理完客户的请求之后,要向客户机发送响应消息。客户通过关闭套接字来结束TCP/IP对话。
当使用TCP/IP协议发送客户服务器服务程序时,服务器需要等待任意数量客户端的连接,以便为他们提供服务。客户端连接服务器时,必须先知道服务器的名称。在TCP/IP中,就是服务器的IP地址和端口号。bind()函数实现将服务器绑定到一个已知的名字上的功能。接下来要将服务器套接字设置为监听状态,这是通过listen()函数完成的。在监听状态下,如果客户端向服务器发起连接请求,服务器通过调用accept()函数来接受该连接请求。服务器与客户端完成连接后,就可以进行数据通信了。对于客户端来说,首先调用connect()函数向服务器发出连接请求。如果服务器接受了该请求接下来就可以与服务器通信了。
2.2编程方法
WinSocket通信的步骤:
1.在服务器端的应用程序中的网络通信的步骤如下:
(1)建立服务器端的Socket,开始侦听整个网络中的连接请求。
(2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接,再继续进入监听状态。
(3)在监听的过程中,如果有用户发出了请求,则服务器会产生一个新的连接
Socket来处理用户的请求,而原来的Socket仍然会进行监听操作。
(4)当完成通信后,服务器关闭与客户端的Socket连接。2.在客户端应用程序中的网络通信的步骤如下:
(1)建立一个客户端的Socket。
(2)从命令行中得到服务器的名字,并进行查询以得到服务器的IP地址;
(3)从命令行中得到服务器所提供的端口号,以便进行下一步的操作;
(4)发送连接请求到服务器,并等待服务器的回馈信息。
(5)连接成功后,与服务器进行数据的交互。
(6)数据处理完毕后,关闭自身的Socket连接,释放进行连接所分配的资源,客户端的程序运行完毕。
图五
其主要工作流程为: 服务器方首先创建一个socket,再调用绑定函数将该socket和本地网络地址绑定,然后调用监听函数对socket进行侦听同时也规定其处理大小,之后就调用接收函数来接收连接。
客户端在建立套接口后就可调用连接函数和申请和服务器建立连接.在服务器接收申请后建立连接,然后客户机和服务器之间就可以发送和接收数据.最后,待数据传送结束后,关闭socket.2.3.3C/S模型介绍。
C/S模型一般是基于连接的来交换信息的.它通常是由两部分组成:1)Server 服务器方一般都是在等待客户方的申请,建立connect后再进行通信。2)Client 客户方会给一个已知的服务器方发送一个connect申请,当服务器端接收请求之后connect成功。
3系统需求分析与概要设计
3.1功能需求分析
(1)用户端之间的信息发送,本程序需要实现的最基本的功能。用户在界面上可以将自己需要发送的信息填入相应的对话框中,点击发送按钮后,可以将信息正常的发送给相应的其它用户,这个过程中的客户端与客户端之间使用点对点发送信息,预计利用TCP/IP协议中的UDP协议,在本程序中共需要3个端口,此功能预计使用3号端口。
(2)在线用户主机IP列表的维护。在用户发送信息之前,需要选择相应的目的地端IP,这也就需要客户端拥有在线用户主机的IP地址,这个在线主机列表的维护是需要客户端定时自动向服务器端发送信息,服务器端收集并维护在线用户列表,再发送回客户端。需要在客户端和服务器端都使用定时器来完成此功能。此功能预计使用1、2号端口。
(3)在C/S模式中,服务器与客户端是相互依赖的。在客户端启用以后,需要查看服务器端是否在线,服务器在线才能正常使用客户端,如果服务器不在线,则在检测一定次数以后自动退出客户端程序。在使用过程中,客户端在指定时间内未向服务器端发送信息的,服务器认为客户端下线;客户端在一定时间内未收到服务器端信息的,认为服务器已经下线,则提示用户并建议退出,在用户一定时间后没有退出的则自动关闭客户端程序。
3.2 数据需求分析
(1)客户端之间聊天信息。在控件上显示时格式化,更易于用户的查看自己发送或接收到的信息。
(2)在线用户聊天信息。服务器端存放在适当的空间中,在发送给客户端时,对信息列表进行格式化,便于客户端提取信息。
(3)客户端向服务器端发送的确认在线信息。包括客户端刚刚启动时的初始化信息和在使用过程中的确认在线信息。
(4)其它程序内部可能需要设计的数据结构体
3.3性能需求分析
(1)可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,使程序具有较高的容错性能。
(2)宜操作性,程序简单易懂,容易上手使用。设计界面是,简化界面的复杂性,模拟QQ等现有即时通讯工具的界面,使用户能很容易看懂并使用。
(3)开发文档易理解,保证以后自己二次开发或他人接手开发时,能够清晰的理解整个系统的设计思路和实现细节。(4)模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以后的维护与扩展,在以后可以更好的完善本软件的功能,更方便于在工作中的应用。
3.4运行需求分析
(1)用户界面
程序较小,启动速度快。可在网络中使用,有注册功能,需进行用户登录。启动后的应用界面要清爽,设计要简单明了,要具有较高的易用性。
(2)故障处理
在遇到可预知的故障与情况时,能提示用户并自动退出;在遇到不可预知的故障时能安全退出。
4.程序源码
4.1接收消息
Display display = Display.getDefault();
@Override
publicvoid run(){
text.append(tr.inetAddress+“对我 Display.getDefault().asyncExec(new Runnable(){
@Override
publicvoid notifyResult(Object obj){ tr=(TalkResult)obj;t=new Thread(new Task(new MyNotify(){ createContents();说:rn”+tr.content+“rn”+new Date()+“rn”);
if(button_1.getSelection()==true){
String ip=tr.inetAddress.getHostAddress();String content=UUID.randomUUID().toString();byte[] bs=content.getBytes();//将要发送的内容转
//将hashset中的数据显示到table中去 table.removeAll();
for(InetAddress a:hashSet){
}
TableItem ti=new TableItem(table, SWT.NONE);ti.setText(new
//TODO:将这个地址存到集合中(不允许重复),hashset hashSet.add(tr.inetAddress);text.append(“========”);String[]{ a.getHostAddress()});成字节数组
}
}
}
intlength=bs.length;//要发送的内容的字节数组的长DatagramPacket dp=null;try {
InetSocketAddress addr=new
dp=new DatagramPacket(bs, length,addr);ds=new DatagramSocket(7890);ds.send(dp);度
InetSocketAddress(ip,Task.receivePort);
} catch(Exception e){
}
e.printStackTrace();ds.close();}finally{ });}));t.setDaemon(true);t.start();
Thread t2=new Thread(new ReceiveEixtMsgTask(new MyNotify(){
@Override
publicvoid notifyResult(Object obj){
TalkResult tr=(TalkResult)obj;InetAddress ia=tr.inetAddress;hashSet.remove(ia);
Display.getDefault().syncExec(new Runnable(){
@Override
publicvoid run(){
}
table.removeAll();
for(InetAddress a:hashSet){
}
TableItem ti=new TableItem(table, SWT.NONE);ti.setText(new
String[]{ a.getHostAddress()});});
} } }));t2.setDaemon(true);t2.start();
shell.open();shell.layout();while(!shell.isDisposed()){
} if(!display.readAndDispatch()){ } display.sleep();
4.2监听
//选择ip 发送消息
table.addSelectionListener(new SelectionAdapter(){
//退出
button_2.addSelectionListener(new SelectionAdapter(){
@Override
publicvoid widgetSelected(SelectionEvent e){
MessageBox mb=new MessageBox(shell,SWT.OK|SWT.CANCEL);mb.setMessage(“是否退出?”);intr=mb.open();if(r==32){
@Override
publicvoid widgetSelected(SelectionEvent e){
} TableItem[] tis=table.getSelection();if(tis==null || tis.length<=0){ } TableItem ti=tis[0];String ip=ti.getText();text_2.setText(ip);return;});//32/
}
} intmyport=Integer.parseInt(text_3.getText());byte[] bs=“bye”.getBytes();intlength=bs.length;for(InetAddress a:hashSet){
} System.exit(0);
String ip=a.getHostAddress();DatagramSocket ds=null;try {
InetSocketAddress addr=new
dp=new DatagramPacket(bs, length,addr);ds=new DatagramSocket(myport);ds.send(dp);InetSocketAddress(ip,ITalks3.EXITPORT);
} catch(Exception el){
}
el.printStackTrace();ds.close();}finally{ });
4.3发送消息
//发送
btnNewButton.addSelectionListener(new SelectionAdapter(){
@Override
publicvoid widgetSelected(SelectionEvent e){
String s=text_1.getText();//内容
intmyPort=Integer.parseInt(text_3.getText());//发送端口 DatagramSocket ds=null;byte[] bs=s.getBytes();//将要发送的内容转成字节数组 intlength=bs.length;//要发送的内容的字节数组的长度 if(button.getSelection()==true){
for(InetAddress a:hashSet){
String ip=a.getHostAddress();
//DatagramPacket的构造方法参数,三个参: 最后一个参数//UDP中的每一个包都必须指明要发送的地址 try { 表示另外一台机器的地址和端口
} privateintreceivePort=10002;//接收用端口 privatebyte[] buf;//接收用的字节数组 private DatagramPacket dp;//Packet
}
}
}
InetSocketAddress addr=new
DatagramPacket dp=new DatagramPacket(bs, ds=new DatagramSocket(myPort);//使用本机上的哪一个端口发送 ds.send(dp);
e1.printStackTrace();ds.close();InetSocketAddress(ip,receivePort);length,addr);
String ip=text_2.getText();//对方ip
//DatagramPacket的构造方法参数,三个参: 最后一个参数表示//UDP中的每一个包都必须指明要发送的地址 try { }else{
}
}
InetSocketAddress addr=new
DatagramPacket dp=new DatagramPacket(bs, ds=new DatagramSocket(myPort);//使用本机上的哪一个端口发送 ds.send(dp);
e1.printStackTrace();ds.close();InetSocketAddress(ip,receivePort);length,addr);
} catch(Exception e1){ } finally{ 另外一台机器的地址和端口
} catch(Exception e1){ } finally{ });
private DatagramSocket ds;//Socket
private HashSet
publicvoid run(){
//int port=Integer.parseInt(text_1.getText());buf= newbyte[1024];//字节数组,用来缓存数据
dp=new DatagramPacket(buf, buf.length);//构建一个数据包对象 try { ds=new DatagramSocket(receivePort);//构建一个数据包Socket,占用UDP的9999端口,进行接收
while(true){ ds.receive(dp);//用这个9999端口来接收数据,存在dp数据包对象的System.out.println(new buf缓存空间
String(buf,0,dp.getLength()));//将字节数组转成字符串输出
@Override
publicvoid run(){
String s=new String(buf, 0, Display.getDefault().asyncExec(new Runnable(){ dp.getLength());//dp.getLength()接收的实际长度
InetAddress address=dp.getAddress();
text.append(address+“对我说:rn”+s+“rn”+new
Date()+“rn”);
//将hashset中的数据显示到table中去 table.removeAll();
for(InetAddress a:hashSet){
TableItem ti=new TableItem(table, SWT.NONE);ti.setText(new
//TODO:将这个地址存到集合中(不允许重复),hashset hashSet.add(address);
text.append(“========”);String[]{ a.getHostAddress()});
}
}
} } e.printStackTrace();} catch(Exception e){
}
} });
4.5运行结果
4.5.1 发送消息
测试中本机ip为192.168.14.134,对方ip为 192.168.14.134,本机向对方发送:“这是测试” 对方接收到消息,并且将本机ip加入到在线列表用户中
4.5.2 接收消息
测试中本机ip为192.168.14.134,对方ip为 192.168.14.134,对方向本机发送:“hello”,本机收到消息,并将对方加入到了在线列表中
4.5.3 群发
选中群发,然后发送消息,显示再列表中的用户将都会收到相同的消息
4.5.4 退出系统
按退出按钮,用户将消失在在线用户列表中
5出现问题及解决方法
1、在建立Socket连接时,两端的端口号必须设为一致,否则无法建立连接。
2、建立好连接之后,必须按照给定的格式输入通信信息,即m+输入的信息内容,否则,将会出现“no this command”的提示。
3、如果一个使用某端口的程序没有关闭,另一个程序就不能使用这个端口。
4、必须先连接服务器端,再连接客户端,否则,不能预期将服务器端和客户端连通。课程设计的总结体会
6.1总结
课程设计终于完成了。在这段不长的时间里,我感触很深,也学到很多东西。我对winsock双机通信有了更深的了解和认识,其原理和功能也加深了理解。TCP协议我们以前也学过相关知识,经过这次设计,相关的知识得到进一步巩固,运用也变得更加熟练。我学习和了解了有关JAVA中的相关知识和应用,JAVA开发环境也更加熟悉。通过这次课程设计,我不仅学习到了新的知识,也对以前学过的相关的知识有了更深入的理解和掌握。不仅加强了我的理论知识的学习,也增强了我的动手能力,对知识的理解不再局限于表明,理解更加透彻,也更巩固。
以前的学习都是单一方面的知识,这次通过课程设计,将这三个方面的知识综合起来,显然难度是加大了。开始的时候我也感觉似乎无从下手。但在网上查找了相关资料,并且请教了一些同学后,有了一些头绪,并着手开始设计和实践。
我们组这次做的课题的目的就是通过套接字在客户端和服务器之间建立连接,这个连接是以TCP协议传输。在建立连接之后实现客户端与服务器之间的通信,从而设计相关函数的调用和对套接字的应用。
1、客户连接(Client connections)由客户启动,并将本地客户套接字与远程服务器套接字相连.客户套接字必须说明它们想连接的服务器.需要提供服务器的主机名或IP地址及其端口号.2、监听连接(Listening Connections)是等待客户的被动服务器套接字连接.一旦客户发出了新的请求,服务器就会为该特殊连接生成新的套接字,然后返回监听状态.监听服务器套接字必须说明代表其提供服务的端口吗(事实上,客户正是通过该端口进行连接的).3、服务器连接是由服务器激活的连接,负责接受来自客户的请求.这些不同的连接种类只对建立客户与服务器之间的连接具有重要性.一旦连接建立完毕.连接的双方都可以自由发出请求并彼此发送数据.这里面涉及什么是套接字,什么是流式套接字,为什么用流式套接字等问题。用套接字中的相关函数来完成通信过程,它的存在是为了区别不同应用程序进程间的网络通信和连接。流套接字用于提供面向连接、可靠的数据传输服务,又因为该服务将保证数据能够实现无差错、无重复发送,并按顺序接收,所以用了流式套接字。
6.2展望
通过设计实现和测试的数据表明,本文研究的局域网即时通信方法能有效地完成局域网之间的通信,但随着技术的发展,系统中还存在许多不足的地方,有待进一步改进和完善。同时,即时通信技术也在不断的提高,这迫切的需要新的技术和方法。在今后的研究过程中,还要注意以下几个方面的工作:
1)对网络通信技术的研究。正如我们所知道的,网络通信技术在建立在网络通信协议的基础上的。尤其是对TCP/IP协议族的研究,或者将来会出现更加有效安全的网络协议,这个方向一直是重点的研究方向。
2)安全性是一个非常重要的方向,无论是互联网还是局域网环境,安全性始终是一个重要的因素,其中包括一些有效的安全算法等,也是最值得关注的方向。
3)如何提高信息的效率,对于网络通信而言,效率一直是一个重点,怎么样能把网络的利用率做到最优,怎样把信息安全有效的传递,在传递过程中如何保证信息不会丢失,错误等
参考文献
[1]谢希仁.计算机网络.第4版.电子工业出版社.2006年
[2](美)W.RichardStevens.TCP/IP协议详解卷一.人民邮电出版社.2009年
[3]施炜李铮秦颍编著.WindowsSockets规范及应用-Windows网络编程接口.2002年
[4]广播地址_百度百科.http://baike.baidu.com/view/473043.html?wtp=tt [5]张文赵子铭杨天路魏小康著.P2P网络技术原理与C++开发案例.人民邮电出版社.2008年8月
[6]NetworProgrammingforMicrosoftWindows,SecondEditioneBook.PUBLISHEDBYMicrosoftPress.2002 [7](美)(JamesF.Kurose)库罗斯,陈鸣译.计算机网络自顶向下方法第四版.机械工业出版社.2008年
[8]CharlesPetzold著.windows程序设计(第5版).北京大学出版社.2009年 [9]罗军舟等编著.《TCP/IP协议及网络编程技术》.清华大学出版社.2004年 [10]叶树华著.网络编程实用教程(第2版).人民邮电出版社.2010年
[11]林涛著.计算机网络应用编程技术.人民邮电出版社.2006年[12]http://zh.wikipedia.org/,维基百科 [13]MSDNLibrary–October2001 [14]李凌著.Winsock2网络编程实用教程.清华大学出版社.2003年 [15]黄帆.多人聊天程序的一种设计与实现.中国水运(学术版).2006 [16]冀振燕著.UML系统分析设计与应用案例[M].人民邮电出版社.2003年 [17]黄永峰等著.IP网络多媒体通信技术.人民邮电出版社.2003年 [18](美)JEANNAMATTHEWS著.李毅超曹跃王钰等译.《计算机网络实验教程》(《COMPUTERNETWORKS:INTERNETPROTOCOLSINACTION》).人民邮电出版社.2006.1 [19](美)DouglasE.Comer林瑶等.《用TCP/IP进行网际互联第一卷:原理、协议与结构》.电子工业出版社.2001年5月
[20]AlexanderHeußner.ModelExtractionforSockets-basedDistributedPrograms.hal-00425099.version1-20Oct2009 [21]DavidA.Bryan.STANDARDS-BASEDP2PCOMMUNICATIONSSYSTEMS.BruceB.Lowekamp,advisor,DepartmentofComputerScience,CollegeofWilliamandMary [22]TCP三次握手.http://baike.baidu.com/view/1003841.htm
致 谢
真诚感谢老师在我们课程设计阶段给予我们的指导与帮助以及专业课的教授,在老师的指导下使我对网络专业知识有了更深的认识,并且您严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我,这些使我受益匪浅,并将成为我终身献身科学和献身事业的动力。在此向您致以诚挚的谢意与敬意。
第二篇:计算机网络课设
计算机网络应用课程设计
报告
系(院):
计算机科学学院 专业班级: 计科11511 姓
名: 钟灿均 学
号: 201503687 指导教师: 余绍文 设计时间: 2017.6.12-2017.6.23 设计地点: 12教1楼机房
一、课程设计目的和意义
计算机网络课程设计的目的,是为了让我们更深入地掌握计算机网络的核心内容,实现理论与实践相结合。让学生用具体的实践成果,体现对理论知识的掌握程度。有利于学生提高计算机网络的实践能力,加深对计算机网络理论知识的理解。其基本目的是:
1. 培养学生理论联系实际的设计思想,训练综合运用所学的基础理论知识,结合生产实际分析和解决网络应用中问题的能力,从而使基础理论知识得到巩固和加深。2. 学习掌握网络应用工程的一般设计过程和方法。
二、设计题目和要求
1.编写程序,实现系统的基本功能;
2.要有用户界面:要求至少采用文本菜单界面;鼓励采用图形菜单界面; 3.写课程设计报告,内容包括: 封面(参见附录I)
需求分析:以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?给出功能模块图和流程图。同时明确规定:输入的形式和输出值的范围;输出的形式;程序所能够达到的功能;测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。 概要设计:包括程序设计组成框图,程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义)。
详细设计:包括模块功能说明(如函数功能、入口及出口参数说明,函数调用关系描述等),每个模块的算法设计说明(可以是描述算法的流程图)。其中源程序要按照写程序的规则来编写,结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。 运行结果:包括典型的界面、输入和输出数据等;
总结:包括课程设计中遇到的问题,解决问题的过程及体会、收获、对课程设计的认识与思考等。
附录:包括主要程序清单,要有适当的注释,使程序容易阅读。 开发环境:windows 10
开发工具: vs2008
题目3:基于UDP协议的简易聊天机器人
设计目标:
1.了解Socket通信的原理,在此基础上编写一个聊天程序; 2.理解upd原理;课程设计系统组成及模块功能: 此课程设计实现了基于UDP的客户/服务器通信程序,需要实现以下一些基本功能: 1.客户端连接聊天机器人服务器;
2.消息发送:客户端发送消息给机器人服务器。
3.消息接收:客户端接收到机器人服务器发送给他的消息。4.可以有多个客户端同时连接
5.智能回复功能:根据用户发送的消息内容,稍微有点智能回复。
运行效果:
服务器端和客户端截图
三、设计内容
1、UDP传送数据前并不与对方建立连接,即UDP是无连接的,在传输数据前,发送方和接收方相互交换信息使双方同步。
2、UDP不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的信息(如TCP所采用的序号),而且报文不一定按顺序到达的,所以接收端无从排起。
3、UDP对接收到的数据报不发送确认信号,发送端不知道数据是否被正确接收,也不会重发数据。
4、UDP传送数据较TCP快速,系统开销也少。
5、由于缺乏拥塞控制(congestion control),需要基于网络的机制来减小因失控和高速UDP流量负荷而导致的拥塞崩溃效应。换句话说,因为UDP发送者不能够检测拥塞,所以像使用包队列和丢弃技术的路由器这样的网络基本设备往往就成为降低UDP过大通信量的有效工具。数据报拥塞控制协议(DCCP)设计成通过在诸如流媒体类型的高速率UDP流中增加主机拥塞控制来减小这个潜在的问题。
从以上UDP协议特点可知,UDP提供的是无连接的、不可靠的数据传送方式,是一种尽力而为的数据交付服务。
1.服务端
1.2.3.4.5.加载协议栈; 创建套接字;
将套接字绑定到一个本地地址和端口bind; 等待接收数据recvfrom;关闭套接字;
2.客户端
1.2.3.4.加载协议栈;
创建套接字socket;
向服务器发送数据sendto;关闭套接字; 3.相关代码显示:(客户端)
int main(int argc, char* argv[]){
system(“@color 0e”);WORD socketVersion = MAKEWORD(2, 2);WSADATA wsaData;if(WSAStartup(socketVersion, &wsaData)!= 0){ } sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(8888);sin.sin_addr.S_un.S_addr = inet_addr(m);int len = sizeof(sin);return 0;以上代码为相关版本信息及热启动的一些操作;;
结构体端口号及相关地址信息以及转化函数,将输入的信息转化为计算机可识别的二进制代码,进行相关构造
char * sendData = new char[255];cout << “主人:”;cin >> sendData;while(strcmp(sendData, “#”)!= 0){
sendto(sclient, sendData, strlen(sendData), 0,(sockaddr *)&sin, len);char recvData[255];int ret = recvfrom(sclient, recvData, 255, 0,(sockaddr *)&sin, &len);if(ret > 0){
} recvData[ret] = 0x00;cout << “机器人:”;printf(recvData);4.相关代码展示:(服务端)
SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if(serSocket == INVALID_SOCKET){
} printf(“socket error!”);return 0;3
if(bind(serSocket,(sockaddr *)&serAddr, sizeof(serAddr))== SOCKET_ERROR){
} sockaddr_in remoteAddr;int nAddrLen = sizeof(remoteAddr);char * sendData = new char[255];char recvData[255];while(true){
int ret = recvfrom(serSocket, recvData, 255, 0,(sockaddr *)&remoteAddr, //printf(recvData);if(ret > 0){
} struct Ro { char recv[255];char send[255];recvData[ret] = 0x00;printf(“接受到一个连接:%s rn”, inet_ntoa(remoteAddr.sin_addr));cout << “主人:”;printf(recvData);printf(“bind error!”);closesocket(serSocket);return 0;以上为对套接字的绑定及判断绑定是否成功,以及对于相关信息的初始化
&nAddrLen);}Ro;FILE *fp;fp = fopen(“G:机器人问答机制.txt”, “r”);while(!feof(fp)){
} fscanf(fp, “%s %s”, Ro.recv, Ro.send);if(strcmp(recvData, Ro.recv)== 0){
} else { } strcpy(sendData, Ro.send);break;strcpy(sendData, “对不起,我不知道”);4
fclose(fp);cout << endl;cout << “机器人:” << sendData << endl;sendto(serSocket, sendData, strlen(sendData), 0,(sockaddr *)&remoteAddr, nAddrLen);
四、设计成果以及心得 1.成果
2.心得
通过对课设的相关的操作,加强了对于相关知识的理解,对于知识的应用也得以加强,在课设过程中,聊天机器人制作较为有趣,对于TCP与UDP的通信方式有了进一步的理解和加强,对于socket编程的相关基础也得以进一步的理解和学习。在今后的学习过程中希望可以将所学知识应用于实际,学以致用。而且对于课设中存在的问题和不足,以及通过老师的讲解,对一些算法加以分析和改进,从而不断完善课设内容,对内容的理解得以加深。
指导老师意见:
成绩:
教师签名: 2017年6月23日
第三篇:C1 CRC12计算机网络课设
计算机通信网络课程设计
C1 CRC-12 校验通信软件设计
所在学院: 信息科学与工程学院
专业班级: 通信工程
学生姓名:
学生学号:
指导教师: 时 间: 2015年9月20
引言:
循环冗余码 CRC 检验技术广泛应用于测控及通信领域,CRC计算可以靠专用的硬件来实现,但是对于低成本的微控制器系统,在没有硬件支持下实现CRC检验,关键的问题就是如何通过软件来完成CRC计算,也就是CRC算法的问题。CRC码是数据通信领域中最常用的一种差错检验码,其特征是信息字段和校验字段的长度可以任意选定。
实验设计要求:
C1.CRC-12 校验通信软件设计
环境要求:Windows/XP/7;C;信息交换内容为键盘输入的字符串;通信传输通过共享文件实现
编码要求:用模2 除法计算CRC 码,生成多项式为CRC-12
功能要求:能在两台计算机机上运行程序,一台产生CRC 码,另一台校验。
课程设计目标:
用C语言设计课程程序,完成用模2出发计算CRC码的CRC校验软件设计,1.掌握CRC码的计算方法;
2.掌握用C语言计算CRC码的算法;
3.熟练并掌握C语言在通信网络中的编程实现方式及功能。
CRC 简介
CRC 校验的基本思想是利用线性编码理论,在发送端根据要传送的 k 位二进制码序 列,以一定的规则产生一个校验用的监督码(既 CRC 码)r 位,并附在信息后边,构成 一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和 CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。
12位的 CRC 码产生的规则是先将要发送的二进制序列数左移 12 位(既乘以2)后,再除以一个多项式,最后所得到的余数既是 CRC 码,如式(2-1)式所示,其中 B(X)表示 n 位的二进制序列数,G(X)为多项式,Q(X)为整数,R(X)是余数(既 CRC 码)。
12B(x)212R(x)(2-1)Q(x)G(x)G(x)求CRC码所采用模 2 加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。生成CRC码的多项式如下,CRC-12 则产生的是 12 位的CRC码。CRC-12:G(x)xxxxx1
接收方将接收到的二进制序列数(包括信息码和 CRC 码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。用软件计算 CRC 码时,接收方可以将接收到的信息码求 CRC 码,比较结果和接收到的 CRC 码是否相同。
CRC原理:
CRC码为循环冗余校验码,基本表示方式为(n,k),其中n为数据位数,k为校验码位数。CRC码校验的基本思想是利用线性编码理论,在发送端根据要传送的(n,k)位二进制码序列,121132以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。采用CRC校验时,发送方和接收方用同一个生成多项式g(x),并且g(x)的首位和最后一位的系数必须为1。CRC的处理方法是:发送方以g(x)去除t(x),得到余数作为CRC校验码。校验时,以计算的校正结果是否为0为据,判断数据帧是否出错。CRC校验可以100%地检测出所有奇数个随机错误和长度小于等于k(k为g(x)的阶数)的突发错误。所以CRC的生成多项式的阶数越高,那么误判的概率就越小。
程序流程图:
CRC-12校验方法:
多项式是0x180D,有13位,crc12本来是12位,16进制的0x80D前面补了个1,所以就是13位的。然后我们的信息是一串字符,每个字符8个位二进制,假如我们有3个字符,总共有24位。所以我们的运算就是先获取前面13位,这里的前13位二进制是指第一位是1的13位二进制。这个前13位和0x180D异或后,得到了一个异或结果,这个结果除去前面的0,应该是小于13位的。这时是不够13位的,所以我们可以在继续往后加二进制,假如3个字符,那么总共有24位进制,我们还有14到24位这些还没有加。
直到最后所有位都已经处理好了,得到的结果就是crc码。
文件共享: 将计算的数据存入共享的文件夹中,所以我们必须要先建立一个codecode的文件夹,并设为共享,将要共享的数据存在code.txt文件里。
fp_crc=fopen(“D:codecodecode.txt”,“w”);
//打开文件夹 fprintf(fp_crc,“%d ”,len+2);
//存入数据+crc的长度 for(int i=0;i fprintf(fp_crc,“%c”,ch[i]); //存入字符串 } fprintf(fp_crc,“%c”,(crcnum>>4)); //先去12位crc码的前8位 fprintf(fp_crc,“%c”,(crcnum<<4)&0xF0);//再取crc码的后4位,然后剩下的补0,使其够8位fclose(fp_crc); //最后存入文档中 另一台计算机从计算机中的共享文件夹读取数据,读出后数据进行CRC-12校验,若读出数据对生成多项式取余,若余数为0,则信息传输正确,否则信息传输错误。 fp_code=fopen(“Pc14codecodecode.txt”,“r”);//共享计算机组名为Pc14的codecode文件夹 fscanf(fp_code,“%d”,&len);//读取长度 fscanf(fp_code,“%c”,&bb);//读取长度后一个空格 for(int i=0;i fscanf(fp_code,“%c”,&data_t[i]);//按照长度读取每一个字节 fclose(fp_code); int ju=crc12(data_t,len); //crc12校验,返回 程序清单: 发送端: #include /*buf输入的信息,len信息长度*/ int crc12(uchar buf[],int len){ int wcrc;int i,iq;uchar ir;wcrc=0;///crc码 iq=0;//buf字符串下标,从0到len-1,初始化为0 ir=0;//初始化为0,0到7的变换,while(iq fprintf(fp_crc,“%c”,(crcnum<<4)&0xF0);//再取crc码的后4位,然后剩下的补0,使其够8位 fclose(fp_crc);//最后存入文档中 printf(“发送编码:%s%xn”,ch,crcnum);printf(“发送成功n”);return 0;} 接收端: #include iq=0;//字符选取下标,0-len ir=0;while(iq fscanf(fp_code,“%c”,&bb);//读取长度后一个空格 for(int i=0;i