基于UDP的P2P模式的聊天程序

基于UDP的P2P模式的聊天程序
基于UDP的P2P模式的聊天程序

基于UDP的P2P模式的聊天程序

一、课题内容和要求

使用UDP协议编写聊天软件,使得客户端之间可以自由地进行键盘聊天。

【程序的具体要求】

1)以图形界面运行, 提供聊天内容输入界面和收到的文字聊天内容。

2)允许客户选择不同的其他客户方(peer)进行聊天,假定已知对方的IP地址。

二、需求分析

本次试验需要使用UDP协议的P2P模式,所以在试验之前应该对其进行一定了解。

UDP 是User Datagram Protocol的简称,中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP是ISO 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。UDP协议适用端口分辨运行在同一台设备上的多个应用程序。UDP协议的全称是用户数据报协议,在网络中它与TCP协议一样用于处理UDP 数据包。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。 UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。

P2P是英文Peer-to-Peer(对等)的简称,又被称为“点对点”。“对等”技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上。P2P还是英文Point to Point (点对点)的简称。它是下载术语,意思是在你自己下载的同时,自己的电脑还要继续做主机上传,这种下载方式,人越多速度越快但缺点是对硬盘损伤比较大(在写的同时还要读),还有对内存占用较多,影响整机速度。点对点技术(peer-to-peer,简称P2P)又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上。但P2P 并非纯粹的点对点技术,实为解作群对群(Peer-to-Peer)。在虚拟私人网络VPN (Virtual

联网:1、是只读的网络的终结(Peer-to-peer is the end of the read-only Web)。2、使你重新参与互联网(Peer-to-peer allows you to participate in the Internet again)3、使网络远离电视(Peer-to-peer steering the Internet away from TV)如上文所言,P2P不是一个新思想,从某些角度看它甚至是整个最初创建互联网的最基本的思想。

本次编程用的工具是VC6.0,因为需要做图形化界面,所以又自学了MFC。

这个试验的主要部分在,使用UDP协议上面,制作图形界面,创建套接字等方面。运行以后程序会出现很多的.h和.cpp的文件,框架和主代码写于在UDPChatDlg.cpp文件和UDPSock.cpp文件中。在做图形界面的时候,我打算做一个对话框,一个输入框,两个IP 地址栏,两个端口栏,一个发送键,一个关闭键,一个设置IP地址键。每一个界面都对

应一个类来实现其功能。

在UDPChatDlg.cpp中,BOOL CUDPChatDlg::OnInitDialog()中,实现了很多的功能,创建调用套接字、获得主机IP和端口号,以及对方的的IP初始值。void CUDPChatDlg::OnBtnConn()中,实现了设置键的功能。void CUDPChatDlg::OnBtnSend()中,是实现了发送的功能,读取输入框的信息并点击响应,使其能够显示在对话框,而且会对另外类的功能进行调用。void CUDPChatDlg::SendMsg()是自己添加的功能,使其图

形化界面比较完善,可以显示发送方还有接收方。void CUDPChatDlg::OnBtnFont()也是

添加的一项功能,用来调节字体大小颜色等。

在UDPSock.cpp中,void CUDPSock::OnReceive()这个需要说明,是为了接收信息的,其中调用了自己定义的结构,用于灵活分配空间,在试验过程中,在这个地方也出现了问题。

三、概要设计

这次试验程序的代码,我将程序的头文件和源文件分开些的。另外要说明的是,试验代码是用CSocket写的,CSocket是多线程的。

头文件中,Protocol.h文件是我自己写的代码,用于实现动态的获得消息,可以是程序在运行获得消息的时候,首先获得报头,然后再去获得消息的数据包,这样可以分配合适的内存,不要分配固定的内存。

UDPChat.h文件里面用到了CWinApp,MFC 中的主应用程序类封装用于 Windows 操作系统的应用程序的初始化、运行和终止。基于框架生成的应用程序必须有且仅有一个从CWinApp 派生的类的对象。在创建窗口之前先构造该对象。

UDPChatDlg.h文件中,CUDPSock m_sockUDP;来使用UDP套接字,CHARFORMAT m_cfDefault;来控制默认字体,void SendMsg(BOOL bSelf, CString strName, CTime &time, CString strMsg, CHARFORMAT &cf);显示消息的函数。

在UDPSock.h中,主要是对CUDPSocket进行声明调用等。

源文件中,很多都是框架的代码,在此可以忽略。对一些功能函数和模块进行说明。

StdAfx.cpp文件中,用于调用程序所有的主要头文件,一定不能省略。

AfxInitRichEdit();初始化RichEdit,否则会出现一些问题。

接下来是UDPChatDlg.cpp源文件,这是程序的主要代码,很多的框架代码以及功能函数都在这个地方。1、BOOL CUDPChatDlg::OnInitDialog()中,CString str, strSockName, strPort;是为了获取主机IP。m_sockUDP.Close();是为了创建UDP套接字,在程序中,我对其进行了封装,然后调用。m_sockUDP.GetSockName(strSockName, uiPort);可以用来获取本机的端口,因为题目说在已知对方IP的条件下,所以当然要获得IP,虽然也可以手动查询本机IP,但是这样的话方便了很多。2、CUDPChatDlg::OnBtnConn()中,实现了设置键的功能,就是在输入对方IP和端口号以后,进行连接响应。3、void CUDPChatDlg::OnBtnSend()中,是进行主要工作,调用一些功能以及响应发送的命令。m_ctrlRichSend.SetFocus();是用于获取字符串,清空发送框。T_MSG_STRUCT tMsgHdr;用于发送数据包准备工作。lstrcpy(lpMsg, str.GetBuffer(0));str.ReleaseBuffer();用来复制消息内容。m_ctrlRichSend.GetDefaultCharFormat(tMsgHdr.cf); 用来设置字体。tMsgHdr.timeSent = CTime::GetCurrentTime();用于设置发送时间。tMsgHdr.uiMsgLen = str.GetLength();用于设置消息长度,_tcscpy(tMsgHdr.szName, m_strSelfName); 用于设置发送者名称,DWORD dwIPAddress; 等代码用于获取目的主机的IP和端口。还有一些功能就不一一介绍了,在下面的程序都有给出注释。4、最后void CUDPChatDlg::OnBtnFont()中,是自己添加的功能,用于实现修改字体的大小,颜色,字体等功能。

最后是UDPSock.cpp源文件,void CUDPSock::OnReceive(int nErrorCode)是这个文件的主要部分,实现了先接收消息头部、然后接收消息,并显示别人发送过来的消息。其实在抓取消息的时候,我并没有用线程,而是像一个死循环一样,不断的抓取信息,知道用户点击发送才开始响应,并获取消息和显示。

四、详细设计

因为程序代码含有很多框架的代码,都是系统自带的,所以我找一些重要的自己写的代码附在此部分。

1、UDPChatDlg.cpp文件中的代码是主要代码,所以全部反映出来:

#include "stdafx.h"

#include "UDPChat.h"

#include "UDPChatDlg.h"

#include "Protocol.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

#endif

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CUDPChatDlg dialog

CUDPChatDlg::CUDPChatDlg(CWnd* pParent /*=NULL*/)

: CDialog(CUDPChatDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CUDPChatDlg)

// NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CUDPChatDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CUDPChatDlg)

DDX_Control(pDX, IDC_RICHEDIT_BOX, m_ctrlRichBox);

DDX_Control(pDX, IDC_RICHEDIT_SEND, m_ctrlRichSend);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CUDPChatDlg, CDialog)

//{{AFX_MSG_MAP(CUDPChatDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BTN_CONN, OnBtnConn)

ON_BN_CLICKED(IDC_BTN_SEND, OnBtnSend)

ON_BN_CLICKED(IDC_BTN_CLOSE, OnBtnClose)

ON_BN_CLICKED(IDC_BTN_FONT, OnBtnFont)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CUDPChatDlg message handlers

BOOL CUDPChatDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

} }

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

WSADATA wsaData;

TCHAR name[155];

TCHAR *ip;

PHOSTENT hostinfo;

// 获取本机IP地址

CString str, strSockName, strPort;

UINT uiPort;

if (WSAStartup(MAKEWORD(2, 0), &wsaData ) == 0)

{

if (gethostname(name, sizeof(name)) == 0)

{

if ((hostinfo = gethostbyname(name)) != NULL)

{

ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);

}

}

WSACleanup();

}

str.Format(_T("%s"), ip);

GetDlgItem(IDC_EDIT_ADDRESS_LOCAL)->SetWindowText(str);

// 创建UDP套接字

m_sockUDP.Close();

if (!m_sockUDP.Create(0, SOCK_DGRAM, NULL))

{

MessageBox(_T("连接服务器失败!"), _T("提示"), MB_OK | MB_ICONINFORMA TION);

return FALSE;

}

// 获取本机端口

m_sockUDP.GetSockName(strSockName, uiPort);

strPort.Format(_T("%u"), uiPort);

GetDlgItem(IDC_EDIT_LOCAL_PORT)->SetWindowText(strPort);

// 初始化名字

m_strSelfName.Format(_T("<%s:%u>"), str, uiPort);

((CIPAddressCtrl *)GetDlgItem(IDC_IPADDRESS_REMOTE))->SetAddress(127, 0, 0, 1);

GetDlgItem(IDC_EDIT_REMOTE_PORT)->SetWindowText(_T("0"));

// 默认字体

ZeroMemory(&m_cfDefault, sizeof(CHARFORMAT));

m_cfDefault.yHeight = 180;

m_cfDefault.cbSize = sizeof(CHARFORMA T);

m_cfDefault.dwMask |= CFM_SIZE;

m_cfDefault.dwMask |= CFM_FACE;

m_cfDefault.dwMask |= CFM_BOLD;

m_cfDefault.dwMask |= CFM_ITALIC;

m_cfDefault.dwMask |= CFM_OFFSET;

m_cfDefault.dwMask |= CFM_STRIKEOUT;

m_cfDefault.dwMask |= CFM_UNDERLINE;

m_cfDefault.dwEffects &= ~CFE_BOLD;

m_cfDefault.dwEffects &= ~CFE_ITALIC;

m_cfDefault.dwEffects &= ~CFE_STRIKEOUT;

m_cfDefault.dwEffects &= ~CFE_UNDERLINE;

m_cfDefault.yOffset = 0;

lstrcpy(m_cfDefault.szFaceName, _T("宋体"));

//////////////////////////////////////////////////////////////////////////

return TRUE; // return TRUE unless you set the focus to a control

}

void CUDPChatDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// If you add a minimize button to your dialog, you will need the code below

// to draw the icon. For MFC applications using the document/view model,

// this is automatically done for you by the framework.

void CUDPChatDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

// The system calls this to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR CUDPChatDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

void CUDPChatDlg::OnDestroy()

CDialog::OnDestroy();

// TODO: Add your message handler code here

//////////////////////////////////////////////////////////////////////////

m_sockUDP.Close();

//////////////////////////////////////////////////////////////////////////

}

void CUDPChatDlg::OnBtnConn()

{

// TODO: Add your control notification handler code here

//////////////////////////////////////////////////////////////////////////

UpdateData(FALSE);

MessageBox(_T("设置成功!"), _T("提示"), MB_OK | MB_ICONINFORMA TION);

//////////////////////////////////////////////////////////////////////////

}

void CUDPChatDlg::OnBtnSend()

{

// TODO: Add your control notification handler code here

//////////////////////////////////////////////////////////////////////////

CString str;

INT iLen = m_ctrlRichSend.GetWindowTextLength();

// 条件验证

if (iLen == 0)

{

MessageBox(_T("发送内容不能为空,\n请重新输入!"), _T("提示"), MB_OK | MB_ICONINFORMA TION);

return;

}

if (iLen >= 1000)

{

MessageBox(_T("您所发的信息太长。"), _T("请截短信息"), MB_OK |

MB_ICONINFORMA TION);

return;

// 获取字符串,清空发送框

m_ctrlRichSend.SetFocus();

m_ctrlRichSend.SetSel(0, iLen);

str = m_ctrlRichSend.GetSelText();

m_ctrlRichSend.ReplaceSel(_T(""));

// 发送数据包准备工作

T_MSG_STRUCT tMsgHdr;

LPTSTR lpMsg = new TCHAR[str.GetLength() + 1];

// 复制消息内容

lstrcpy(lpMsg, str.GetBuffer(0));

str.ReleaseBuffer();

// 设置字体

m_ctrlRichSend.GetDefaultCharFormat(tMsgHdr.cf);

// 设置发送时间

tMsgHdr.timeSent = CTime::GetCurrentTime();

// 设置消息长度

tMsgHdr.uiMsgLen = str.GetLength();

// 设置发送者名称

_tcscpy(tMsgHdr.szName, m_strSelfName);

// 获取目的主机的IP和端口

DWORD dwIPAddress;

((CIPAddressCtrl *)GetDlgItem(IDC_IPADDRESS_REMOTE))->GetAddress(dwIPAddress); CString strPort;

GetDlgItem(IDC_EDIT_REMOTE_PORT)->GetWindowText(strPort);

// 设置SOCKADDR_IN

SOCKADDR_IN clientaddr;

clientaddr.sin_addr.S_un.S_addr = htonl(dwIPAddress);

clientaddr.sin_family = AF_INET;

// 发送数据包

m_sockUDP.SendTo(&tMsgHdr, sizeof(T_PACKET_MSG), (SOCKADDR *)&clientaddr,

sizeof(clientaddr));

m_sockUDP.SendTo(lpMsg, (str.GetLength() + 1) * sizeof(TCHAR), (SOCKADDR *)&clientaddr, sizeof(clientaddr));

// 目的主机的名称

CString strRemoteName;

strRemoteName.Format(_T("<%s:%s>"), inet_ntoa(clientaddr.sin_addr), strPort);

// 显示到聊天框中

SendMsg(TRUE, strRemoteName, tMsgHdr.timeSent, lpMsg, tMsgHdr.cf);

// 焦点回到发送框

m_ctrlRichSend.SetFocus();

// 释放空间

SAFEDELETEA(lpMsg);

//////////////////////////////////////////////////////////////////////////

}

//////////////////////////////////////////////////////////////////////////

//************************************

// Method: SendMsg

// FullName: CUDPChatDlg::SendMsg

// Access: protected

// Returns: void

// Qualifier:

// Parameter: BOOL bSelf 是否是自己发送的

// Parameter: CString strName 要显示的发送、目的主机的名字

// Parameter: CTime & time 发送时间

// Parameter: CString strMsg 消息内容

// Parameter: CHARFORMA T & cf 字体

//************************************

void CUDPChatDlg::SendMsg(BOOL bSelf, CString strName, CTime &time, CString strMsg, CHARFORMAT &cf)

CString str;

m_ctrlRichBox.AddText(_T("\r\n"), m_cfDefault);

str.Format(_T("[%s] %s %s 说:\r\n"), time.Format(_T("%H:%M:%S")), bSelf ? _T("你对") : strName, bSelf ? strName : _T("对你"));

if (bSelf)

{

// 显示自己发送的标题

m_ctrlRichBox.AddTitle(str, m_cfDefault, RGB(0, 128, 64));

}

else

{

// 显示别人发送的标题

m_ctrlRichBox.AddTitle(str, m_cfDefault);

}

str.Format(_T("%s"), strMsg);

// 显示消息

m_ctrlRichBox.AddText(str, cf);

// 任务栏按钮闪烁效果

if (!bSelf && GetForegroundWindow() != this)

{

FlashWindow(TRUE);

}

}

//////////////////////////////////////////////////////////////////////////

void CUDPChatDlg::OnBtnClose()

{

// TODO: Add your control notification handler code here

OnCancel();

}

void CUDPChatDlg::OnBtnFont()

{

// TODO: Add your control notification handler code here

////////////////////////////////////////// ////////////////////////////////

LOGFONT lf;

memset(&cf, 0, sizeof(CHARFORMA T));

memset(&lf, 0, sizeof(LOGFONT));

m_ctrlRichSend.GetDefaultCharFormat(cf);

//得到相关字体属

BOOL bIsBold = cf.dwEffects & CFE_BOLD;

BOOL bIsItalic = cf.dwEffects & CFE_ITALIC;

BOOL bIsUnderline = cf.dwEffects & CFE_UNDERLINE;

BOOL bIsStrickout = cf.dwEffects & CFE_STRIKEOUT;

//设置属性

lf.lfCharSet = cf.bCharSet;

lf.lfHeight = cf.yHeight / 15;

lf.lfPitchAndFamily = cf.bPitchAndFamily;

lf.lfItalic = bIsItalic;

lf.lfWeight = (bIsBold ? FW_BOLD : FW_NORMAL);

lf.lfUnderline = bIsUnderline;

lf.lfStrikeOut = bIsStrickout;

lstrcpy(lf.lfFaceName, cf.szFaceName);

CFontDialog dlg(&lf, CF_EFFECTS | CF_SCREENFONTS, NULL, this);

dlg.m_cf.rgbColors = cf.crTextColor;

if (dlg.DoModal() == IDOK)

{

dlg.GetCharFormat(cf);//获得所选字体的属性

m_ctrlRichSend.SetWordCharFormat(cf);

m_ctrlRichSend.SetDefaultCharFormat(cf);

}

//////////////////////////////////////////////////////////////////////////

}

BOOL CUDPChatDlg::PreTranslateMessage(MSG* pMsg)

{

// TODO: Add your specialized code here and/or call the base class

//////////////////////////////////////////////////////////////////////////

// 屏蔽ENTER和ESC

if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) {

}

//////////////////////////////////////////////////////////////////////////

return CDialog::PreTranslateMessage(pMsg);

}

2、UDPSock.cpp文件中的代码是自己编写用于接收信息的,所以把OnReceive()类附在这里。

void CUDPSock::OnReceive(int nErrorCode)

{

// TODO: Add your specialized code here and/or call the base class

//////////////////////////////////////////////////////////////////////////

CString strRemoteName;

UINT uiPort;

T_PACKET_MSG tMsg;

// 接收消息头部

ReceiveFrom(&tMsg.tMsgHdr, sizeof(T_MSG_STRUCT), strRemoteName, uiPort);

LPTSTR lpMsg = new TCHAR[tMsg.tMsgHdr.uiMsgLen + 1];

// 接收消息

ReceiveFrom(lpMsg, (tMsg.tMsgHdr.uiMsgLen + 1) * sizeof(TCHAR), strRemoteName, uiPort);

// 显示别人发送的消息

((CUDPChatDlg *)AfxGetApp()->GetMainWnd())->SendMsg(FALSE, tMsg.tMsgHdr.szName, tMsg.tMsgHdr.timeSent, lpMsg, tMsg.tMsgHdr.cf);

// 释放空间

SAFEDELETEA(lpMsg);

//////////////////////////////////////////////////////////////////////////

CSocket::OnReceive(nErrorCode);

}

3、UDPChatDlg.h和UDPSock.h的头文件中用来封装套接字、使用UDP协议还有一些声明。在此就不给出。

五、测试数据及其结果分析

程序的测试部分通过截图来表现,也会附上响应的文字说明。

图一

本图显示的是程序的一个功能,可以调节字体。

图二

图三

从以上两个截图可以看出,生成的端口号不同,本机的IP是一样的,所以完成的功能是,可以实现同一个主机进行对话,这样方便代码编写时候遇到问题对其进行相关的检测。

图四

图五

图六

以上三个截图可以发现,上面本机的IP地址并不一样,端口号也不一样,所以是同

一个局域网的两台不同电脑进行会话,实现了题目要求的基于UDP的P2P模式的聊天软件,而且也可以进行中英文的输入。

六、调试过程中的问题的

本次试验遇到了很多问题,首先是CSocket的线程问题,在编写程序之前,并没有注意到CSocket是多线程的所以出现了一些问题。

另外,是自己粗心的问题,在编写程序过程中,运行了时候,总是没有在消息栏显示消息,最后通过检测发现自己忘记了添加接收消息的函数,以至于消息都没有接收,怎么会显示。所以添加了void CUDPSock::OnReceive(int nErrorCode)类来实现这个功能。

然后在试验中,也发现了一个有点神奇的东西,就是AfxInitRichEdit();初始化RichEdit,如果不加这个的话,程序会出现相关的问题,如果不对RichEdit控件初始化,无法显示很多东西。

另外一些小问题都是比较好解决的,所以就不在此列出了。

其实我也在考虑用TCP去做一个聊天软件,这个是面向连接的,可以说比UDP要复杂的多。因为用CSocket是多线程的,编写比较简单,但是我也在思考不用这个去写,虽然会稍微复杂一点,但是也不会在线程上出现问题。

基于C#的P2P聊天程序设计

基于C#的P2P聊天程序设计 【摘要】本文主要是应用C#的Socket类、TcpClient类和TcpListener类来设计实现了基于局域网P2P的聊天程序。 【关键词】C#;P2P;聊天程序 在网络发达的今天,单机的应用程序越来越显示出其局限性,计算机的协同工作C#作为最新一代程序设计语言,有着强大的网络程序开发功能,本文主要应用Socket类、TcpClient类和TcpListener类来实现一个简单的P2P聊天程序的设计。 1、设计所用关键技术 1.1 P2P P2P,是peer-to-peer的缩写,也称对等网络技术,是一种网络结构,在该结构中,用户可以直接连接其他用户的计算机,进行文件共享和信息交换,每一个节点所拥有的权利和义务都是对等的。编写P2P通信程序,通常要做到两点: (1)负责监控的端口上是否有信息发送,如果有则显示出来,同时应该获知信息来自哪。(2)负责将信息发送到指定地点,以便进行通信。 1.2 Socket类 Socket称为套接字,它提供了接收对方发送的信息和发送数据到目标设备的功能。在使用套接字与远程设备进行通信之前,必须使用协议和网络地址信息初始化套接字。 1.3 TcpClient类和TcpListener类 TcpClient类专为客户端设计,它为TCP网络服务提供客户端连接,构建于Socket类之上,从而可以提供较高级别的TCP服务,即提供了通过网络连接、发送和接收数据的简单方法。TcpClient使用标准的Stream流处理技术来完成网络数据的发送和接收,可以通过NetworkStream来完成数据的发送和接收。NetworkStream可以被视为一个数据通道,架设在数据来源端和接收端之间,数据的读取和写入均可通过这个通道完成。 TcpListener类负责监视TCP端口上的传入请求,通过ExclusiveAddressUse 属性获取或设置一个Boolean值,指定TcpListener是否允许一个基础套接字来监听特定端口,然后通过绑定本机的IP地址和相应端口创建TcpListener的对象实例,执行Start方法启动侦听。当TcpLitener侦听到用户端的连接后,根据客户端不同的请求方式,应用AcceptTcpClient方法接收传入的连接请求,然后创建

计算机网络--简单聊天程序的设计与实现

实验报告 课程计算机网络实验名称简单聊天程序的设计与实现第 1 页 一、实验目的 1.熟悉VisualC++的基本操作;掌握最基本的Client/Server(客户机/服务器)模式 的网络编程技术,并在此基础上实现更为复杂的网络编程。 2.基本了解基于对话框的windows应用程序的编写过程。 3.对于Windows Socket编程建立初步概念。 二、实验内容 1、按实验步骤中参考程序使用VC++设计出程序; 2、在第1步的基础上使用VC++或其他工具设计出一个能实现两个人聊天的网络程序。 三、实验原理 1.Windows Socket和套接字的基本概念; 程序分为服务端和客户端两个,其主要工作过程如图1所示: 服务器端:服务器程序首选启动,通过调用socket()函数建立一个套接字,然后调用bind()函数使套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请示队列的长度,之后就调用accept()来接收连接。客户机端:客户机程序也使用socket()建立套接字,然后调用connect()函数和服务器建立连接。连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。 最后,等数据传送结束后,双方调用close()关闭套接字。 四、实验环境和实验工具 实验环境:Windows 平台、实验工具:VC++ 五、实验步骤 服务器端程序 (1)运行VC++,选择File --->New,弹出如图2所示的窗口。 (2)创建一个名为CS的工程:选中Projects中的MFC AppWizard[exe],在Project name中 输入Server,在Location中选择存储的目录,如本例中为D:\VC temp\.接着点击OK。 (3)在弹出的窗口中选择Dialog based,然后点击“Next”。出现图3所示的窗口,选择Windows Sockets,并输入服务器,点击“Next”. 如果忘了添加Windows Sockets选项,可以在文件头部添加下列语句进行补救: #include "Winsock.h" #include "Ws2tcpip.h" #pragma comment(lib,"Ws2_32.lib" ) 注:这些语句支持winsock2。 (4)其余窗口一直默认,点击“Next”直至“Finish”

即时通讯软件的设计与实现

即时通讯软件的设计与实现 1 系统实现模块 1.1 服务端模块 服务端主要包括三个模块: 1.网络模块,建立TCP服务器,负责监听端口,与客户端建立连接并接受和发送数据。 2.应用模块,负责处理从网络模块接收到的数据,予以分析处理,进行转发或对数据库进行操作,并返回相关信息。 3.数据层,数据层用来与数据库建立连接,应用模块必须通过数据层来进行数据库的操作。 日志记录 图4.1 系统模块图 1.2 客户端模块 用户端包块以下模块: 1.用户界面模块,此模块包括客户端的操作界面,由NetBeans编写的GUI,进行了较多的美化,采用偏向Vista的风格。 2.网络模块,此模块包括两个小模块,TCP模块用于和服务器端通讯,而UDP 模块则负责和客户端进行P2P通讯。 3.聊天模块,此模块负责在用户聊天时候,对聊天的数据进行封装,对聊天的图片也进行压缩,以适用网络传输。在接受到聊天数据之后,又会对聊天数据进行分解操作,最后生成聊天内容。 4.群组模块,此模块包括群组聊天、群组的创建、管理、更新等功能。 5.文件传输模块,此模块用于实现客户端之间的文件传输功能。 6.视频聊天模块,此模块用于实现客户端之间的视频聊天功能。 7.系统设置记录模块,此模块用于实现保存聊天记录,登录日志,以及保存系统设置信息的功能。 系统记录模块 图4.2 客户端模块图 2 数据库设计 2.1用户表设计 用户表是系统中的基础表,主要用来记录用户注册时的各种信息,此表还有一个从表userlogin表用来记录用户登录和状态信息。[12] Userinfo表

UserLogin表 用户关系表是用来保存用户之间的好友关系的数据表,查询好友列表的时候要从此表中查询与自己ID想关联的好友ID,type字段可以设置两者的关系,其中1为好友关系,0为黑名单。 其他表,如组群表,族群信息表就不在此一一列出。 3 系统模块的详细设计 此章节将叙述系统部分模块的设计方法和具体实现。 3.1 网络模块的设计实现 本系统采用TCP和UDP混合的网络通讯,客户端与服务器之间登录验证时采用TCP连接,登录之后,客户端与服务器采用UDP方式保持通讯,客户端和客户端之间采用UDP连接,如果无法直接连接,通过服务器申请UDP穿透NAT,如果失败,则消息通过服务器中转传递。

老外喜欢的聊天工具

老外喜欢的聊天工具 世界上最远的距离,不是生与死。而是我找你,却找不到。找到了却不回应。。。沟通是人与人之间的桥梁,是连接人人与人关系的纽带。合理的沟通能促进关系的和谐,同时也是矛盾的润滑剂。因此,实时沟通显得格外重要.作为外贸人员,不要一味的跟客人谈生意,当然目的是这个。私下的问候,关心,沟通也是不可或缺的。很多老外不喜欢来回发邮件,那样速度慢,还得来回查看,因此很多在线的聊天工具就备受欢迎。下面我介绍几款来外喜欢的聊天软件及工具。(1)MSN,这个大家都很熟悉,算是很早的在线聊天工具了,并且有对应的邮箱,也是很方便的,我就不多说了。他在世界的地位,犹如QQ在中国的地位。但是现在MSN被SKYPE绑定了,有些地方必须得绑定SKYPE才能用。 (2)SKYPE.这是一款很潮流也很方便的聊天工具,除了网上聊天外,也可以语音,视频。他最大的功能就是可以绑定你的电话,可以方便你和朋友间的联系。如果你想给远在异国的客人和朋友打电话的话,不妨试试SKYPE。不过你得先到SKYPE官网,购买充值卡哦。 (3)Viber,相比来说这个更是高效快捷,用你的手机注册成功后,装上软件,同步到你的通讯录,跟微信差不多。你就可以跟远在国外的使用同类软件的朋友畅所欲言了,这个不需花费,只需流量,如果有WIFI那就免费了哦。相比而言,这个更加流畅,不收

3G网络或者WIFI的局限,普通流量就可以拥有高音质的服务。(4)Whatsapp,这个软件还是客户告诉我的,当时我在trade manager,问他最近如何,怎么联系不到。他最后说让我装个whatsapp,然后我把他的号码存到我的通讯录,同步一下,就和他对话了,发现真的很多人在用,在我通讯录里使用这个的大部分都是中东南美的,也有部分中国人。 (5)Facebook,脸谱网的登陆如果电脑必须需要翻墙软件的协助,否则无济于事。在上面可以看到客户的动态,有种QQ空间的感觉,很是全面,也可以跟客户连线对话,建立群组等。这真的是一个不错的交友网站哦,你还会看到可能认识的人,客户的朋友你也可以加上。还可以关键词搜索,然后加为好友。 (6)Twitter,和facebook基本差不多,慢慢熟悉就好了。多用用有益无害。 (7)QQ,Wechat.腾讯帝国的软件,现在很多老外也在用了,我的一个外国客户就是我在微信上面认识的,摇一摇,正好摇出来,最后慢慢谈着,客户也是他们本国的进口商,微信摇出来的感情。没事摇一摇,必能摇出大奖。 (8)Google Talk,google集团出的一般软件,就是很不稳定,非常慢。可以试试加好友。

JAVA代码编写一简单网络聊天程序

要求:聊天室服务器、聊天室客户端;客户端之间可以聊天。 因为我是初级选手,想借此程序分析学习java,所以代码最好多一点注释... 分数有限,望大家不吝赐教!!问题补充: 需要图形用户界面哦,最好用swing组件 服务器端:采用多线程,可以向客户广播:当前聊天室人数,客户名称列表,客户进入离开提示; 客户端:可以设定昵称,性别,客户间可以私聊 服务器端: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import https://www.360docs.net/doc/e411133899.html,.*; public class Server extends JFrame implements ActionListener{ JPanel contentPane; JLabel jLabel2 = new JLabel(); JTextField jTextField2 = new JTextField("4700"); JButton jButton1 = new JButton(); JLabel jLabel3 = new JLabel(); JTextField jTextField3 = new JTextField(); JButton jButton2 = new JButton(); JScrollPane jScrollPane1 = new JScrollPane(); JTextArea jTextArea1 = new JTextArea(); ServerSocket server = null; Socket socket = null;BufferedReader instr =null;PrintWriter os=null ; //Construct the frame public Server() { jbInit(); } class MyThread extends Thread{//该线程负责接受数据 public void run(){ try{ while(true){ this.sleep(100); instr= new BufferedReader(new InputStreamReader(socket.getInputStream())); if(instr.ready()){ //检查是否有数据 jTextArea1.append("客户端: "+instr.readLine()+"\n"); } } }catch(Exception ex){} }

p2p原理

P2P之UDP穿透NAT的原理与实现(附 源代码) P2P 之 UDP穿透NAT的原理与实现(附源代码) 原创:shootingstars 参考:https://www.360docs.net/doc/e411133899.html,/draft-ford-midcom-p2p-01.txt 谁先动,谁吃亏 论坛上经常有对P2P原理的讨论,但是讨论归讨论,很少有实质的东西产生(源代码)。呵呵,在这里我就用自己实现的一个源代码来说明UDP穿越NAT的原理。 首先先介绍一些基本概念: NAT(Network Address Translators),网络地址转换:网络地址转换是在I P地址日益缺乏的情况下产生的,它的主要目的就是为了能够地址重用。NAT分为两大类,基本的NAT和NAPT(Network Address/Port Translator)。 最开始NAT是运行在路由器上的一个功能模块。 最先提出的是基本的NAT,它的产生基于如下事实:一个私有网络(域)中的节点中只有很少的节点需要与外网连接(呵呵,这是在上世纪90年代中期提出的)。那么这个子网中其实只有少数的节点需要全球唯一的IP地址,其他的节点的IP地址应该是可以重用的。 因此,基本的NAT实现的功能很简单,在子网内使用一个保留的IP子网段,这些IP对外是不可见的。子网内只有少数一些IP地址可以对应到真正全球唯一的IP地址。如果这些节点需要访问外部网络,那么基本NAT就负责将这个节点的子网内IP转化为一个全球唯一的IP然后发送出去。(基本的NAT会改变IP 包中的原IP地址,但是不会改变IP包中的端口) 关于基本的NAT可以参看RFC 1631 另外一种NAT叫做NAPT,从名称上我们也可以看得出,NAPT不但会改变经过这个NAT设备的IP数据报的IP地址,还会改变IP数据报的TCP/UDP端口。基本NAT的设备可能我们见的不多(呵呵,我没有见到过),NAPT才是我们真正讨论的主角。看下图: Server S1 18.181.0.31:1235 | ^ Session 1 (A-S1) ^ | | 18.181.0.31:1235 | | v 155.99.25.11:62000 v | |

移动互联网聊天工具分析报告

移动互联网IM服务市场分析报告 一、行业及市场格局分析 1、行业概况:统计表明,目前移动互联网用户MIM的使用率高达73%,如同IM在互联网用户中的渗透一样,很多用户都是通过朋友间告知而开始使用该业务的。对运营IM的服务商而言,这一业务的最大价值在于对用户的高度黏性。这是由三方面的业务特点决定的:一是MIM客户端可以占领用户的手机和PC桌面;二是用户对IM账号会形成依赖;三是用户的社交关系一旦与某一个IM 软件结合,就再难轻易地转用其他IM软件。因此,无论是互联网服务商还是移动运营商,都对MIM业务寄予了厚望。通过MIM业务实现移动互联网客户群的积累,并进一步实施客户流量的价值经营,包括对移动互联网业务组合的针对性营销和社区经营等。 中国移动的飞信业务是一款综合信息通信平台,截至2008年第三季度,飞信活跃用户已经超过2650万,在国内IM市场排名第二。最早,中国移动与腾讯合作推出移动QQ服务,在手机终端与PC QQ直接短信互通,让手机用户得到移动化的IM服务,从而让合作双方都得到了“相当不错”的业务收入。之后,在自营MIM业务“飞信”全面推出之际,2006年6月,中国移动向部分省公司下发通知,要求暂缓与提供互联网IM业务的SP续签移动梦网合作协议。目前,中国移动和腾讯实现了飞信和QQ平台的对接,飞信用户和QQ用户之间通过飞信QQ业务实现互通,该合作业务成为飞信的一项子业务。从中国移动推出飞信前后与腾讯移动IM业务合作的分分合合中,我们看到了移动运营商与IM服务商之间的竞合矛盾。那么,站在移动运营商的角度,面对MIM这样一个既有丰富的用户使用需求,又可以带来至关重要的用户黏性及收入的战略型业务,应该如何切入、应该如何处理与优势IM服务商之间的关系,是一个值得慎重考虑的大问题。 2、市场格局: 飞信:飞信是中国移动的综合通信服务,即融合语音(IVR)、GPRS、短信等多种通信方式,覆盖三种不同形态(完全实时的语音服务、准实时的文字和小数据量通信服务、非实时的通信服务)的客户通信需求,实现互联网和移动网间的无缝通信服务。飞信不但可以免费从PC给手机发短信,而且不受任何限制,能够随时随地与好友开始语聊,并享受超低语聊资费。飞信Fetion 2012 Beta为最高版本,中国移动飞信实现无缝链接的多端信息接收,MP3、图片和普通OFFICE 文件都能随时随地任意传输,让您随时随地都可与好友保持畅快有效的沟通,工作效率高,快乐齐分享!飞信还具备防骚扰功能,只有对方被您授权为好友时,

C+++网络聊天室设计报告和源程序

目录 1.需求分析 (2) 2.相关知识............................................... - 3 -2.1W INSOCK介绍 (3) 2.2MFC类CA SYNCSOCKET和CS OCKET (3) 2.3利用CS OCKET进行有连接的通信 (4) 3.详细设计................................... 错误!未定义书签。 3.1客户端的实现 (4) 3.2服务端的实现 (8) 4.程序运行结果.......................................... - 13 -4.1服务器端 .. (13) 4.2客户端 (13) 5.参考文献 ................................................................................................................... 错误!未定义书签。

1.需求分析 当前是数字信息时代,网络时代,任何一种编辑工具都不能忽视在网络上的应用,并且随着Internet 的普及和宽带技术的成熟,越来越多的用户进入网络世界中享用浏览新闻、查询信息、发送邮件、在线观看电影等服务,享受网络带来的便利和办公的高效,与此同时一个新型的Web应用程序为网民之间提供了一个实时通信的功能和场所,这就是聊天室。 在网络早期就开始盛行,不论是BBS,IRC 都有类似网上聊天室的机制。聊天室为网友提供了实时性对话的渠道,是网络上极为流行的一项服务。 聊天室适用于网上会议或闲聊的一些场合。聊天室为网友提供了较好的交友环境,网友之间相互以文字交谈,在形式上有点类似笔友的性质,却大大节省了书信往返的时间,这也是网上交友之所以如此热门的原因。 聊天室的设计目标 本课题是建立聊天通信模型,设计一个聊天室软件,包括服务器端和客户端,主要功能为: 服务器端功能: 1、初始化socket, 创建服务器端。 2、维护一个链表,保存所有用户的IP地址、端口信息。 3、接受用户传送来的聊天信息,然后向链表中的所用用户转发。 4、接受用户传送来的连接判断命令,并向用户发出响应命令。 客户端功能: 客户端界面上的两个文本框,一个用于显示接受的聊天信息,一个用来接受用户输入的聊天信息。当按下“发送”按钮时将信息发送给服务器。 通过本课题的毕业设计,可以比较深入的了解和掌握WINSOCK控件基本属性、方法和事件,理解网络聊天通信的概念,输控制协议(TCP)进行数据交流,初步掌握网络聊天通信程序的设计方法。并能巩固和扩展大学期间的学习内容,进行项目的设计开发训练,更好的适应社会的需求。

即时聊天工具

一:腾讯QQ 【简介】:腾讯公司成立于1998年的11月12日,次年即1999年2月就推出了仿照ICQ软件的中国版IM工具OICQ,它可以说是QQ的前生。时至今日,腾讯已经成为中国软件行业的巨无霸,QQ的大名更是无人不知,没人不晓,差不多每个网友都拥有一个QQ号。至于说腾讯QQ为什么能取得如此辉煌的成功,应该是一半靠的是实力,另一半靠的是运气。 【特色】:说老实话,腾讯QQ最大的特色也是其最大的优势,应该就是其无比庞大的用户数量。而就它的功能来说,可以说是青出于蓝而胜于蓝,并且已经到达了一个相对的顶峰。其操作简单,支持实时的音视频聊天,支持大文件传输、深入人心的群功能,以及精彩的在线游戏等多种增值功能,让它已经成为了一个时代的标志! 点评】:QQ可以说是中国IT行业的骄傲,它功能强大丰富、操作简单而易用,娱乐性很强,它的身影已经遍布中国的大街小巷。对很多人来说,上QQ、玩QQ已经成为生活的一部分。虽然它有很多收费项目让不少用户一直抱怨,但真的想要离开它却发现又不是那么容易的事情! 二:微软MSN(Windows Live Message) 【简介】:微软公司创建于1975年,是全球最大的电脑

软件提供商,得益于Windows系列操作系统,使其成为全球软件行业的霸主。它的软件产品众多,1999年7月推出了网络即时信息客户程序MSN Messenger。目前MSN(从8.0开始新版本改名为Windows Live Message)可以说是国外IM领域最为流行的IM客户端之一,而在中国它的市场份额也一直处于前列,但却始终无法超越QQ。 【特色】:MSN是一种优秀的即时通信工具,它基于Microsoft 高级技术,可使您和您的家人更有效地利用 Web进行通信。目前MSN Messenger的最新版本是Windows Live Messenger 2009,它仍包含您所喜爱的Messenger 的一切功能:如联系人名单、图释以及使用文本、声音和视频与您的朋友即时联系。此外,它还提供了轻松连接并共享照片和文档的新方式。可惜,Windows Live Messenger中用户无法进行好友查找;【点评】:和QQ不同,MSN的特色之处在于它的严肃和保守性,这使得它更受企业用户所青睐,同时这也使得它的用户群更集中在公司的白领职员中,而这也是MSN的市场占有率始终停步不前无法超越QQ的主要原因。并且它的界面及操作和QQ相比风格差别比较明显。而新版的Windows Live Messenger为了打破这种局面,加入了更多有趣功能,但就娱乐性而言仍然无法和QQ相提并论; 三:百度Hi

盘点世界各大即时聊天工具

ICQ,互联网上最流行的即时信息传递软件。名称来自I seek you (我在找你),它支持在 Internet 上聊天、发送消息和文件等。作为IM软件领域的缔造者,不得不说它成就了一个辉煌。1996年7月成立的Mirabilis公司于同年11月推出了全世界第一款即时通讯软件ICQ(目前ICQ已经归AOL旗下所有),取意为"我在找你"--"I Seek You",简称ICQ。这款软件一经推出,即刻全球响应,凭借着前所未有的创意很快在全世界拥有了大批的用户,即使在当时互联网不太发达的亚洲,市场用户量也占到了70%,在国内更是占到了80%。但是到了现在,根据调查显示,国内如今的IM软件排名中ICQ只排到了第8位,差距竟如此之大。 QQ是深圳市腾讯计算机系统有限公司开发的一款基于Internet 的即时通信(IM)软件。腾讯QQ支持在线聊天、视频电话、点对点断点续传文件、共享文件、网络硬盘、自定义面板、QQ邮箱等多种功能。并可与移动通讯终端等多种通讯方式相连。1999年2月,腾讯正式推出第一个即时通信软件——“腾讯QQ”,QQ在线用户由1999年的2人到现在已经发展到上亿用户了,在线人数超过一亿。是目前使用最广泛的聊天软件之一。 MSN全称Microsoft Service Network(微软网络服务),是微软公司推出的即时消息软件,可以与亲人、朋友、工作伙伴进行文字聊天、语音对话、视频会议等即时交流,还可以通过此软件来查看联系人是否联机。微软MSN移动互联网服务提供包括手机MSN(即时通讯

Messenger)、必应移动搜索、手机SNS(全球最大Windows Live在线社区)、中文资讯、手机娱乐和手机折扣等创新移动服务,满足了用户在移动互联网时代的沟通、社交、出行、娱乐等诸多需求,在国内拥有大量的用户群。另外,msn还表示“忙啥呢”以及“美少年or 美少女”等的简称。 Google Talk是Google 的即时通讯方式,简称Gtalk。它可以进行文字google talk聊天以及电脑对电脑的语音连接通话。Google 此举进一步激化了它和雅虎,微软以及美国在线之间的竞争。 Google 网站已经推出了即时通讯软件的下载页面提供windows平台下的客户端软件。另外有网上使用的小工具可在各种平台下使用。Google 宣称,该软件“可以让你与朋友随时随地,在世界的任何一个角落自由的通话,发送即时讯息。”Go ogle的即时通讯软件和它的电子邮件服务,Gmail进行了结合。 Gtalk的聊天记录可以自动保存到网上自己的Gmail信箱,可以随时随地的翻阅过去,这也是深受大家喜爱的一个功能。 雅虎通是由全球领先的互联网公司雅虎(Yahoo!)推出的即时聊天工具,是国际主流即时通讯工具之一,美国2007年即时通讯市场占有率排名第一,全球每天有超过5千万人次登录和使用雅虎通它拥有独特的聊天情景(IMViroment);语音聊天室,超级视频等等功能,它能让您与朋友、家人、同事及其他人进行趣味十足的即时交流。

基于Qt的p2p局域网聊天和文件传输软件要点

基于Qt的局域网聊天和文件传输软件设计 摘要 随着计算机网络技术的飞速发展,人们对于网络的依赖性也越来越大。通过网络的局域网通信也越来越受到人们的喜爱,比如说现在非常流行的QQ局域网通信软件就解决了人们在网络中交流的需求。 基于Qt的P2P局域网聊天和文件传输软件,是基于TCP/IP协议中的TCP 和UDP协议完成的一个能够完成局域网通信和传输文件的软件,该软件实现了局域网内的通信,使用该软件作为通信和传输文件的工具,既简单又安全。 关键词:计算机网络, TCP, UDP , 文件传输; Abstract With the rapid development of computer network technology, people are more and more dependent on the network. Instant messaging via the Internet has become more and more popular, for example, it is now very popular QQ instant messaging software to solve the needs of people in the network communication. Based on P2P instant chat and file transfer software is based on TCP / IP protocol in the TCP and UDP protocols to complete a to complete the instant messaging and file transfer software, the software realized the LAN communication, the use of the software as a communication and file transfer tool, which is simple and safe. Key word:computer network,TCP, UDP , file transfer;

QQ聊天程序的网络通信原理

QQ聊天程序的网络通信原理 卢平 通信工程(2)班E09680220) QQ 的通信协议 QQ的通信协议是一套基于二进制数据的自己开发的应用层网络协议。其中使用一些公司的加密算法。QQ基本通信协议支持udp和tcp两种基本协议方式。两种方式的基本数据结构是一样的。只是tcp 包多了一个描述长度的头部。 QQ的通信原理 QQ聊天程序采用的是C/S通信模式,即客户/服务模式,它把一个应用划分成功能不同的两个部分,分别在不同的计算机上运行,其中一个为服务端程序,用来响应和提供固定的服务,一个为客户端程序,用来向服务端提出请求和要求某种服务。在数量关系上,通常有一对一的(即一个服务端程序和一个客户端程序之间通信),也有一对多的(即一个服务端程序和多个客户端程序之间通信),也有多对多的(即多个服务端程序和多个客户端程序之间通信)。所谓服务端程序、客户端程序也是相对的概念,有时在一个程序中既有服务端又有客户端的功能。QQ聊天程序分成了两个程序,一个安装在腾讯公司的服务器上,我们称之为服务端程序,一个安装在 QQ用户的计算机上,我们称之为客户端程序。在许多介绍网络通信编程的书籍中有关网络聊天的例子,当一个客户要与另一个客户聊天时,第一个客户先把聊天数据发送给服务器,然后服务器再把聊天数据转发给第二个客户,服务器好像一个中转站,这在客户数量比较少时,服务器还能承受,在客户数量比较多时,服务器肯定要瘫痪。何况客户之间还要传送文件、语音聊天、视频聊天等等,为了减少服务器的压力,各客户端之间需要直接通信。 1。在服务端和客户端之间(一对多) 用于客户端程序登录,验证用户密码,获取其它在线好友信息等等。 2。在客户端和客户端之间(多对多)

聊天软件需求分析

编号:__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.功能描述

20款网页聊天工具比下载一个聊天程序简单多了

20款网页聊天工具,比下载一个聊天程序简单多了! 因为要做一个网上聊天室,网上搜罗了一下,有些是网站程序,这些只要输如以下代码甚至只要一个不存在的网址即可!Meebo 称得上网页聊天的元老,有几十种国家 语言版本,能很好的支持中文。支持AIM、Yahoo!、MSN、Google Talk、ICQ以及Jabber。用户可自定义Widget的标题和联系人名称,大小和颜色。网址: https://www.360docs.net/doc/e411133899.html,/ ebuddy 2003年就推出了网 页式聊天。支持的IM包括MSN、AIM、Yahoo、GTalk、ICQ 以及Myspace。另外,如果你的手机设备支持xHTML或者WAP ,就可以利用eBuddy的移动版本进行聊天了。如手 机访问https://www.360docs.net/doc/e411133899.html,就可通过ebuddy登陆msn 了。网址:https://www.360docs.net/doc/e411133899.html,/ radiusIM 基于Ajax技术构建的在线web聊天服务,试用感觉不是很稳定,速度也比较慢.。支持的IM: Yahoo, AIM, MSN 以及GTalk。radiusIM会自动检测你的地址位置,并在radiusIM中置入Google Map标识这个位置。通过拖拉Google Map,你能发现在地图中标注出来的各地会员。如果你想去某个城市旅游,通过radiusIM的地图找位会员先了解情况倒是不错的方法。网址:https://www.360docs.net/doc/e411133899.html,/ https://www.360docs.net/doc/e411133899.html, 会将读者的 聊天信息发送到博客作者或者网站管理员的即时通信软件。

https://www.360docs.net/doc/e411133899.html,几乎支持所有网站程序(例如WordPress、blogger、Facebook等)以及多国家和地区语言,支持ichat、adium、Jabber与Google Talk等即时聊天软件,并且具有很好的可定制性。博客作者或者网站管理员最多可同时与5名读者交流。值得一提的是,https://www.360docs.net/doc/e411133899.html,会在用户第一次打开聊天窗口时就和服务器建立Session和Cookie,以确保用户在关闭浏览器以后下次再次访问该站点时仍然能够收到站长回复的 消息。详细介绍网址:https://www.360docs.net/doc/e411133899.html,/ Toksta 是一款包括文字、语音及视频的网页聊天工具。Toksta的聊天窗口是独立于其嵌入代码的网页运行的,这样使得用户的聊天不会影响其继续浏览网页内容。另外,Toksta与MSN等即时聊天软件非常类似,注册后还可以添加好友。Toksta是完全免费的,不过Toksta会在用户接入视频聊天等待的时间插入一些广告,Toksta还允许网站拥有者分享广告收入,或者插入自己的广告。详细介绍网址: https://www.360docs.net/doc/e411133899.html,/ Jabbify 除了提供Javescript 代码还提供了Wordpress插件。可通过GTalk来回复留言,只需加你的域名@https://www.360docs.net/doc/e411133899.html,为好友即可。另外Jabbify提供了后台管理系统,可以按照日期查询所有的留言,管理留言用户,过滤关键词等等。网址:https://https://www.360docs.net/doc/e411133899.html,/ Plugoo 支持的即时通讯工具包括MSN、Google Talk、Yahoo! 、AIM、ICQ、Jabber。注册以后系统会自动添加

P2P端口映射、UPnP功能和使用详解

P2P端口映射UPnP功能和使用详解 一、UPnP的概念: 以下是微软官方网站对UPnP的解释: 问:什么是UPnP? 答:通用即插即用(UPnP) 是一种用于PC 机和智能设备(或仪器)的常见对等网络连接的体系结构,尤其是在家庭中。UPnP 以Internet 标准和技术(例如TCP/IP、HTTP 和XML)为基础,使这样的设备彼此可自动连接和协同工作,从而使网络(尤其是家庭网络)对更多的人成为可能。 问:UPnP 对消费者意味着什么? 答:简单、更多选择和更新颖的体验。包含通用即插即用技术的网络产品只需实际连到网络上,即可开始正常工作。实际上,UPnP 可以和任何网络媒体技术(有线或无线)协同使用。举例来说,这包括:Category 5 以太网电缆、Wi-Fi 或802.11B 无线网络、IEEE 1394("Firewire")、电话线网络或电源线网络。当这些设备与PC 互连时,用户即可充分利用各种具有创新性的服务和应用程序。 以下是BC官方网站对UPnP的解释: UPnP(Universal Plug and Play),通用即插即用,是一组协议的统称,不能简单理解为UPnP=“自动端口映射”。在BitComet下载中,UPnP包含了2层意思: 1、对于一台内网电脑,BitComet的UPnP功能可以使网关或路由器的NAT模块做自动端口映射,将BitComet监听的端口从网关或路由器映射到内网电脑上。 2、网关或路由器的网络防火墙模块开始对Internet上其他电脑开放这个端口。 我倒是觉得微软的解释过于理论化,适合写入牛津大词典;而BC官方网站的解释过于含蓄晦涩。其实对于一般的使用者来讲,简单的把UPnP理解为自动端口映射就可以了。它就是一种基于TCP/IP协议的,针对设备彼此间的通讯而制订的新的Internet协议,目的就是希望未来所有联入Internet中的设备能够不受网关阻碍的相互通信。 二、哪些用户需要用UPnP功能? 1、只有在需要使用一些支持UPnP功能的P2P软件的时候,如BT、电骡eMule、MSN 等,我们才需要考虑UPnP这个东东。如果你根本就不用这些软件,仅仅是上网浏览的话,下文就没必要看了; 2、如果你需要使用这些P2P软件,但你是外网用户,那么下文也可以不看了,因为你不需要做什么UPnP就可以正常使用这些P2P软件了;

P2P聊天软件综述

P2P聊天软件 一:软件构架 开发环境:Visual studio 2008 开发语言:C++ 软件框架:MFC 软件功能图: 二:服务器设计 1.数据设计 (1)用户基本信息user_info 序号字段名含义数据类型 1 user_id 用户ID unsigned long 2 user_name 用户显示名称string 3 user_ip 用户IP地址string 4 user_port 用户监听端口short 其中user_id字段为登录时服务器自动分配 (2)登陆用户列表friend_list 含义:用于在客户端或者服务器端保存在线用户信息 数据类型vector (3)消息message 含义:peer之间发送的消息 数据类型:string 2.登录设计(如下图)Array (1)和(2)的登录交互用TCP协议实现。 (1)过程客户端向服务器发送带有user_info结构的信息。服务器仅使用user_name。(2)过程服务器填充user_info的user_id域,把该user_info添加到在线用户列表中,然后向客户端发送该列表。 在客户端登录时,user_id必须设置为0;

其中填充user_id域的方法是:把该user_info在服务器列表中的位置编号-1作为user_id。三:使用方法 首先启动服务器程序,打开服务端软件。然后再点击启动。如下图所示:此时服务器会在它的ip地址与端口进行监听。这里应该注意的是服务器的监听端口是写死了的。在客户端是可以改服务器的端口的,不过现在的版本的服务器还没有实现这一功能。所以在找服务器的时候只改IP地址就行了。不要改端口号。不然就会连不上服务器。 启动服务器程序后,就可以启动客户端程序。客户端可以与服务器在同一个计算机上,也可以不在一个局域网内。只要接入了internet就可以。 已经说过了,现在的这一个版本只能改服务器的IP,而不能够改端口号。以后可以改进这一个功能。上图中的灰色登陆成功按钮在没有进行登陆之前显示的是“登陆”。在设置好服务器的地址与端口后。若能够成功的连接到服务器端口上,则会显示登陆成功。同时也

网络聊天程序

部分程序代码 一、消息的发送设置 void CChatDlg::OnBtnSend() { // TODO: Add your control notification handler code here DWORD dwIP; ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP); SOCKADDR_IN addrTo; addrTo.sin_family=AF_INET; addrTo.sin_port=htons(6000); addrTo.sin_addr.S_un.S_addr=htonl(dwIP); CString strSend; GetDlgItemText(IDC_EDIT_SEND,strSend); sendto(m_socket,strSend,strSend,GetLength()+1,0, (SOCKADDR*)&addrTo,sizeof(SOCKADDR)); SetDlgItemText(IDC_EDIT_SEND,""); } 二、接收数据 void CChatDlg::OnRecvData(WPARAM wParam,LPARAM lParam) { CString str=(char*)lParam; CString strTemp; GetDlgItemText(IDC_EDIT_RECV,strTemp); str+="\r\n"; str+=strTemp; SetDlgItemText(IDC_EDIT_RECV,str); } 三、获取IP地址 DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter) { SOCKET sock=((RECVPARAM*)lpParameter)->sock; HWND hwnd=((RECVPARAM*)lpParameter)->hwnd; SOCKADDR_IN addrFrom; int len=sizeof(SOCKADDR);

p2p设置

| 网站首页 | 绿软基地 | 最新绿软 | 热门绿软 | 网络学院 | 源码下载 | 装机绿软 | 网站地图 ?首页 ?系统工具 ?网络工具 ?应用软件 ?多媒体 ?游戏工具 ?教程书籍 ?图形图像 ?绿软基地公告: 装机绿软 ?操作系统 ?卡巴斯基 ?视频转换 ?ASP源码 ?PHP源码 ?.NET源码 ?模板素材 ?网页制作 ?网络编程 ?视频教程 您现在的位置:易网绿软基地 >> 网络学院 >> 电脑教室 >> 软件学堂 >> 正文 P2P终结者使用方法教你如何使用局域网限制别人P2P下 载 文章来源:网络阅读:92865次更新时间:2009-5-25 20:09:02 P2P终结者使用方法 P2P终结者是一款真正只需要在任意一台主机安装即可控制整个网络的P2P流量以及WWW,QQ聊天及各种下载软件

的网管必备工具软件,它具有很好的控制透明性,有效地解决了令许多网络管理员极为头痛的众多问题,软件基于底层协议分析处理实现,具有很好的透明性。 P2P终结者可以适应绝大多数网络环境,包括代理服务器、ADSL路由器共享上网,Lan专线等网络接入环境。P2P 终结者目前可以控制绝大部分流行的P2P软件下载,它可以对目前主流的P2P软件使用协议进行灵活地控制,其中包括Bittorent,比特精灵,贪婪BT,PP,Poco,Kamun卡盟,Bitcomet、Thunder,Kugoo,eMule等等,还支持指定主机全局带宽限制、主机网络带宽实时查看功能、自定义ACL规则控制、IP-MAC绑定控制、网络主机通讯详细信息(IP报文内容分析)实时查看、HTTP下载自定义文件后缀控制功能、FTP下载限制功能、WWW站点自定义控制功能,支持黑名单、白名单方式,以及对QQ,MSN,PoPo,UC聊天工具进行控制,现在就介绍一下它的具体使用方法与过程。 一、监控1、选择网卡2、开始监控 第一步:软件安装非常简单,一路Next下一步便可,不再赘述。当你第一次启动P2P终结者时,会打开它的“系统初始化设置”对话框,如图1,在此窗口中选择你的“接入公网类型”如选择“ADSL路由器共享上网”项,和“请您选择网络连接设备类型”如“交换机”项,和你的公网接入带宽,这些设置都需要如实填写,否则会使软件不能正常工作,影响你的网络监控管理。

相关文档
最新文档