基于IPv6的网络编程文件传输聊天Word下载.docx
《基于IPv6的网络编程文件传输聊天Word下载.docx》由会员分享,可在线阅读,更多相关《基于IPv6的网络编程文件传输聊天Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
采用的体系结构风格是服务器/客户端风格(C/S)。
服务器端建立socket连接,然后监听端口,等待客户端的连接。
在客户端连接之前,消息编辑窗口都设置为不可编辑状态。
当有客户端连接后,消息编辑窗口才设置为可编辑状态。
本程序的功能就是实现简单的基于TCP协议的聊天,即简单的消息发送。
3、聊天程序流程图和设计方案
1)聊天程序流程图
2)设计方案
服务器端的设计:
服务器端的界面由一个主窗口加三个控件组成,其中有两个edit控件和一个button控件。
程序设计窗口截图如下:
指定好服务端口号,本程序指定为1111。
然后建立窗口函数所关心的SOCKET通信消息,为程序为FD_ACCEPT和FD_READ。
在服务器端建立本地socket,用bind函数绑定本地套接字地址,最大连接数设置为5。
完成之后进行监听,看是否有客户端请求连接,若有则接受连接。
建立连接之后用,如果要发送数据,则在下面的sendEdit里面输入想要发送的内容,然后点击“发送”按钮。
”发送”按钮发送出一个WM_COMMAND消息,窗口函数接收WM_COMMAND消息,将接收到的消息用send函数发送出去。
当客户端有消息发送过来的时候,同样的要捕获消息,用recv函数进行接收数据。
通信结束之后释分配给套接字的资源。
客户端的设计:
客户端的界面设计和服务器端的基本一致,是窗口标题不同。
指定好待连接的服务器的IP地址和服务器端口号,很显然地端口和服务器设置的一样,为1111。
然后建立窗口函数所关心的SOCKET通信消息,这里需要设置FD_ACCEPT和FD_CONNECT。
根据连接服务器的套接字,使用connect函数建立连接。
当要发送消息的时候则在下面的sendEdit里面输入想要发送的内容,然后点击“发送”按钮。
四、选择开发环境
开发环境:
VisualC++6.0
设计过程(步骤)或程序代码
源程序:
1)服务器端.
#include<
windows.h>
winsock.h>
#defineID_RECEIVEEDIT1
#defineID_SENDEDIT2
#defineID_PUSHME3
#defineSERVER_PORT1111
#defineWM_SOCKET(WM_USER+1)
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,
LPSTRlpcmdLine,intnCmdShow)
{
staticTCHARszAppName[]=TEXT("
ChatServer"
);
staticTCHARszClassName[]=TEXT("
ChatServerClass"
HWNDhwnd;
MSGmsg;
WNDCLASSwndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szClassName;
if(!
RegisterClass(&
wndclass))
{
MessageBox(NULL,TEXT("
ThisprogramrequiresWindowsNT!
"
),
szAppName,MB_ICONERROR);
return0;
}//注册窗口类
hwnd=CreateWindow(szClassName,TEXT("
SimpleWinSockChatServer"
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
//建立主窗口
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&
msg,NULL,0,0))
TranslateMessage(&
msg);
DispatchMessage(&
}//消息循环
returnmsg.wParam;
}
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)
HINSTANCEhInstance;
staticHWNDhwndReceiveEdit,hwndSendEdit,hwndPushButton;
intnSize;
WSADATAWSAData;
staticstructsockaddr_inserver,from;
staticSOCKETlocal_server,local_listen;
intnError;
WORDwEvent,wError;
staticTCHARszReceive[1024];
staticTCHARszSend[1024];
switch(message)
caseWM_CREATE:
hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
hwndReceiveEdit=CreateWindow(TEXT("
edit"
NULL,
WS_CHILD|WS_VISIBLE|WS_DISABLED|WS_HSCROLL|WS_VSCROLL
|WS_BORDER|ES_MULTILINE|ES_AUTOVSCROLL
|ES_AUTOHSCROLL|ES_LEFT,
0,0,0,0,
hwnd,
(HMENU)ID_RECEIVEEDIT,
hInstance,
NULL);
hwndSendEdit=CreateWindow(TEXT("
NULL,
WS_CHILD|WS_VISIBLE|WS_DISABLED|WS_HSCROLL|WS_VSCROLL
|WS_BORDER|ES_MULTILINE|ES_AUTOVSCROLL
|ES_AUTOHSCROLL|ES_LEFT,
0,0,0,0,
hwnd,
(HMENU)ID_SENDEDIT,
hInstance,
NULL);
hwndPushButton=CreateWindow("
button"
"
发送"
BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE,
(HMENU)ID_PUSHME,
//以上为建立三个窗口控件
if(nError=WSAStartup(MAKEWORD(2,0),&
WSAData))
{
MessageBox(hwnd,"
WinSockStartupError!
"
Server"
MB_ICONERROR|MB_OK);
returntrue;
}//指定socket版本为2.0
local_server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(local_server==INVALID_SOCKET)
SocketCreationError!
WSACleanup();
returnTRUE;
}
if(SOCKET_ERROR==WSAAsyncSelect(local_server,hwnd,WM_SOCKET,FD_ACCEPT|FD_READ))
WSAAsyncSelectError!
closesocket(local_server);
}//将套字接消息绑定到窗口消息。
server.sin_family=AF_INET;
server.sin_port=htons(SERVER_PORT);
if(SOCKET_ERROR==bind(local_server,(structsockaddr*)&
server,sizeof(server)))
BindError!
}//套接字地址绑定。
listen(local_server,5);
caseWM_SIZE:
MoveWindow(hwndReceiveEdit,0,0,LOWORD(lParam),HIWORD(lParam)/2-10,TRUE);
MoveWindow(hwndSendEdit,0,HIWORD(lParam)/2-10,LOWORD(lParam),HIWORD(lParam)/2-10,TRUE);
MoveWindow(hwndPushButton,0,HIWORD(lParam)-20,LOWORD(lParam),20,TRUE);
caseWM_SOCKET:
wEvent=WSAGETSELECTEVENT(lParam);
//从lParam参数中获取事件代码
wError=WSAGETSELECTERROR(lParam);
//从lParam参数中获取错误代码
switch(wEvent)
caseFD_ACCEPT:
if(wError)
{
MessageBox(hwnd,"
AccepteError!
return0;
}
nSize=sizeof(from);
local_listen=accept(local_server,(structsockaddr*)&
from,&
nSize);
EnableWindow(hwndSendEdit,TRUE);
return0;
//接受并建立与客户端的TCP连接
caseFD_READ:
ReadError!
recv(local_listen,szReceive,sizeof(szReceive)-1,0);
SetWindowText(hwndReceiveEdit,szReceive);
//读取客户端发送来的数据
caseWM_SETFOCUS:
SetFocus(hwndSendEdit);
caseWM_COMMAND:
if(LOWORD(wParam)==ID_PUSHME)
if(HIWORD(wParam)==BN_CLICKED)
GetWindowText(hwndSendEdit,szSend,GetWindowTextLength(hwndSendEdit)+1);
send(local_listen,szSend,strlen(szSend)+1,0);
//发送数据
caseWM_DESTROY:
closesocket(local_server);
closesocket(local_listen);
WSACleanup();
PostQuitMessage(0);
}
returnDefWindowProc(hwnd,message,wParam,lParam);
2)客户端
#defineSERVER_ADDR"
192.168.1.3"
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPreInstance,
ChatClient"
ChatClientClass"
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
SimpleWinSockChatClient"
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
//建立窗口
staticstructsockaddr_inserver;
staticSOCKETremote_server;
caseWM_CREATE:
hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
hwndReceiveEdit=CreateWindow(TEXT("
hwndSendEdit=CreateWindow(TEXT("
hwndPushButton=CreateWindow("
//建立窗口架构
if(nError=WSAStartup(MAKEWORD(2,0),&
Client"
returnTRUE;
}//指定socket版本号为2.0
remote_server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(remote_server==INVALID_SOCKET)
WSACleanup();
if(SOCKET_ERROR==WSAAsyncSelect(remote_server,hwnd,WM_SOCKET,FD_CONNECT|FD_READ))
closesocket(remote_server);
}//消息绑定
server.sin_family=AF_INET;
server.sin_port=htons(SERVER_PORT);
server.sin_addr.S_un.S_