搜档网
当前位置:搜档网 › 基于TCP协议的简单即时通信软件的设计与实现

基于TCP协议的简单即时通信软件的设计与实现

基于TCP协议的网络通信系统的设计与实现

摘要:网络通信,由于其具有实时性、跨平台性、成本低、效率高等优点而受到广泛的使用。设计并实现一个能够处理多用户进行实时、安全的即时通信系统具有较强的现实意义。即时通信的底层通信是通过SOCKET套接字接口实现的。当前的主流UNIX系统和微软的WINDOWS系统都在内核提供了对SOCKET字接口的支持。使用这个统一的接口,可以编写一个可移植的TCP/IP通信程序。使信息能够在INTERNET上可靠的传输。

本文设计并实现了基于局域网内的简单即时通信系统,系统采用C/S模式,底层通信通过SOCKET套接字接口实现,服务器负责客户端的登录验证,好友信息的保存和心跳报文的发送。客户端采用P2P方式实现消息传递,并能实现文件的传输。本文首先讨论了同步套接字,异步套接字,多线程并发执行任务等;然后阐述了客户端、服务器如何使用XML序列化的消息进行通信。

关键词:即时通信;文件传输;套接字;TCP协议

Abstract :Instant messages have several advantages such as real-time, cross-platform, cheap and efficient. To design a Multi-user IM (instant message) architecture is very i mportant in both theory and realism. Instant message based on TCP/IP protocol that is realized by socket interface. Almost all UNIX operation systems and Microsoft's win dows operation systems provide support of socket in the kernel. Using the uniform int erface, we can develop a portable program of TCP/IP, which help us transfer informati on in Internet safely and credibly.

The system uses the client/server(C/S) mode. The server takes the responsibility of th e login message of client, the saving of friend message and Message heartbeat. The tra nsmission of the basic messages of the customer end will be designed on P2P architec ture. This thesis explains how the client and server communicate via serializing XML message.

Key words: Instant Message; File Transfer; Socket; TCP protocol

引言

1.1 课题背景

即时通信是一个终端连往一个即时通信网路的服务。即时通信不同于e-mail 在于它的交谈是实时的。大部分的即时通信服务提供了presence awareness的特性──显示联络人名单,联络人是否在在线与能否与联络人交谈。

最早的即时通信软件是ICQ,ICQ是英文中I seek you的谐音,意思是我找你。四名以色列青年于1996年7月成立Mirabilis公司,并在11月份发布了最初的ICQ版本,在六个月内有85万用户注册使用。

在因特网上受欢迎的即时通信服务包含了MSN Messenger、AOL Instant Messenger、Yahoo! Messenger、NET Messenger Service、Jabber、ICQ 与QQ。这些服务有赖于许多想法更久的(与普遍)的在线聊天媒介,如Internet Relay Chat一样知名。

1970年代早期,一种更早的即时通信形式是柏拉图系统(PLATO system)。之后在1980年代,UNIX/Linux的交谈实时信息被广泛的使用于工程师与学术界,1990年代即时通信更跨越了因特网交流。1996年11月,ICQ是首个广泛被非UNIX/Linux使用者用于因特网的即时通信软件。在ICQ的介绍之后,同时在许多地方有一定数量的即时通信方式发展,且各式的即时通信程序有独立的协议,无法彼此互通。这引导使用者同时执行两个以上的即时通信软件,或者他们可以使用支持多协议的终端软件,如Gaim、Trillian或Jabber。

1.2 国内外研究现状

1.2.1 国外研究现状

当今,国际上对网络通信系统研究的较好的公司有,思科,Sun,Ms等公司,思科主要研究的是底层的传输;MS,Sun公司研究的是应用层。其中ms公司凭借其在操作系统的垄断地位,为了在网络的发展中取得先机,采用了各种各样的手段。但是,其捆绑的msn,无论从功能上,还是技术上来说,都不算是非常先进的。当然,ie,同样也不是很受人青睐,这让人想起了,当年的网景公司,网景只是生不逢时。MS不择手段的想打跨网景,可见其对网络的重视。如今,Sun 公司在网络应用上捷足先登,凭借着Java,Sun在网络的应用上领先于MS。微软,想用同样的办法搞跨对手,因此它拿出了Visual c#,来对抗Java。这些都是在应用层面的开发工具。应用层上的产品就更显种类繁多。ICQ几乎是国际上通用的即时通信工具,由于在我国它的应用不是很广,所以,其原理也很少被介绍。msn,是MS的产品,同样在国内没什么市场,所以,对其原理,也很少被讨论过。至于ie,是在Visual c++下开发的产品,虽然有严重的安全隐患,不过,至少能在某种程度上代表当今国际研究的水平。此外,国际上最近出先了新的浏览器Firefox,其性能据说是远高于ie,也许在网络的天下,Ms又有了更强劲的对手。

1.2.2 国内研究现状

国内在应用层上的网络应用软件目前发展异常的火爆,因为我国有着网络应用的最大的市场,现在国内网络的基础性建设发展迅速,应用软件也层出不穷,其中,在游戏的领域中,网络通信的工作做的不错,如联众游戏平台,还有其他的一些平台,这些平台基本上都是基于VC++的,用的都是Socket通信,但是为了效率,这些平台没有用MFC提供的CSocket类,而是直接用Socket进行通信。所以效率上不错。此外,tencent的即时通信,也是做的很好的,从某中程度上来说,代表了国内最高的水平。

1.3 本课题的研究方法

本系统采用C/S(Client/Server)结构进行设计,使用SQL Server 2000构建数据库,并在.NET环境下使用Visual C#.net语言和SOCKET套接字开发一个基于TCP协议的简单即时通信软件,实现简单的即时聊天,文件传输等功能。

2 相关技术介绍

2.1 .NET开发平台及C#.NET开发语言

NET框架是Microsoft公司推出的一种全新的开发平台,提供了统一的、面向对象并且可以扩展的编程类库和完善的集成开发环境,大大简化了应用程序的开发过程,并且具有良好的移植性和安全性。

微软为了推行.NET战略,特别为.NET平台设计了一种语言——C#。C#是由C和C++派生而来的一种“简单、流行、面向对象、类型安全”的程序设计语言,其综合了Visual basic的高效率和C++的强大功能,然而更多的人感觉C#更类似JA V A。

2.2 TCP协议

2.2.1 TCP/IP网络协议

协议是对等的网络实体之间通信的规则,可以简单地理解为网络上各计算机彼此交流的一种“语言”。网络通信协议设计的基本原则是层次化,层和协议的集合被称为网络体系结构。相邻层之间的接口定义了下层向上层提供的基本操作和服务,下层向上层提供的服务分两种形式:面向连接的服务和无连接的服务。

计算机网络中已经形成的网络体系结构主要有两个:OSI参考模型和TCP/IP 参考模型。TCP/IP参考模型是因特网(Internet)的基础。和OSI的7层协议相比,TCP/IP协议只有4个层次。通常说的TCP/IP是一组协议的总称,TCP/IP实际上是一个协议族,包括100多个相互关联的协议,其中IP(Internet Protocol, 网际协议)是网络层最主要的协议;TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议是传输层中最主要的协议),一般认为IP、TCP、UDP是最根本的三种协议,是其他协议的基础。

2.2.2 TCP——传输控制协议:面向连接的通信可以使用可靠通信,在这时候,第四层协议发送数据接收方的确认,如果未收到数据或者数据被损坏,则请求重新传输。TCP协议就使用这种可靠通信。使用TCP协议的应用层协议包括HTTP、FTP、SMTP和Telnet等。

现在可以发送和接收消息了。接收消息后,总是返回ACK消息。如果在收到ACK之前发送方已经超时,则消息将被放到重发队列中以再次发送。

由于它的握手机制,所以TCP协议比较复杂并且费时,但此协议在处理数据时对数据包的传送有保障,从而使得在应用程序协议中不需要再包括该功能。2.3 套接字

套接字这个术语并没有定义某个协议:它具有两层含义,但两者都与一个协议相关。第一个含义是套接字编程API,它最初由伯克利大学为BSD UNIX而创建。BSD套接字在经过修改后被用作Windows环境的编程接口(并且被命名为WinSock)。WinSock API被包装在https://www.sodocs.net/doc/2c13071716.html,.sockets命名空间的.NET类中。Windows Sockets 是一个独立于协议的编程接口,用于编写网络应用程序。

2.4 流

2.4.1 流的基本概念

流的概念已经存在很长时间了。流是一个用于传输数据的对象。数据的传输有两个方向:

1)如果数据从外部源传输到程序中,这就是读取流。

2) 如果数据从程序传输到外部源,这就是写入流。

外部源常常是一个文件,但也不完全都是文件,它还可以是:

1) 网络,使用一定的网络协议与网络上其它计算机或终端交换数据。

2)一个指定的管道。

3) 一块内存区域。

2.5 同步、异步、阻塞和非阻塞

同步(synchronous):所谓同步方式,就是发送方发送数据包以后,不等接受方响应,就接着发送下一个数据包。

异步(asynchronous):异步方式就是当发送方发送一个数据包以后,一直等到接受方响应后,才接着发送下一个数据包。

阻塞(Block):指执行此套接字的网络调用时,直到调用成功才返回,否则此套节字就一直阻塞在网络调用上,比如调用StreamReader 类的Readlin ( )方法读取网络缓冲区中的数据,如果调用的时候没有数据到达,那么此Readlin ( )方法将一直挂在调用上,直到读到一些数据,此函数调用才返回。

非阻塞(Unblock):指在执行此套接字的网络调用时,不管是否执行成功,都立即返回。同样调用StreamReader 类的Readlin ( )方法读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。

在Windows网络通信软件开发中,最为常用的方法就是异步非阻塞套接字。平常所说的C/S(客户端/服务器)结构的软件采用的方式就是异步非阻塞模式的。

其实在用C#进行网络编程中,我们并不需要了解什么同步、异步、阻塞和非阻塞的原理和工作机制,因为在.Net FrameWrok SDK中已经已经把这些机制给封装好了。

3.系统总体设计 3.1 需求分析

软件针对局域网内部用户,实现用户间的即时通信。需要分别实现服务器端和客户端的软件设计。

服务器端负责监听用户连接请求,负责连接数据库存储用户信息,负责发送给用户好友信息,负责发送心跳报文检查用户在线状态并即时让用户更新好友在新信息。

客户端发起主动连接,向服务器请求登录或者注册。客户端可以修改昵称,可以加已知用户为好友(类似于MSN的好友添加功能)。客户端之间可以发起P2P模式的聊天,可以传送文件。

3.2 系统基本架构

基于C/S架构的即时通信软件便于对用户信息进行统一管理和保存,面向特定的用户,对信息的安全控制能力很强。为了减轻服务器负担,客户端之间的信息传递是采用P2P模式的,服务器只负责用户的注册,登录和用户在线状态的检验。基本结构如图:

3.3 功能模块设计

CLIENT:

1.注册:

(1)可以完成客户端注册,客户端可以通过填写信息进行注册,信息被发送到

服务器端。

2.登录:

(1)客户可以输入账号和密码进行登录,客户端会发送登录信息等待服务器响应,登录成功后会发出登录成功信息并刷新好友列表。

3.修改:

(1)密码修改:应该有密码修改功能

(2)信息修改:可以更改一些注册信息

4.通信:

(1)即时聊天模块:客户端与客户端之间建立线程进行即时聊天,也包含有简

单的对称加解密算法功能。

(2)好友列表:可以对好友列表进行添加删除等动作。

5.文件传输:

(1)文件传输:文件传输功能 SERVER:

1.注册回应:

对客户端传送的注册信息进行判断。

(1)HASH加密:对用户的账号和密码信息进行HASH加密

(2)重复用户检查:将加密后信息与已存在账号进行比较,检查是否账号已存在,如果存在就返回错误信息

(3)注册成功:将可成功注册的用户账号和密码写入数据库内,并向客户端返回成功信息

2.修改回应:

(1)对密码和信息修改请求进行判断,执行和返回修改成功信息。

3.登录回应:

(1)对登录的账号和密码进行加密检查后发回正确或错误情况,并记录上线信息。

(2)好友列表发送:给成功登录的账号发送好友列表及好友上线信息。

(3)上线信息发送:给成功登录的账号的好友发送在线信息(包括IP,端口等等信息)。

4.在线情况:

(1)对登录,在线,离线的用户情况进行统计,记录和通知

(2)心跳测试:每隔一段时间发送报文测试用户是否因意外原因离线

(3)情况记录:将用户登录时间,IP,下线时间等信息记录入数据库

3.4 逻辑图:

3.5 数据库设计

3.5.1 实体关系图

服务器是作为记录和读取数据库信息的载体,与客户端关系并不复杂,这里需要重点考虑客户端之间的关系。用户与用户之间的关系是较为特殊的递归关系,即描述发生在两个相同实体上的关系。

4 系统实现

4.1 使用XML定义的即时通信协议

4.1.1 信息结构MESSAGE.CS&UMESSAGE.CS

这两个C#类定义了包括服务器信息,状态信息,注册信息,登录信息,聊天信息或者请求文件传输信息的函数,服务器和客户端通过将它们实例化和序列化再转换成流在网络上进行传输。UMESSAGE.CS主要代码如下:

[Serializable]

public class UMessage {

public UMessage(){ }

private string _nickname;

private string _password;

private string _accounts;

private string _email;

private int _info;//表示注册或者登录信息,客户端信息0为注册,1为登录;服务器返回信息0为用户已存在,1为注册成功,2为服务器未知错误,3为CLIENT 在线检查,10为登录失败,11为登录成功

private Friend[] _friend;

private int _fn;

private string _fg;

public string Nickname

{

get { return _nickname; }

set { _nickname = value; }

}

public string Password

{

get { return _password; }

set { _password = value; }

}

public string Accounts

{

get { return _accounts; }

set { _accounts = value; }

}

public string Email

{

get { return _email; }

set { _email = value; }

}

public int Info

{

get { return _info; }

set { _info = value; }

}

public Friend[] Fri

{

get { return _friend; }

set { _friend = value; }

}

public int Fn

{

get { return _fn; }

set { _fn = value; }

}

public string Fg

{

get { return _fg; }

set { _fg = value; }

}

}

由于MESSAGE.CS与UMESSAGE.CS类似,在此不再详述。

服务器和客户端都可以通过相同的代码对UMESSAGE赋值,再通过XmlSerializer方法进行将UMESSAGE序列化为XML文档,最后将XML文档转化为网络流进行传输。代码如下:

#region 将登录信息转为UMessage

private void Traslator()

{

_message.Accounts=this.TextBox1.Text;

_message.Nickname="";

_message.Password=this.TextBox2.Text;

_message.Email="";

_https://www.sodocs.net/doc/2c13071716.html,=1;

_message.Fri=null;

}

#endregion

4.1.2 数据结构FriendStruct

服务器如果保存和传递用户的好友信息是难点之一。数据库的设计和信息的传递辨别都是比较难实现的。

在数据库方面,每个用户拥有各自的好友分组信息(UserFav),分组中间使用“,”分隔,在TCP_FriendInfo表中则分别保存了用户ID和好友ID,使用一个INT字段保存分组信息。数据库以用户ID为标准对好友ID和分组信息进行内连接查询,就可以得到基本的好友信息了。代码如下:

select * from TCP_UserInfo join TCP_FriendInfo on TCP_https://www.sodocs.net/doc/2c13071716.html,erID='" + uid + "' and TCP_https://www.sodocs.net/doc/2c13071716.html,erID=TCP_FriendInfo.FriendID

在好友信息的传输方面,首先定义一个FriendStruct数据结构(当然也可以用枚举完成)如下:

using System;

using System.Collections.Generic;

using System.Text;

namespace TCP

{

public class FriendStruct

{

public struct FileInfo {

public int filere;//接收和拒绝信息,1为接收,2为拒绝,3为取消 public string filename;

public long filelength;

}

}

public struct Friend

{

public string account;

public string nickname;

public string IP;

public string status;

public string fg;//好友分组

}

}

在MESSAGE.CS或者UMESSAGE.CS中,我们则定义了FriendStruct的数组。在C#中使用DATAREADER语句可以逐句读取数据库查询的结果,再依次将结果赋值FriendStruct数组元素,就得到了便于发送和读取的存放好友信息的数组。赋值代码如下:

while (getf.Read()) //getf即是以上的数据库查询的datareader语句

{

ff[i].account=getf["UserAccount"].ToString();

ff[i].IP = getf["UserIP"].ToString();

ff[i].nickname = getf["UserNickname"].ToString();

ff[i].status = getf["UserOnline"].ToString();

ff[i].fg = getf["FriendGroup"].ToString();

i++;

}

getf.Close();

4.2 数据库连接类

实现一个快捷简单的数据库连接的相关代码是非常有必要的。实现的途径也多种多样,鉴于安全性和复杂性的需求不同,实现方法有简有繁。本设计使用了一个简单的类(UserData.CS)实现了简单快捷的数据库连接和读取。主要代码如下:

public static SqlConnection connStr = new

SqlConnection("Server=D96B85DD938A465.;uid=sa;pwd=change;database=TC PDB");

public static SqlDataReader SqlReader(string sql, SqlConnection connstr) {

SqlDataReader sqldr = null;

SqlCommand cmd = new SqlCommand(sql, connstr);

if (cmd.Connection.State.ToString() == "Closed") cmd.Connection.Open( );

try

{

sqldr = cmd.ExecuteReader();

}

catch (Exception e)

{

catch (Exception e)

{

if (e != null) sqldr = null;

}

return sqldr;

}

//数据库操作连接

public static string SqlCmd(string sql, SqlConnection connstr)

{

string errorstr = null;

SqlCommand sqlcmd = new SqlCommand(sql, connstr);

if (sqlcmd.Connection.State.ToString() == "Open") sqlcmd.Connection.Close();

sqlcmd.Connection.Open();

try

{

sqlcmd.ExecuteNonQuery();

}

catch (Exception e)

{

if (e != null) errorstr = e.ToString();

}

sqlcmd.Connection.Close();

return errorstr;

}

在UserData.CS的基础上,主程序可以更方便地实现数据库连接操作,对数据库进行读写和更新,在此不再详述。

4.3 服务器端

服务器端的界面设计是基于便于测试的目的而实现的。如下图:

4.3.1 同步套接字网络监听

基于同步套接字的网络监听器对服务器来说并不是最好的解决方案,但是仍然可行并且实现简单。主要代码如下:

开启监听端口:

public void Serve()

{

int port = 8888;

ServerIPEP = new IPEndPoint(IPAddress.Any, port);

s = new Socket(ServerIPEP.AddressFamily, SocketType.Stream, ProtocolType .Tcp);

s.Bind((EndPoint)ServerIPEP);

s.Listen(10);

alSock = new ArrayList();

以下代码读取连入的连接,依次将连接加入可变长数组alsock,并且读取传入的信息,进行反串行化:

while (true)

{

try

{

uc = s.Accept();

alSock.Add(uc);

this.tb_states.AppendText(System.Convert.ToString(uc));

byte[] data = new byte[2048];

int rect = uc.Receive(data);

byte[] chat = new byte[rect];

Buffer.BlockCopy(data, 0, chat, 0, rect);

UMessage umessage = (UMessage)_translator.Deserialize(new MemoryS tream(chat));

int info = https://www.sodocs.net/doc/2c13071716.html,;

对反串行化后的信息进行处理,通过info参数辨认客户端行为(注册或者登录),对注册的信息进行数据库查询,注册信息可插入,则将用户信息插入数据库,否则返回客户端“注册出错”的信息:

#region 处理用户注册信息

if (info==0)//分辨出用户发送的是注册信息

{

string Accounts = umessage.Accounts;

SqlDataReader usdr = FPara.SqlReader("select * from TCP_UserInfo where UserAccount='" + Accounts + "'", FPara.connStr);

if (usdr != null)

{

if (usdr.Read())

{

#region 此处写入返回注册失败的代码

Socket sc = (Socket)alSock[alSock.IndexOf(uc, 0)];

sc.Send(chat);

#endregion

}

else

{

#region 此处写入插入数据库用户注册信息的代码

Stream ms = new MemoryStream();

Socket sc = (Socket)alSock[alSock.IndexOf(uc, 0)]; if (FPara.SqlCmd("insert into TCP_UserInfo (UserAccount,UserNickname,UserEmai l,JoinDate,UserIP,UserPassword) values('" + umessage.Accounts + "','" + umessage.N ickname + "','" + umessage.Email + "','" + System.DateTime.Now.ToString() + "','" + ((IPEndPoint)uc.RemoteEndPoint).Address.ToString() + "','" + umessage.Password + "')", FPara.connStr) == null)

{

https://www.sodocs.net/doc/2c13071716.html, = 1;

_translator.Serialize(ms, umessage);

byte[] d = new byte[ms.Length];

ms.Seek(0, SeekOrigin.Begin);

ms.Read(d, 0, d.Length);

sc.Send(d);

}

else

{

https://www.sodocs.net/doc/2c13071716.html, = 2;

_translator.Serialize(ms, umessage);

byte[] d = new byte[ms.Length];

ms.Seek(0, SeekOrigin.Begin);

ms.Read(d, 0, d.Length);

sc.Send(d);

}

#endregion

}

usdr.Close();

}

}

#endregion

如果发现用户发送的是登录信息,就根据登录信息中的用户名和密码判断是否存在用户,密码是否正确,成功后再查询出用户的好友信息并且赋值给FriendStruct,再将信息返回给客户端:

#region 处理用户登录信息

else if (info == 1)//分辨出用户发送的是登录信息

string Accounts = umessage.Accounts;

string Password = umessage.Password;

SqlDataReader usdr = FPara.SqlReader("select * from

TCP_UserInfo where UserAccount='" + Accounts + "' and UserPassword='"+Passwor d+"'", FPara.connStr);

if (usdr != null)

{

if (usdr.Read())

{

string uid=usdr["UserID"].ToString();

umessage.Fg = usdr["UserFav"].ToString();

usdr.Close();

SqlDataAdapter sdr = new SqlDataAdapter("select * from TCP_User Info join TCP_FriendInfo on TCP_https://www.sodocs.net/doc/2c13071716.html,erID='" + uid + "' and TCP_UserInfo .UserID=TCP_FriendInfo.FriendID", FPara.connStr);

DataSet ds = new DataSet();

sdr.Fill(ds, "find");

int xxx=ds.Tables["find"].Rows.Count;

FPara.SqlCmd("update TCP_UserInfo set UserIP='" + ((IPEndPoint) uc.RemoteEndPoint).Address.ToString() + "' , UserOnline=1 where UserAccount='" + Accounts + "'", FPara.connStr);

ff=new Friend[xxx];

int i=0;

SqlDataReader getf = FPara.SqlReader("select * from TCP_UserInfo

join TCP_FriendInfo on TCP_https://www.sodocs.net/doc/2c13071716.html,erID='" + uid + "' and TCP_https://www.sodocs.net/doc/2c13071716.html, erID=TCP_FriendInfo.FriendID", FPara.connStr);

while (getf.Read())

{

ff[i].account=getf["UserAccount"].ToString();

ff[i].IP = getf["UserIP"].ToString();

ff[i].nickname = getf["UserNickname"].ToString();

ff[i].status = getf["UserOnline"].ToString();

ff[i].fg = getf["FriendGroup"].ToString();

i++;

}

getf.Close();

#region 此处写入登录成功代码

Stream ms = new MemoryStream();

Socket sc = (Socket)alSock[alSock.IndexOf(uc, 0)]; this.lb_users.Items.Add(alSock.IndexOf(uc).ToString());

https://www.sodocs.net/doc/2c13071716.html, = 11;

umessage.Fri = ff;

umessage.Fn = xxx;

_translator.Serialize(ms, umessage);

byte[] d = new byte[ms.Length];

ms.Seek(0, SeekOrigin.Begin);

ms.Read(d, 0, d.Length);

sc.Send(d);

//在tb_status中写入服务器返回给客户端的代码便于测试观察

this.tb_states.AppendText(System.Text.Encoding.Default.GetString(d));

#endregion

}

else

{

usdr.Close();

#region 此处写入登录失败代码

Stream ms = new MemoryStream();

Socket sc = (Socket)alSock[alSock.IndexOf(uc, 0)];

https://www.sodocs.net/doc/2c13071716.html, = 10;

_translator.Serialize(ms, umessage);

byte[] d = new byte[ms.Length];

ms.Seek(0, SeekOrigin.Begin);

ms.Read(d, 0, d.Length);

sc.Send(d);

#endregion

}

}

}

#endregion

Tb_states是个用于监视SOCKET传入信息的文本框,便于观察和测试相关信息: this.tb_states.AppendText("[" + uc.RemoteEndPoint.ToString() + "]" + S ystem.Text.Encoding.Default.GetString(chat));

}

catch (Exception ex) {

MessageBox.Show(ex.Message);

}

}

}

以上代码也包含了对客户端的请求信息的判断和对客户端返回信息的生成和传输。

4.3.2 多线程

对于服务器来说,多线程是必不可少的,否则它将无法处理不断请求的新连接。C#的System.Threading提供了多线程编程的支持。本设计实现代码如下:

this.th = new Thread(new ThreadStart(Serve));//新建一个用于监听的线程

th.Start();//打开新线程

不仅仅是服务器,基于P2P模式聊天的客户端也必须支持多线程运行,实现代码与之类似,在客户端设计说明中将不再叙述。

4.3.3 计时器

计时器用于实现心跳报文的功能,服务器在启动以后就开始计时,每隔一定时间就向所有连入的客户端发送信息,核心代码如下:

//用计时器检查客户端是否掉线

System.Timers.Timer aTimer = new System.Timers.Timer();

aTimer.Elapsed += new ElapsedEventHandler(CheckStatus);

// 设置引发时间的时间间隔此处设置为5秒(5000毫秒)

aTimer.Interval = 5000;

aTimer.Enabled = true;

CheckStatus就是用于向客户端发送检查信息的方法,它会向遍历连入的客户端(alSock),然后依次向客户端发送信息,如果发现客户端没有响应,就会如果发现对方无回应,则关闭相应的SOCKET,并更新数据库的用户在线状态,同时向该用户的所有好友发送用户已下线的通知。

4.4 客户端

4.4 客户端

图5 注册界面

图6 登录、聊天、文件传输界面

4.4.1 同步套接字客户端

客户端发起同步套接字连接,并传送登录或者注册信息,由于两者方式类似,这里仅列出用户登录的代码:

#region 发送服务器登录信息,并接收服务器反馈信息 public void Client() {

建立SOCKET发送信息:

try

{

IPEndPoint ServerIPEP = new

IPEndPoint(IPAddress.Parse("222.18.170.16"),8888);

c = new

Socket(ServerIPEP.AddressFamily,SocketType.Stream,ProtocolType.Tcp);

c.Connect((EndPoint)ServerIPEP);

s = new MemoryStream();

_translator.Serialize(s,_message);

byte[] d=new byte[s.Length];

s.Seek(0, SeekOrigin.Begin);

s.Read(d, 0, d.Length);

int i = c.Send(d, 0, d.Length, SocketFlags.None);

}

catch(Exception ex)

{

MessageBox.Show(ex.Message);

}

以下代码读取了服务器返回给客户端的信息(注册和登录的成功与失败),如果返回了登录成功的信息,还会读取服务器给出的FriendStruct结构以得到用户的好友信息:

#region 接收反馈信息

byte[] data = new byte[2048];

while(true)

{

int rect = c.Receive(data);

byte[] chat = new byte[rect];

Buffer.BlockCopy(data,0,chat,0,rect);

UMessage bumessage = (UMessage)_translator.Deserialize(new MemoryStream(chat ));

string[] fg;

string _fg=bumessage.Fg;

if(https://www.sodocs.net/doc/2c13071716.html,==3)

{

}

else if(https://www.sodocs.net/doc/2c13071716.html,==11)

{

fg=_fg.Split(',');

int xxx=bumessage.Fn;

ff=bumessage.Fri;

for(int i=0;i

{

string[] ems=new string[5];

ems[0]=ff[i].account;

ems[1]=ff[i].nickname;

ems[2]=fg[int.Parse(ff[i].fg)];

ems[3]=ff[i].IP;

ems[4]=ff[i].status;

ListViewItem item = new ListViewItem(ems);

this.listView1.Items.Add(item);

}

CSERVER是一个用于开启监听P2P信息的方法,客户端在登录成功以后就会立刻开启监听器,才能够实现与其它客户端的聊天:

Th = new Thread(new ThreadStart(CServer));//新建一个用于监听其它客户端信息的线程

th.Start();//打开新线程

MessageBox.Show(bumessage.Accounts+"登录成功!");

this.Button1.Enabled=false; this.Button3.Enabled=false;

}

else if (https://www.sodocs.net/doc/2c13071716.html,==2)

{

MessageBox.Show("服务器未知错误");

}

else

{MessageBox.Show(https://www.sodocs.net/doc/2c13071716.html,.ToString());}

} #endregion

} #endregion

客户端之间的聊天同样使用了序列化的XML文档,用户在登录成功后就会启动一个新的监听器去监听其它客户端传入的聊天信息并且进行判断再将其它用户的聊天信息显示在界面上。这里也不再阐述代码。

.4.2 采用异步套接字的文件传输

文件传输是通过一个类库实现的。由于文件传输的代码实现复杂,通过类库可以大量的简化代码,使主程序简洁易懂。类库https://www.sodocs.net/doc/2c13071716.html,working包括了ClientBase.cs,ClientInfo.cs,Delegates.cs,INPClient.cs,INPServer.cs,ClientBase.cs定义了基础的文件发送函数,INPClient.cs则仅包含初始化文件

送的函数;ServerBase.cs和INPServer.cs则是反之亦然。核心代码如下:ClientBase.cs:这个类实现了套接字的开启和数据的传输

ClientBase.cs:这个类实现了套接字的开启和数据的传输

using System;

using https://www.sodocs.net/doc/2c13071716.html,;

using https://www.sodocs.net/doc/2c13071716.html,.Sockets;

namespace https://www.sodocs.net/doc/2c13071716.html,working {

///

/// ClientBase摘要.

///

public class ClientBase

{

private const int BUFFERSIZE = 4*1024;

private int _port; private string _serverIP;

private Socket _mainSoc;

private ClientInfo _info;

private AsyncCallback _dataRecievedCallback;//异步回调方法

public event NetworkEventHandler DataRecieved;//定义一个事件:接收到数据时引发事件

public ClientBase(string serverIP,int port)

{

_serverIP = serverIP;

_port = 11000;

_mainSoc = new Socket(

AddressFamily.InterNetwork,

SocketType.Stream,

ProtocolType.Tcp);

_info = new ClientInfo(

_mainSoc,

new byte[BUFFERSIZE]);//ClientInfo包含了建立的套接字和套接字读取的BYTE大小

_dataRecievedCallback = new

AsyncCallback(OnDataRecieved);//异步回调

}

// 可重写为其它超类实现更强大的功能,例如断点续传

public virtual void OnDataRecieved(byte[] data)

{

if (DataRecieved != null)

{

DataRecieved(this,

new NetworkEventArgs(_info));

}

}

public void Send(byte[] data)

{

_mainSoc.Send(data);//发送数据

}

public void Connect()//建立与远程主机的连接 {

_mainSoc.Connect(

new IPEndPoint(

IPAddress.Parse(_serverIP),

_port));

}

public void Disconnect()//关闭连接

{

if (_mainSoc.Connected)

_mainSoc.Shutdown(SocketShutdown.Both); }

public void WaitForData()

{

// 垃圾回收

GC.Collect();

int byteCount = 0;

byteCount = _mainSoc.EndReceive(ar);

if (byteCount == 0)

{ // 服务器断开连接.

} else

{

OnDataRecieved(_info.Buffer);//接收到了数据 WaitForData();

}

}

}

}

INPClient.cs 派生类INPClinet:

using System; using System.IO;

namespace https://www.sodocs.net/doc/2c13071716.html,working

{

///

/// INPClient的摘要. ///

public class INPClient :

ClientBase

{

public INPClient(string serverIP,int port) :

base(serverIP,port) ;

{}

public void SendFile(string fileName)//发送文件类,开启一个文件流,将文件流依次读入,再使用CLIENTBASE类中的数据发送方法进行发送 {

FileStream fs = new FileStream(

fileName,FileMode.Open);//根据传入的参数打开文件

byte[] im = new byte[fs.Length];//根据文件长度定义一个BYTE

fs.Read(im,0,im.Length);//将文件流中读取字节块写入相应缓冲区 base.Send(im);//使用基类(CLIENTBASE)的数据发送方法进行文件传送 }

}

}

INPSERVER和SERVERBASE与INPCLIENT和CLIENTBASE类似。

结论

即时通信是是网络发展的必然趋势,它的技术仍然在不断的改进和蓬勃发展中。本次设计虽然实现了简单的即时通信功能,但是从很多方面来说都是不完善的:实现了字符聊天却没有实现多媒体即时通信;实现了同步套接字聊天和异步套接字传送文件却没有实现更科学的异步套接字聊天和同步套接字传送文件。

在本次设计中,我深刻体会到SOCKET编程的基础性,多样化。由于与网络紧密联系,SOCKET编程的也可能出现各种未知的问题,需要我们更深入地了解网络协议和架构,才可能做出通用性高,稳定性高的即时通信程序。

参考文献

[1] Tobin. Titus, Fabio Claudio Ferracchiati. C#线程参考手册[M].王敏译.北京:清华大学出版社,2003。

[2] 黄承安,谢东文,许聪. C#网络应用案例导航[M].北京:中国铁道出版社,2003。

[3] Andrew Krowczyk, vinod Kumar. .NET网络高级编程[M].北京:清华大学出版社,2003。 [4] 周存杰. Visual C# .NET网络核心编程[M].北京:清华大学出版社,2002。 [5] 方睿,吴四九,刁仁宏. 网络数据库原理及应用[M].四川:四川大学出版社,2005。 [6] 李文志,申剑,卢方国,柳正青,王宏,陈建伟. 在.NET框架下开发一个即时通信系统[J].现代计算机.2004(2):68-72。

[7] 王跃. INTERNET上大规模用户即时通信方法研究[D].北京:北京工业大学[硕士论文],2004。

即时通讯软件的发展及其现状

摘要 近一、两年来,即时通讯软件(InstantMessenger)的发展突飞猛进。在短短的几年内,网络即时通信大有取代传统通信方式之势。继电子邮件之后,即时通讯对我们的通信方式又进行了一场革命,这种革命甚至延续到了我们的感情领域,只要双方都在互联网上。即时通讯所拥有的实时性、跨平台性、成本低、效率高等诸多优势,使之日益受到网民们的喜爱。随着互联网成长起来的“e一代”,在交换联系方式时已经习惯了交换QQ号。 本文介绍了网络即时通讯软件的发展过程及现状,五种最常用的即时通讯软件,以及即时通讯软件的最新发展。 关键字:即时通讯;网络发展;软件

目录 摘要 (1) 一、即时通讯 (3) (一)概要 (3) (二)即时通讯软体 (4) 二、国内常用的五种即时通讯软件 (4) (一)QQ (4) (二)MSN (5) (三)阿里旺旺 (6) (四)百度hi (6) (五)POPO (7) 三、即时通信软件的现状 (8) 四、即时通信行业发展趋势 (9) 五、总结 (10)

一、即时通讯 即时通讯(Instant messaging,简称IM)是一个终端服务,允许两人或多人使用网路即时的传递文字讯息、档案、语音与视频交流。分电话即时通讯手机和网站即时通讯代表百问https://www.sodocs.net/doc/2c13071716.html,,手机即时通讯代表是短信,视频即时通讯如QQ,MSN,百度hi等应用形式。 (一) 概要 即时通讯是一个终端连往一个即时通讯网路的服务。即时通讯不同於e-mail在於它的交谈是即时的。大部分的即时通讯服务提供了presence awareness的特性──显示联络人名单,联络人是否在缐上与能否与联络人交谈。 在早期的即时通讯程式中,使用者输入的每一个字元都会即时显示在双方的萤幕,且每一个字元的删除与修改都会即时的反应在萤幕上。这种模式比起使用e-mail更像是电话交谈。在现在的即时通讯程式中,交谈中的另一方通常只会在本地端按下送出键(Enter或是Ctrl+Enter)後才会看到讯息。 在网际网路上受欢迎的即时通讯服务包含了MSN Messenger、AOL Instant Messenger、Yahoo! Messenger、NET Messenger Service、Jabber、ICQ与QQ。这些服务有赖於许多想法更久的(与普遍)的缐上聊天媒介,如Internet Relay Chat一样知名。 1970年代早期,一种更早的即时通讯形式是柏拉图系统(PLATO system)。之後在1980年代,UNIX/Linux的交谈即时讯息被广泛的使用於工程师与学术界,1990年代即时通讯更跨越了网际网路交流。1996年11月,ICQ是首个广泛被非

关于阿里钉钉软件使用分析范文

关于阿里钉钉软件的使用报告 一、阿里钉钉软件功能介绍 钉钉由阿里巴巴集团于2014年1月筹划启动,由阿里巴巴来往产品团队打造,提出的口号是“专注于提升中国企业的办公与协同效率”,目前通过近20个版本的更新,已经更新至3.4.6版本。 1.1、即时聊天工具 即时聊天工具,消息可以发送语音和短信,可以多平台同步,并依赖手机实现消息必达,消息可查看被查阅状态,在软件中这种即时聊天工具被称为“DING”,发出的DING消息将会以免费电话、免费短信、系统提醒等的方式通知到对方,无论对方是否安装钉钉,都可以做出回应,并及时显示。消息也可以设置成为匿名模式即软件中的“密聊”,进入密聊,头像和昵称都会打码(截屏无用);所有消息阅读后30秒自动焚毁,消息不允许复制、转发,不留存,有三个私密等级可以设置。 1.2、企业群和通讯录 企业群和通讯录,通讯录实名制,组织机构可以分级管理,人员激活采用短信方式;

1.3、会议系统 移动电话会议系统和视频会议,支持多方移动通话会议,有条件免费使用。 1.4、公告 公告,支持公告发送到不同终端,也可转化为必答消息,可查看查阅状态,公告可以设为加密方式; 1.5、智能设备 主要为外接打卡机或者手机登设备 1.6、签到考勤 签到考勤,支持地图实时GPS定位提交考勤位置,支持无线WIFI接入提交,支持实拍现场图像见证; 1.7、钉盘功能 钉盘功能、钉盘提供企业内部人员使用,云盘数据可转化为消息传阅,所有数据可以导出; 1.8、审批 流程审批,可灵活设置审批事项和审批人,并可自定义设置或新增审批事项并可统计查询。

1.9、日志 工作日志,可实现员工工作日报、周报、月报等工作汇报,可查看统计。 1.10、报表 智能报表,提供给管理员及负责人查询统计各种数据情况; 1.11、开放接口 开放开发平台,可以自主开发微应用,通过加密接口,可和公司内部系统进行数据交互; 1.12、权限设置 权限可以分级管理功能,云盘分区安全存储功能; 1.13、其他应用 数据采用加密存储和传输,云端安全防护(需使用第三方付费开发软件);多中企业管理软件(第三方有条件免费使用) 1.14、支持平台 IOS(苹果手机系统)、Android(安卓手机系统)、Windows、MAC(苹果电脑操作系统),提供手机端及PC后台管理功能。

设计单片机通讯协议论文(非常经典)

如何设计单片机常用通信 协议论文

目录 1.自定义数据通信协议 (3) 2.上位机和下位机中的数据发送 (3) 3.下位机中的数据接收和协议解析 (4) 4.上位机中的数据接收和命令处理 (8) 5.总结 (9)

单片机通信协议现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。其中就涉及到通信的过程。在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等。 1.自定义数据通信协议 这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上, 底层软件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全部建立在这两个操作方法之上。通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。 帧头和帧尾用于数据包完整性的判别,通常选择一定长度的固定字节组成,要求是在整个数据链中判别数据包的误码率越低越好。减小固定字节数据的匹配机会,也就是说使帧头和帧尾的特征字节在整个数据链中能够匹配的机会最小。通常有两种做法,一、减小特征字节的匹配几率。二、增加特征字节的长度。通常选取第一种方法的情况是整个数据链路中的数据不具有随即性,数据可预测,可以通过人为选择帧头和帧尾的特征字来避开,从而减小特征字节的匹配几率。使用第二种方法的情况更加通用,适合于数据随即的场合。通过增加特征字节的长度减小匹配几率,虽然不能够完全的避免匹配的情况,但可以使匹配几率大大减小,如果碰到匹配的情况也可以由校验码来进行检测,因此这种情况在绝大多说情况下比较可靠。 地址信息主要用于多机通信中,通过地址信息的不同来识别不同的通信终端。在一对多的通信系统中,可以只包含目的地址信息。同时包含源地址和目的地址则适用于多对多的通信系统。 数据类型、数据长度和数据块是主要的数据部分。数据类型可以标识后面紧接着的是命令还是数据。数据长度用于指示有效数据的个数。 校验码则用来检验数据的完整性和正确性。通常对数据类型、数据长度和数据块三个部分进行相关的运算得到。最简单的做法可是对数据段作累加和,复杂的也可以对数据进行CR C运算等等,可以根据运算速度、容错度等要求来选取。 2.上位机和下位机中的数据发送 物理通信层中提供了两个基本的操作函数,发送一个字节数据则为数据发送的基础。数据 包的发送即把数据包中的左右字节按照顺序一个一个的发送数据而已。当然发送的方

即时通讯工具的异同

即时通讯工具的异同 不同点 腾讯QQ 腾讯是中国最早的互联网即时通信软件开发商,是中国的互联网服务及移动增值服务供应商,并一直致力于即时通信及相关增值业务的服务运营。腾讯QQ已形成为国内用户最多的个人即时通信工具,2004年腾讯QQ推出了2004Beta2新版本,在软件功能上作了较大的改进,它的发展引导着国内即时通讯软件的发展方向。 作为国内即时通讯软件的老大,QQ2004 II Beta2版本增加了多项耳目一新的功能,如魔法表情、影片截图(图14)、多人语音、网络记事本等等。 MSN MSN是微软公司开发的即时聊天工具,由于微软产品用户众多,MSN操作简单运行稳定,因此MSN的普及速度非常之快,现在已经是世界主流的聊天工具,并且功能越来越强大,最近推出了7.0版本。 喜欢写文字的朋友如果拥有MSN的.NET PassPort账号可以去申请MSN最新提供的MSN Spaces空间,让自己也成为网络博客。另外MSN7.0还增加了MSN Today的对话框,可以让用户即时看到MSN网站上提供的最新服务。 雅虎通 雅虎通(Yahoo! Messenger)是一种免费的消息服务,它允许用户与朋友、家人、同事及其他人进行即时的交流。使用即时消息可以与朋友交谈,并能发现他们何时在线。雅虎通内置了股票、新闻、和记分板等选项卡,这样不论用户在何处浏览因特网,都可以始终监视用户所有个性化信息。使用最新的雅虎通6.0版本,还可以获得1G大小的雅虎邮箱。 雅虎通推出了免费向使用6.0版本的用户提供1G邮箱的服务,并且全部免费发送手机短信,它在免费功能上打出了一张亮牌!而在功能上内置了一搜网的搜索引擎,便于用户即时查找网络资源。 TOM-Skype TOM-Skype是TOM在线和Skype Technologies- S.A.联合推出的互联网语音沟通工具。Tom-skype采用了最先进的P2P 技术,为您提供超清晰的语音通话效果,使用端对端的加密技术,保证通讯的安全可靠。您无需进行复杂的防火墙或者路由等设置,就可以顺利安装轻松上手。TOM-Skype可以免费的直接呼叫全世界的朋友的软件,服务提供商是互联网上免费的电话公司。用户只需要花几分钟时间下载软件、注册TOM-Skype账户,便可以插好耳机、麦克风、或者与TOM-Skype配套的USB电话,开始像打电话一样呼叫朋友了。TOM-Skype的功能和前面五款软件相比,聊天和多媒体功能没有那么丰富,而在它所特有的通话功能技术开发上独树一帜,具有领先的P2P技术、穿透防火墙、安全加密、跨平台使用的特点。 新浪UC 新浪UC是新一代开放式即时通讯娱乐平台,它采用自由变换场景、个性在线心情等人性化设计,配合视频电话、信息群发、文件互传、在线游戏等使用户在聊天的同时能边说、边看、边玩,从而带给用户前所未有的聊天新感觉。 新浪UC的用户则可以根据自己在线时间的长短获得免费的网络硬盘空间,最大支持120M,每天免费发送15条手机短信,并可直接用该账户享受新浪网的游戏、多媒体同学录、聊天室等服务。只要打开UC咨询通还可以即时获得最新的新闻信息,查看天气预报等。

五款主流即时通讯软件分析

纵观近年来国内即时通讯软件市场,QQ在较长时间内一直因贴近国人需求而一枝独秀。与此同时,功能越来越强大的MSN Messenger其市场份额也在扩大,Yahoo Messenger也有一定的用户,而在语音通话和界面简洁方面各有特色的Google Talk和Skype,也牢牢抓住了一些网民的心。在接下来的部分中,我们将这5款IM软件进行横向评测。所有参评的软件均已更新到最新版。(Yahoo! Messenger 因8.0 beta 多次安装失败,采用了7.x系列的最新版) 图目前国内用户较常见到的五款主流即时通讯软件 ★联系人容量 Windows Live Messenger 联系人数目从75、150升级到300人,目前是600人,与QQ相当。而Yahoo Messenger在8.0中通过插件,已经可以达到1000人。Google Talk联系人数目和Gmail一样,超过5000,上限未知。Skype联系人上限未见报道,小编多方查询也未知道结果。 500-600的联系人容量对于日常使用来说已经够用,但这个数字经过长时间的积累,也会慢慢耗尽。当然,如果你是IM狂人当然另当别论了。 ★安装程序及安装后文件夹体积 对于功能,当然是强大的好;但是软件体积,还是精简些比较好。QQ和Google Talk在体积方面显然是两个极端:随着QQ功能的逐步增多,比如TM、QQ音乐、3D秀等,腾讯也想把所有的功能都打包进去,自然造成了安装程序和程序文件夹体积的增大。而Google Talk非常简洁,安装文件竟然只有1.3兆,安装后文件夹内居然只有主程序、卸载程序两个文件,可谓精简至极。 图五款IM软件的安装包及安装后体积(单位:兆) 尽管当今宽带普及,用户的硬盘空间也是越来越大,人们大可不必为这几十兆空间太伤头脑;但空间占用超过平均水平太多的IM软件无疑会令相当一批用户感到臃肿。 ★运行内存占用

通信协议

常用通信协议汇总 一、有线连接 1.1RS-232 优点:RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3kΩ~7kΩ。所以RS-232适合本地设备之间的通信。 缺点:(1)接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL 电平不兼容故需使用电平转换电路方能与TTL电路连接。 (2)传输速率较低,在异步传输时,最高速率为20Kbps。 (3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,而发送电平与接收 电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米。 1.2RS-485 RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,现在多采用的是两线制接线方式,这种接线方式为总线式拓朴结构,传输距离一般在1~2km以下为最佳,如果超过距离加"中继"可以保证信号不丢失,而且结点数有限制,结点越多调试起来稍复杂,是目前使用最多的一种抄表方式,后期维护比较简单。常见用于串行方式,经济实用。 1.3CAN 最高速度可达1Mbps,在传输速率50Kbps时,传输距离可以达到1公里。在10Kbps速率时,传输距离可以达到5公里。一般常用在汽车总线上,可靠性高。 1.4TCP/IP 它可以用在各种各样的信道和底层协议(例如T1和X.25、以太网以及RS-232串行接口)之上。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。 1.5ADSL 基于TCP/IP 或UDP协议,将抄表数据发送到固定ip,利用电信/网通现有的布线方式,速度快,性能比较可以,缺点是不适合在野外,设备费用投入较大,对仪表通讯要求高。 1.6FSK 可靠通信速率为1200波特,可以连接树状总线;对线路性能要求低,通信距离远,一般可达30公里,线路绝缘电阻大于30欧姆,串联电阻高达数百欧姆都可以工作,适合用于大型矿井监控系统。主要缺点是:系统造价略高,通信线路要求使用屏蔽电缆;抗干扰性能一般,误码率略高于基带。 1.7光纤方式 传输速率高,可达百兆以上;通信可靠无干扰;抗雷击性能好,缺点:系统造价高;光纤断线后熔接受井下防爆环境制约,不宜直达分站,一般只用于通信干线。 1.8电力载波 1.9利用现有电力线,通过载波方式将模拟或数字信号进行高速传输的技术。由于使用坚固可靠的电力线作 为载波信号的传输媒介,因此具有信息传输稳定可靠,路由合理、可同时复用远动信号等特点,不需要线路投资的有线通信方式,但是开发费用高,调试难度大,易受用电环境影响,通讯状况用户的用电质量关系紧密。 二、无线连接 2.1Bluetooth 蓝牙是一种支持设备短距离通信的无线电技术。它是一种无线数据与语音通信的开放性全球规范,它以低

课程设计RIP路由协议的设计与实现

课程设计 课程设计(论文) RIP路由协议的设计与实现 院(系)名称电子与信息工程学院 专业班级 学号 学生姓名 指导教师 起止时间:

课程设计(论文)任务及评语院(系):电子与信息工程学院教研室:

摘要 RIP协议是一种内部网管协议(IGP),是一种动态路由选择协议,用于自治系统(AS)内的路由信息的传递。RIP协议基于距离矢量算法(DistanceVectorAlgorithms),使用“跳数”(即metric)来衡量到达目标地址的路由距离。这种协议的路由器只关心自己周围的世界,只与自己相邻的路由器交换信息,范围限制在15跳(15度)之内,再远,它就不关心了。RIP应用于OSI 网络七层模型的应用层。各厂家定义的管理距离(AD,即优先级)如下:华为定义的优先级是100,华三定义优先级是100,思科定义的是120。 随着OSPF和IS-IS的出现,许多人认为RIP已经过时了。但事实上RIP也有它自己的优点。对于小型网络,RIP就所占带宽而言开销小,易于配置、管理和实现,并且RIP还在大量使用中。但RIP也有明显的不足,即当有多个网络时会出现环路问题。为了解决环路问题,IETF提出了分割范围方法,即路由器不可以通过它得知路由的接口去宣告路由。分割范围解决了两个路由器之间的路由环路问题,但不能防止3个或多个路由器形成路由环路。触发更新是解决环路问题的另一方法,它要求路由器在链路发生变化时立即传输它的路由表。这加速了网络的聚合,但容易产生广播泛滥。总之,环路问题的解决需要消耗一定的时间和带宽。若采用RIP协议,其网络内部所经过的链路数不能超过15,这使得RIP协议不适于大型网络。 关键词:RIP协议;网络;路由器

基于TCP协议的简单即时通信软件的设计与实现

基于TCP协议的网络通信系统的设计与实现 摘要:网络通信,由于其具有实时性、跨平台性、成本低、效率高等优点而受到广泛的使用。设计并实现一个能够处理多用户进行实时、安全的即时通信系统具有较强的现实意义。即时通信的底层通信是通过SOCKET套接字接口实现的。当前的主流UNIX系统和微软的WINDOWS系统都在内核提供了对SOCKET字接口的支持。使用这个统一的接口,可以编写一个可移植的TCP/IP通信程序。使信息能够在INTERNET上可靠的传输。 本文设计并实现了基于局域网内的简单即时通信系统,系统采用C/S模式,底层通信通过SOCKET套接字接口实现,服务器负责客户端的登录验证,好友信息的保存和心跳报文的发送。客户端采用P2P方式实现消息传递,并能实现文件的传输。本文首先讨论了同步套接字,异步套接字,多线程并发执行任务等;然后阐述了客户端、服务器如何使用XML序列化的消息进行通信。 关键词:即时通信;文件传输;套接字;TCP协议 Abstract :Instant messages have several advantages such as real-time, cross-platform, cheap and efficient. To design a Multi-user IM (instant message) architecture is very i mportant in both theory and realism. Instant message based on TCP/IP protocol that is realized by socket interface. Almost all UNIX operation systems and Microsoft's win dows operation systems provide support of socket in the kernel. Using the uniform int erface, we can develop a portable program of TCP/IP, which help us transfer informati on in Internet safely and credibly. The system uses the client/server(C/S) mode. The server takes the responsibility of th e login message of client, the saving of friend message and Message heartbeat. The tra nsmission of the basic messages of the customer end will be designed on P2P architec ture. This thesis explains how the client and server communicate via serializing XML message. Key words: Instant Message; File Transfer; Socket; TCP protocol

课程设计RIP路由协议的设计与实现

课程设计R I P路由协议的设计与实现精选文档 TTMS system office room 【TTMS16H-TTMS2A-TTMS8Q8-

课程设计 课程设计(论文) RIP路由协议的设计与实现 院(系)名称电子与信息工程学院 专业班级 学号 学生姓名 指导教师 起止时间: 课程设计(论文)任务及评语 院(系):电子与信息工程学院教研室:

摘要 RIP协议是一种内部网管协议(IGP),是一种动态路由选择协议,用于自治系统(AS)内的路由信息的传递。RIP协议基于距离矢量算法(DistanceVectorAlgorithms),使用“跳数”(即metric)来衡量到达目标地址的路由距离。这种协议的路由器只关心自己周围的世界,只与自己相邻的路由器交换信息,范围限制在15跳(15度)之内,再远,它就不关心了。RIP应用于OSI 网络七层模型的应用层。各厂家定义的管理距离(AD,即优先级)如下:华为定义的优先级是100,华三定义优先级是100,思科定义的是120。 随着OSPF和IS-IS的出现,许多人认为RIP已经过时了。但事实上RIP也有它自己的优点。对于小型网络,RIP就所占带宽而言开销小,易于配置、管理和实现,并且RIP还在大量使用中。但RIP也有明显的不足,即当有多个网络时会出现环路问题。为了解决环路问题,IETF提出了分割范围方法,即路由器不可以通过它得知路由的接口去宣告路由。分割范围解决了两个路由器之间的路由环路问题,但不能防止3个或多个路由器形成路由环路。触发更新是解决环路问题的另一方法,它要求路由器在链路发生变化时立即传输它的路由表。这加速了网络的聚合,但容易产生广播泛滥。总之,环路问题的解决需要消耗一定的时间和带宽。若采用RIP协议,其网络内部所经过的链路数不能超过15,这使得RIP协议不适于大型网络。 关键词:RIP协议;网络;路由器

常用几种通讯协议

常用几种通讯协议 Modbus Modbus技术已成为一种工业标准。它是由Modicon公司制定并开发的。其通讯主要采用RS232,RS485等其他通讯媒介。它为用户提供了一种开放、灵活和标准的通讯技术,降低了开发和维护成本。 Modbus通讯协议由主设备先建立消息格式,格式包括设备地址、功能代码、数据地址和出错校验。从设备必需用Modbus协议建立答复消息,其格式包含确认的功能代码,返回数据和出错校验。如果接收到的数据出错,或者从设备不能执行所要求的命令,从设备将返回出错信息。 Modbus通讯协议拥有自己的消息结构。不管采用何种网络进行通讯,该消息结构均可以被系统采用和识别。利用此通信协议,既可以询问网络上的其他设备,也能答复其他设备的询问,又可以检测并报告出错信息。 在Modbus网络上通讯期间,通讯协议能识别出设备地址,消息,命令,以及包含在消息中的数据和其他信息,如果协议要求从设备予以答复,那么从设备将组建一个消息,并利用Modbus发送出去。 BACnet BACnet是楼宇自动控制系统的数据通讯协议,它由一系列与软件及硬件相关的通讯协议组成,规定了计算机控制器之间所有对话方式。协议包括:(1)所选通讯介质使用的电子信号特性,如何识别计算机网址,判断计算机何时使用网络及如何使用。(2)误码检验,数据压缩和编码以及各计算机专门的信息格式。显然,由于有多种方法可以解决上述问题,但两种不同的通讯模式选择同一种协议的可能性极少,因此,就需要一种标准。即由ISO(国际标准化协会〉于80年代着手解决,制定了《开放式系统互联(OSI〉基本参考模式(Open System Interconnection/Basic Reference Model简称OSI/RM)IS0- 7498》。 OSI/RM是ISO/OSI标准中最重要的一个,它为其它0SI标准的相容性提供了共同的参考,为研究、设计、实现和改造信息处理系统提供了功能上和概念上的框架。它是一个具有总体性的指导性标准,也是理解其它0SI标准的基础和前提。 0SI/RM按分层原则分为七层,即物理层、数据链路层、网络层、运输层、会话层、表示层、应用层。 BACnet既然是一种开放性的计算机网络,就必须参考OSIAM。但BACnet没有从网络的最低层重新定义自己的层次,而是选用已成熟的局域网技术,简化0SI/RM,形成包容许多局 域网的简单而实用的四级体系结构。 四级结构包括物理层、数据链路层、网络层和应用层。

基于tcp协议通信系统的设计与实现

基于TCP协议通信系统的设计与实现 杨秀森 (贵州师范大学机电学院电气工程及其自动化学号:0914********) 摘要:通信协议(communications protocol)是指双方实体完成通信或服务所必须遵循的规则和约定。协议定义了数据单元使用的格式,信息单元应该包含的信息与含义,连接方式,信息发送和接收的时序,从而确保网络中数据顺利地传送到确定的地方。通信的底层通信是通过SOCKET套接字接口实现的。当前的主流UNIX系统和微软的WINDOWS系统都在内核提供了对SOCKET字接口的支持。使用这个统一的接口,可以编写一个可移植的TCP通信程序。 本文设计并实现了基于局域网内的简单即时通信系统,系统采用C/S模式,底层通信通过SOCKET套接字接口实现,服务器负责客户端的登录验证,好友信息的保存和心跳报文的发送。客户端采用P2P方式实现消息传递,并能实现文件的传输。本文首先讨论了同步套接字,异步套接字,多线程并发执行任务等;然后阐述了客户端、服务器如何使用XML序列化的消息进行通信。 关键词:TCP协议;通信协议系统;套接字;文件传输;C/S模式; The System Design and Implementation of Based on TCP Protocol Communication Yang Xiu Sen (Guizhou Normal University Institute of mechanical and electrical engineering and its automation number: 0914********) Abstract: Communication protocol ( communications protocol ) refers to both entities to complete communication or service must follow the rules and conventions. The protocol defines a data unit format, information unit should contain information and meaning, connection mode, information transmission and reception timing, thereby ensuring that the network data smoothly transmitted to determine places. Communication communication is through the SOCKET socket interface implementation. The current mainstream UNIX system and Microsoft WINDOWS system in the kernel provides to SOCKET interface support. Using the unified interface, can be prepared in a transplantable TCP communication program. This paper designed and implemented based on a simple LAN instant communication system, the system adopts C/S model, the underlying communication through the SOCKET socket interface

四种路由协议比较

内部网关协议RIP:基于距离向量的路由协议。(1)仅和相邻路由器交换信息,交换的信息是自己的路由表。(2)按固定的时间间隔交换信息。RIP协议用UDP报文进行传送。 RIP实现简单,但它能使用的最大距离为15,16是不可到达,所以RIP只适用于小规模网络。RIP还有一个特点就是好消息传播的快,坏消息传播的慢。 RIP为了防止成环:可以用水平分割的方法,即从本端口接收到的路由,不再从本接口发送出去。 内部网关协议OSPF:使用分布式的链路状态协议。(1)向本自治系统内的所有路由器发送信息,用洪泛法。,路由器向所有相邻的路由器发送信息,这个相邻的路由器再向所有它相邻的路由器发送信息。(2)发送的信息是与本路由器相邻的所有路由器的链路专题。(3)只有链路状态变化时,才用洪泛法发送信息,OSPF没有RIP那样坏消息传播的慢的问题。而不像RIP那样每隔30s交换一次路由信息。OSPF协议知道全网的拓扑结构图。OSPF更新收敛的快是重要特点。OSPF不用UDP而是直接用IP数据报传送。OSPF的数据包很短,这样可以减少路由信息的通信量。 注:RIP交换的是路由表,即到目的网络的最短距离,RIP就是根据最短距离选路的。OSPF发送的信息是与本路由器相邻的链路状态,即与本路由器都和哪些路由器相邻以及该链路的度量,如距离,费用带宽。所以交换完路由信息以后,形成数据库,然后利用SPF算法(如Dijkstra静态路由算法)再算出路径,形成SPF树。每个路由单元根据SPF树生成自己的路由表。对OSPF而言,主要的消耗就在SPF的算法处理中,最常用的是Dijkstra静态路由算法。当一条链路down,每台路由器都会获得变化的信息,在网络拓扑更新之后,每台路由器就会重新计算SPT。这样计算SPT的计算量特别大,消耗CPU。。在目前的实际应用中,重新计算SPT就是删除当前的SPT,调用最短路径优先算法重新构造SPT。所以需要提出一种快速收敛的算法,来消除冗余存储或冗余计算。如下图我们只需要计算第二张图中区域的节点,即只对部分变化的节点重新计算路径,大大减少了计算量。

路由器原理及路由协议

路由器原理及路由协议 本文通过阐述TCP/IP网络中路由器的基本工作原理,介绍了IP路由器的几大功能,给出了静态路由协议和动态路由协议,以及内部网关协议和外部网关协议的概念,同时简要介绍了目前最常见的RIP、OSPF、BGP和BGP-4这几种路由协议,然后描述了路由算法的设计目标和种类,着重介绍了链路状态法和距离向量法。在文章的最后,扼要讲述了新一代路由器的特征。 ——近十年来,随着计算机网络规模的不断扩大,大型互联网络(如Internet)的迅猛发展,路由技术在网络技术中已逐渐成为关键部分,路由器也随之成为最重要的网络设备。用户的需求推动着路由技术的发展和路由器的普及,人们已经不满足于仅在本地网络上共享信息,而希望最大限度地利用全球各个地区、各种类型的网络资源。而在目前的情况下,任何一个有一定规模的计算机网络(如企业网、校园网、智能大厦等),无论采用的是快速以大网技术、FDDI技术,还是ATM技术,都离不开路由器,否则就无法正常运作和管理。 1 网络互连 ——把自己的网络同其它的网络互连起来,从网络中获取更多的信息和向网络发布自己的消息,是网络互连的最主要的动力。网络的互连有多种方式,其中使用最多的是网桥互连和路由器互连。 1.1 网桥互连的网络 ——网桥工作在OSI模型中的第二层,即链路层。完成数据帧(frame)的转发,主要目的是在连接的网络间提供透明的通信。网桥的转发是依据数据帧中的源地址和目的地址来判断一个帧是否应转发和转发到哪个端口。帧中的地址称为“MAC”地址或“硬件”地址,一般就是网卡所带的地址。 ——网桥的作用是把两个或多个网络互连起来,提供透明的通信。网络上的设备看不到网桥的存在,设备之间的通信就如同在一个网上一样方便。由于网桥是在数据帧上进行转发

聊天软件需求分析

编号:__001____________ 版本:____1.0__________ <即时通讯> 需求分析说明书 委托单位:付勇智 承办单位:冰点开发小组 编写:(签名)____李超__________ 2007 年 4 月 11 日 复查:(签名)______聂润声_______ 2007 年 4 月 13 日 批准:(签名)____翁靖凯_________ 2007 年 4 月 13 日

聊天软件需求分析说明书 1.引言 1.1编写目的 本需求规格说明书编写的目的是为了清晰地说明本小组开发《聊天软件》要实现的所有功能。同时也为软件使用者和软件开发者之间建立共同的需求目标,进行一定程度的交流沟通。同时对软件所需实现的功能模块做了全面的描述。它是后续开发工作和验收工作的依据文件。软件使用者和软件开发者以此为共同的基础。 1.2项目背景 随着网络的普及,人类生活越来越依赖网络,人与人之间的交也更多的是在网络上进行,于交流的实时性,即时通讯系统也被越来越多的人所使用。 即时通讯系统除了普通的生活上的交流,也在商业交流中越来越受到重视,它可以是 个很好的与客户之间即时交流的平台,在时间上它要比电子邮件更加具有实时性,而费用相对 电话交流也要经济的多。 在这种环境下,聊天软件作为一种即时通讯工具,得到了很好的发展。 1.3任务描述 1.3.1目标 开发一个即时通讯软件,能够即时发送接受信息,操作简单,能良好的运行。 1.3.2条件与限制 开发时间:三个月 开发环境:J2SE SDK1.5,NetBeans5.5.1,JBuilder2006,MS SQL SERVER 2005 1.3.3 需求 交流者身份的确定,即交流双方需要各自确定允许与对方交流才能交流;交流信息的加密,即不允许他人窃听双方的交流信息;点对点交流(私聊),一次对话的对象只是一个人;同时可以利用本系统形成的P2P(peer to peer,点对点)网络进行用户间的文件传输,进行资源的共享。 2.功能描述

基于TCP的网络通信协议设计毕业论文

基于TCP的网络通信协议设计毕业论文 目录 ABSTRACT .................................................................................................................. 错误!未定义书签。第一章绪论.. (1) 1.1 项目开发背景和意义 (1) 1.2 开发和运行环境 (1) 第二章开发工具简介 (1) 2.1 Visual C++6.0介绍 (1) 2.2 MFC (1) 2.3 MSDN (2) 2.4 Visual Assist X (3) 第三章协议设计涉及知识简介 (1) 3.1 即时通讯 (1) 3.2 网络协议 (2) 3.3 OSI七层网络模型 (2) 3. 4 TCP/IP协议 (3) 3.5 TCP传输 (4) 3.6 C/S编程模型 (4) 3.7 Socket套接字 (5) 3.8 网络字节顺序 (6) 3.9 Windows Sockets (6) 3.10 同步、异步、阻塞和非阻塞 (7) 3.11 多线程 (7) 第四章需求分析 (10) 4.1 整体需求分析 (10) 4.2 可行性分析 (10) 第五章概要设计 (11) 5.1 性能要求 (11) 5.2 通讯协议格式设计 (11) 5.3 软件工作模式图 (12) 5.4 软件设计原理 (12) 第六章详细设计 (15) 6.1 协议设计 (15) 6.2 服务器端工程设计 (17) 6.3 客户端工程设计 (22) 6.4多线程设计(一台服务器与多个客户端通信) (31) 6.5 协议工作设计 (34) 第七章系统测试 (42) 7.1 测试目的 (42) 7.2 测试要求 (42)

c串口通信协议设计

c串口通信协议设计 篇一:RS-232-C串口通讯协议解析 RS-232-C串口通讯协议解析 串行通信接口标准经过使用和发展,目前已经有几种。但都是在RS-232标准的基础上经过 改进而形成的。所以,以RS-232C为主来讨论。 在讨论RS-232C接口标准的内容之前,先说明两点.首先,RS-232-C标准最初是远程通信连接数据终端设备DTE(Data Terminal Equipment)与数据通信设备DCE(Data Communication Equipment)而制定的。因此这个标准的制定,并未考虑计算机系统的应用要求。但目前它又广泛地被借来用于计算机(更准确的说,是计算机接口)与终端或外设之间的近端连接标准。显然,这个标准的有些规定及和计算机系统是不一致的,甚至是相矛盾的。有了对这种背景的了解,我们对RS-232C标准与计算机不兼容的地方就不难理解了 其次,RS-232C标准中所提到的“发送”和“接收”,都是站在DTE立场上,而不是站在DCE的立场来定义的。由于在计算机系统中,往往是CPU和I/O设备之间传送信息,两者

都是DTE,因此双方都能发送和接收。 RS- 323C标准是美国EIA(电子工业联合会)与BELL 等公司一起开发的1969年公布的通信协议。它适合于数据传输速率在0~XX0b/s范围内的通信。这个标准对串行通信接口的有关问题,如信号线功能、电器特性都作了明确规定。由于通行设备厂商都生产与RS-232C 制式兼容的通信设备,因此,它作为一种标准,目前已在微机通信接口中广泛采用。 一、RS-232-C RS-232C标准(协议)的全称是EIA-RS-232C标准,其中EIA(Electronic Industry Association)代表美国电子工业协会,RS(ecomme ed standard)代表推荐标准,232是标识号,C代表RS232的最新一次修改(1969),在这之前,有RS232B、RS232A。。它规定连接电缆和机械、电气特性、信号功能及传送过程。常用物理标准还有有EIA�RS-232-C、EIA�RS-422-A、 EIA�RS-423A、EIA�RS-485。这里只介绍EIA�RS-232-C(简称232,RS232)。例如,目前在IBM PC机上的COM1、 COM2接口,就是RS-232C接口。 1.电气特性

路由协议整理

路由协议(RIP、OSPF、EIGRP和BGP) 整理 路由协议(RIP、OSPF、EIGRP和BGP) 整理 对于路由器而言,要找出最优的数据传输路径是一件比较有意义却很复杂的工作。最优路径有可能会有赖于节点间的转发次数、当前的网络运行状态、不可用的连接、数据传输速率和拓扑结构。为了找出最优路径,各个路由器间要通过路由协议来相互通信。需要区别的一点是:路由协议与可路由的协议是不是等同的。如TCP/IP和IPX/SPX,尽管它们可能处于可路由的协议的顶端。 路由协议只用于收集关于网络当前状态的数据并负责寻找最优传输路径。根据这些数据,路由器就可以创建路由表来用于以后的数据包转发。除了寻找最优路径的能力之外,路由协议还可以用收敛时间—路由器在网络发生变化或断线时寻找出最优传输路径所耗费的时间来表征。带宽开销—运行中的网络为支持路由 协议所需要的带宽,也是一个较显著的特征。尽管并不需要精确地知道路由协议的工作原理,你还是应该对最常见的路由协议有所了解:RIP、OSPF、EIGRP和BGP(还有更多的其他路由协议,但它们使用得并不广泛) 此外还IGRP路由选择协议,它是Cisco公司设备专用协议,其它非Cisco设备不能使用这样协议。 对这四种常见的路由协议描述如下。 (1) 为IP和IPX设计的RIP(路由信息协议):RIP是一种最早先的路由协议,但现在仍然被广泛使用,这是由于它在选择两点间的最优路径时只考虑节点间的中继次数这个原因的缘故。例如,它不考虑网络的拥塞状况和连接速率这些因素。使用RIP的路由器每30秒钟向其他路由器广播一次自己的路由表。这种广播会造成极大的数据传输量,特别是网络中存在有大量的路由器时。如果路由表改变了,新的信息要传输到网络中较远的地方,可能就会花费几分钟的时间;所以RIP的收敛时间是非常长的。而且, RIP还限制中继次数不能超过16跳(经过16台路由器设备)。所以,在一个大型网络中,如果数据要被中继16跳以上,它就不能再传输了。而且,与其他类型的路由协议相比, RIP还要慢一些,而安全性却差一些。 (2)为IP设计的OSPF(开放的最短路径优先):这种路由协议弥补了RIP的一些缺陷,并能与RIP在同一网络中共存。OSPF在选择最优路径时使用了一种更灵活的算法。最优路径这个术语是指从一个节点到另一个节点效率最高的路径。在理想的网络环境中,两点间的最优路径就是直接连接两点的路径。如果要传输的数据量过大,或数据在传输过程中损耗过大,数据不能沿最直接的路径传输,路由器就要另外选择出一条还要通过其他路由器但效率最高的路径。这种方案就要求路由器带有更多的内存和功能更强大的中央处理器。这样,用户就不会感觉到占用的带宽降到了最低,而收敛时间却很短。OSPF是继RIP之后第二种使用得最多的协议。 (3)为IP、IPX和Apple Talk而设计的EIGRP (增强内部网关路由协议):此路由协议由Cisco公司在20 世纪80年代中期开发。它具有快速收敛时间和低网络开销。由于它比OSPF. EIGRP容易配置和需要较少的CPU,也支持多协议且限制路由器之间多余的网络流量。 (4)为IP、IPX和Apple Talk而设计的BGP(边界网关协议):BGP是为因特网主干网设计的一种路由协议。因特网的飞速发展对路由器需求的增长推动了对BGP这种最复杂的路由协议的开发工作。BGP的开发人员面对的不仅是它能够连接十万台路由器的美好前景,他们还要面对解决如何才能通过成千上万的因特网主干网合理有效地路由的问题 注:cisco的静态路由、RIP、OSPF、EIGRP、IGRP、IS-IS、BGP的管理距离.. rip(v1、v2):120 igrp:100 eigrp(内部):90 eigrp(外部):170 eigrp(归纳/路由):5 ospf:110 isis:115 bgp(外部):20 bgp(内部):200

相关主题