|
|
用VC6.0向导生成的程序框架(Dialog-based),
服务器端:有个按钮用于启动服务器,一个编辑框(CEdit m_message_receive)用于显示收到的数据,一个编辑框(CString m_message_send)用于发送数据;
客户端:有个按钮用于发出连接,两个编辑框同样的作用;
服务器端:定义了CSocket的继承类指针各一,一为CListenSocket *listenSkt,一为CClientSocket *clientSkt,前者用于监听连接,后者用于接受一个连接;
服务器对话框构造函数内分别置为NULL;
思路为:套接字只监听消息,并通知对话框。
主要函数为:
启动监听----
void CChatServerDlg::OnStartServer(){
if(listenSkt!=NULL) {AfxMessageBox("server has been started!");return;}
listenSkt=new CListenSocket(this);//建立监听套接字
clientSkt=NULL;
if(!listenSkt->Create(4000)){//端口为4000
AfxMessageBox("Cann't start server!");
return;
}
if(!listenSkt->Listen()){//开始监听
AfxMessageBox("listen failour!");
return;
}
clientSkt=NULL;
AfxMessageBox("Server has started and been listening");
}
接受连接请求:
void CChatServerDlg::AcceptConnection(){
clientSkt=new CClientSocket(this);
if(!listenSkt->Accept(*clientSkt)){
AfxMessageBox("socket 接受异常!");
return;
}
CString mes="connection has been created";
clientSkt->Send(mes.operator LPCTSTR(),mes.GetLength());
}
将收到的数据显示在编辑框(m_message_receive)内:
void CChatServerDlg::ReceiveMessage(CClientSocket* skt){
char mes[100];
CString message;message.Format("%s",mes);
skt->Receive(mes,100);
int length=strlen(mes);
mes[length]='\n';mes[length+1]='\0';
int len=m_message_receive.GetWindowTextLength();
m_message_receive.SetSel(len,len);
m_message_receive.ReplaceSel(message);
UpdateData(false);
}
发送数据:
void CChatServerDlg::OnSend()
{ UpdateData(false);
clientSkt->Send(m_message_send.operator LPCTST(),m_message_send.GetLength());
m_message_send="";
UpdateData(true);
}
以下为客户端:
定义一CSocket类的继承类CClientSocket* clientSocket;
基本实现同服务器端差不多,
连接服务器为:
void CChatClientDlg::OnConncetToServer() //socket 为客户端套接字
{
if(socket!=NULL) {AfxMessageBox("connection has been created.");return;}
socket=new CClientSocket(this);
if(!socket->Create()){
AfxMessageBox("socket create failour!");
return;
}
if(!socket->Connect("gxl",4000)){
AfxMessageBox("connect to server failor");
return;
}
AfxMessageBox("connection has been created.");
}
本以为是个极简单的程序,但不能如愿工作:
一:客户端发不出信息,虽然连接上了;
二:也受不到服务器端发来的信息;
还有顺便问一下:怎么在编辑框内输入一行数据,然后在输入另一行?
不好意思,一个学习非常郁闷,出了问题找不到人请教,总得不到解答,无意中看到这个网站,象看到了救星,盼望高手不要耻笑这么低级的问题,有时道理已经弄的很清楚,实现起来还是会有点问题。
附上原件: |
|