计算机网络通信设计课程设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void NewSocket::OnClose(int nErrorCode)
{
CSocket::OnClose(nErrorCode);
m_pMyDlg->AccessClose( );
}
void CFirstDlg::AccessClose()
{
m_pNewSocket->Close( );
delete m_pNewSocket;
void CFirstDlg::OnSendData()
{
NewSocket *pSocket;
if( m_pNewSocket )
pSocket = m_pNewSocket;
elseΒιβλιοθήκη Baidu
pSocket = &m_Socket;
char Data[100];
UpdateData( TRUE );
strcpy( Data, m_DataSend );
CWnd *pWnd = GetDlgItem( IDC_New );
pWnd->EnableWindow( FALSE );
pWnd = GetDlgItem( IDC_Link );
pWnd->EnableWindow( TRUE );
}
}
首先,作为服务器首先要开放端口,而作为客户机而要呼叫相应端口建立连接,m_nType的值代表了程序作为客户机还是服务器,若m_nType=0,代表服务器,m_nType=1代表客户机,若为服务器则m_Socket.Create( m_nPortNumber )利用m_nPortNumber的端口号创建套接字,如果成功则调用m_Socket.Listen( )进行监听,若为客户机则先调用m_Socket.Create( )创建一个套接字,然后调用m_Socket.Connect( str, m_nPortNumber )对相应的ip地址和端口号进行连接。
2.定义要连接的服务端对应的监听端口
3.与服务端建立连接
4.建立连接后可以向服务端写数据
程序示例:
服务器端:
1.public class Server {
2.
3.public static void main(String args[]) throws IOException {
4.int port = 8899;
void NewSocket::OnAccept(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
CSocket::OnAccept(nErrorCode);
NewSocket *pSocket = new NewSocket;
pWnd->EnableWindow( FALSE );
pWnd = GetDlgItem( IDC_New );
pWnd->EnableWindow( TRUE );
}
此时,服务器也能主动发起关闭链接的请求。
其他资料:
Socket与TCP/IP协议之间的关系
编程实现的Socket通讯框图
利用java实现的Socket通讯步骤
}
在对方收到数据传输的要求后,就调用NewSocket的OnReceive函数进行数据接受,this是指始终指向对象本身的指针,在这里如果是服务器则指m_pNewSocket,如果是客户机则指&m_Socket,然后对this中的数据进行AccessDataRecieve()函数操作。
void CFirstDlg::AccessDataRecieve(NewSocket *pSocket)
if( Accept( *pSocket ) )
{
m_pMyDlg->m_pNewSocket = pSocket;
pSocket->m_pMyDlg = m_pMyDlg;
}
else
delete pSocket;
}
在客户机对服务器进行呼叫连接时,若服务器已处于监听状态,收到客户机连接请求时,则产生消息调用OnAccept();OnAccept()中新定义一个NewSocket类pSocket指针用来指向新建立的连接,并将地址赋予m_pNewSocket,用于接下来的处理。
pWnd = GetDlgItem( IDC_New );
pWnd->EnableWindow( TRUE );
}
完成通讯后,若服务器客户机其中一方发起关闭连接的请求,则调用OnLink()函数发起主动关闭连接的请求,首先若m_nType=0,则说明主动关闭连接的是服务器,由于服务器在整个通讯过程中使用的是m_pNewSocket指针对NewSocket中函数进行调用,所以此时依然使用的是m_pNewSocket调用close()进行关闭,同理,若为客户机则使用m_Socket进行关闭。
4.int port = 8899;
5.Socket client = new Socket(host, port);
Windows环境下TCP/IP数据传输程序的基本运行步骤和编程方法
在编此程序时,我们首先创造了一个支持Windows Socket功能的基类,在此基础上我们又添加了一个继承的基类为CSocket的新类,CSocket是MFC在CAsyncSocket基础上派生的一个同步阻塞Socket的封装类,内支持TCP/IP传输的OnAccept,OnReceive,Onclose等函数。因为在进行TCP/IP通讯时,我们需要用到以上函数调用,所以添加了此子类。
void CFirstDlg::OnLink()
{
if( m_nType==0 )
m_pNewSocket->Close( );
else
m_Socket.Close( );
//m_pNewSocket->Close( );
CWnd *pWnd = GetDlgItem( IDC_Link );
pWnd->EnableWindow( FALSE );
void CFirstDlg::AccessClose()
{
if(m_nType==0)
{
m_pNewSocket->Close( );
delete m_pNewSocket;
m_pNewSocket = NULL;
}
else
{
m_Socket.Close();
}
CWnd *pWnd = GetDlgItem( IDC_Link );
20.socket.close();
21.server.close();
22.}
23.}
客户机端:
1.public class Client {
2.public static void main(String args[]) throws Exception {
3.String host = "127.0.0.1";
5.ServerSocket server = new ServerSocket(port);
6.Socket socket = server.accept();
7.Reader reader = new InputStreamReader(socket.getInputStream());
8.char chars[] = new char[64];
15.Writer writer = new OutputStreamWriter(socket.getOutputStream());
16.writer.write("Hello Client.");
17.writer.flush();
18.writer.close();
19.reader.close();
例举最简单的客户端写服务端读的例子
服务端:1.首先定义一个ServerSocket监听在你自己设置的端口上
2.server尝试接收其他Socket的连接请求
3.跟客户端建立好连接之后,我们就可以获取socket的InputStream,并从中读取客户端发过来的信息。
客户端:1.定义要连接的服务端IP地址
str.Format("%d.%d.%d.%d",ipAdress1,ipAdress2,ipAdress3,ipAdress4 );
if( !m_Socket.Connect( str, m_nPortNumber ) )
{
MessageBox( "连接服务器失败!" );
return;
}
MessageBox( "连接服务器成功!" );
m_Socket.Listen( );
}
else
{
BOOL bRet = m_Socket.Create( );
UpdateData( TRUE );
CString str;
unsigned char ipAdress1,ipAdress2,ipAdress3,ipAdress4;
m_IPAddress.GetAddress(ipAdress1,ipAdress2,ipAdress3,ipAdress4);
{
char Data[100];
int nRet = pSocket->Receive( Data, 100 );
Data[nRet] = '\0';
m_ReceiveList.AddString( Data );
}
AccessDataRecieve()调用NewSockey中的Receive()函数对所接收到的数据进行处理,并调用m_ReceiveList.AddString( )将接收到的数据显示在数据表单里。
9.int len;
10.StringBuilder sb = new StringBuilder();
11.while ((len=reader.read(chars)) != -1) {
12.sb.append(new String(chars, 0, len));
13.}
14.System.out.println("from client: " + sb);
void NewSocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
CSocket::OnReceive(nErrorCode);
m_pMyDlg->AccessDataRecieve( this );
pSocket->Send( Data, strlen(Data ));
}
此时,服务器与客户机之间已经建立了TCP/IP连接,接下来服务器或客户机就要向对方发送数据,由于建立连接时使用的是m_Socket变量,而在客户机呼叫服务器进行连接时,服务器将m_pNewSocket指针指向新建立的连接,而原服务器m_Socket变量并没有指向新的连接,而是仍然处于监听状态。因此,此时服务器新连接的NewSocket的指针为m_pNewSocket,客户机的新连接的NewSocket的指针为&m_Socket,然后pSocket->Send( Data, strlen(Data ))语句调用NewSocket内部的Send语句向对方发送指令。
m_pNewSocket = NULL;
CWnd *pWnd = GetDlgItem( IDC_Link );
pWnd->EnableWindow( FALSE );
pWnd = GetDlgItem( IDC_New );
pWnd->EnableWindow( TRUE );
}
当某一方主动发起关闭连接请求时,另外一方也会通过NewSocket的虚函数OnClose()接收到被动关闭连接的请求,然后指向CfirstDlg的m_pMyDlg的指针调用AccessClose()函数进行连接的被动关闭,然而AccessClose()中只对m_pNewSocket的指针进行了Close( )的调用,然后删除m_pNewSocket并将m_pNewSocket指向空地址,并没有对m_Socket进行操作。简而言之这里的程序默认服务器是不能主动发起关闭连接的请求的。所以对程序修改如下,使得服务器也能主动发起关闭链接的请求。
void CFirstDlg::OnNew()
{
if( m_nType==0 )
{
UpdateData( TRUE );
BOOL bRet = m_Socket.Create( m_nPortNumber );
if( !bRet )
{
MessageBox( "创建连接失败!" );
return;
}
MessageBox( "创建连接成功!" );
相关文档
最新文档