计算机网络通信设计课程设计.docx
- 文档编号:24968421
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:18
- 大小:64.27KB
计算机网络通信设计课程设计.docx
《计算机网络通信设计课程设计.docx》由会员分享,可在线阅读,更多相关《计算机网络通信设计课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
计算机网络通信设计课程设计
Windows环境下TCP/IP数据传输程序的基本运行步骤和编程方法
在编此程序时,我们首先创造了一个支持WindowsSocket功能的基类,在此基础上我们又添加了一个继承的基类为CSocket的新类,CSocket是MFC在CAsyncSocket基础上派生的一个同步阻塞Socket的封装类,内支持TCP/IP传输的OnAccept,OnReceive,Onclose等函数。
因为在进行TCP/IP通讯时,我们需要用到以上函数调用,所以添加了此子类。
voidCFirstDlg:
:
OnNew()
{
if(m_nType==0)
{
UpdateData(TRUE);
BOOLbRet=m_Socket.Create(m_nPortNumber);
if(!
bRet)
{
MessageBox("创建连接失败!
");
return;
}
MessageBox("创建连接成功!
");
m_Socket.Listen();
}
else
{
BOOLbRet=m_Socket.Create();
UpdateData(TRUE);
CStringstr;
unsignedcharipAdress1,ipAdress2,ipAdress3,ipAdress4;
m_IPAddress.GetAddress(ipAdress1,ipAdress2,ipAdress3,ipAdress4);
str.Format("%d.%d.%d.%d",ipAdress1,ipAdress2,ipAdress3,ipAdress4);
if(!
m_Socket.Connect(str,m_nPortNumber))
{
MessageBox("连接服务器失败!
");
return;
}
MessageBox("连接服务器成功!
");
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地址和端口号进行连接。
voidNewSocket:
:
OnAccept(intnErrorCode)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
CSocket:
:
OnAccept(nErrorCode);
NewSocket*pSocket=newNewSocket;
if(Accept(*pSocket))
{
m_pMyDlg->m_pNewSocket=pSocket;
pSocket->m_pMyDlg=m_pMyDlg;
}
else
deletepSocket;
}
在客户机对服务器进行呼叫连接时,若服务器已处于监听状态,收到客户机连接请求时,则产生消息调用OnAccept();OnAccept()中新定义一个NewSocket类pSocket指针用来指向新建立的连接,并将地址赋予m_pNewSocket,用于接下来的处理。
voidCFirstDlg:
:
OnSendData()
{
NewSocket*pSocket;
if(m_pNewSocket)
pSocket=m_pNewSocket;
else
pSocket=&m_Socket;
charData[100];
UpdateData(TRUE);
strcpy(Data,m_DataSend);
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语句向对方发送指令。
voidNewSocket:
:
OnReceive(intnErrorCode)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
CSocket:
:
OnReceive(nErrorCode);
m_pMyDlg->AccessDataRecieve(this);
}
在对方收到数据传输的要求后,就调用NewSocket的OnReceive函数进行数据接受,this是指始终指向对象本身的指针,在这里如果是服务器则指m_pNewSocket,如果是客户机则指&m_Socket,然后对this中的数据进行AccessDataRecieve()函数操作。
voidCFirstDlg:
:
AccessDataRecieve(NewSocket*pSocket)
{
charData[100];
intnRet=pSocket->Receive(Data,100);
Data[nRet]='\0';
m_ReceiveList.AddString(Data);
}
AccessDataRecieve()调用NewSockey中的Receive()函数对所接收到的数据进行处理,并调用m_ReceiveList.AddString()将接收到的数据显示在数据表单里。
voidCFirstDlg:
:
OnLink()
{
if(m_nType==0)
m_pNewSocket->Close();
else
m_Socket.Close();
//m_pNewSocket->Close();
CWnd*pWnd=GetDlgItem(IDC_Link);
pWnd->EnableWindow(FALSE);
pWnd=GetDlgItem(IDC_New);
pWnd->EnableWindow(TRUE);
}
完成通讯后,若服务器客户机其中一方发起关闭连接的请求,则调用OnLink()函数发起主动关闭连接的请求,首先若m_nType=0,则说明主动关闭连接的是服务器,由于服务器在整个通讯过程中使用的是m_pNewSocket指针对NewSocket中函数进行调用,所以此时依然使用的是m_pNewSocket调用close()进行关闭,同理,若为客户机则使用m_Socket进行关闭。
voidNewSocket:
:
OnClose(intnErrorCode)
{
CSocket:
:
OnClose(nErrorCode);
m_pMyDlg->AccessClose();
}
voidCFirstDlg:
:
AccessClose()
{
m_pNewSocket->Close();
deletem_pNewSocket;
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进行操作。
简而言之这里的程序默认服务器是不能主动发起关闭连接的请求的。
所以对程序修改如下,使得服务器也能主动发起关闭链接的请求。
voidCFirstDlg:
:
AccessClose()
{
if(m_nType==0)
{
m_pNewSocket->Close();
deletem_pNewSocket;
m_pNewSocket=NULL;
}
else
{
m_Socket.Close();
}
CWnd*pWnd=GetDlgItem(IDC_Link);
pWnd->EnableWindow(FALSE);
pWnd=GetDlgItem(IDC_New);
pWnd->EnableWindow(TRUE);
}
此时,服务器也能主动发起关闭链接的请求。
其他资料:
Socket与TCP/IP协议之间的关系
编程实现的Socket通讯框图
利用java实现的Socket通讯步骤
例举最简单的客户端写服务端读的例子
服务端:
1.首先定义一个ServerSocket监听在你自己设置的端口上
2.server尝试接收其他Socket的连接请求
3.跟客户端建立好连接之后,我们就可以获取socket的InputStream,并从中读取客户端发过来的信息。
客户端:
1.定义要连接的服务端IP地址
2.定义要连接的服务端对应的监听端口
3.与服务端建立连接
4.建立连接后可以向服务端写数据
程序示例:
服务器端:
1.public class Server {
2.
3. public static void main(String args[]) throws IOException {
4. int port = 8899;
5. ServerSocket server = new ServerSocket(port);
6. Socket socket = server.accept();
7. Reader reader = new InputStreamReader(socket.getInputStream());
8. char chars[] = new char[64];
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);
15. Writer writer = new OutputStreamWriter(socket.getOutputStream());
16. writer.write("Hello Client.");
17. writer.flush();
18. writer.close();
19. reader.close();
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";
4. int port = 8899;
5. Socket client = new Socket(host, port);
6. Writer writer = new OutputStreamWriter(client.getOutputStream());
7. writer.write("Hello Server.");
8. writer.flush();
9. Reader reader = new InputStreamReader(client.getInputStream());
10. char chars[] = new char[64];
11. int len;
12. StringBuffer sb = new StringBuffer();
13. while ((len=reader.read(chars)) !
= -1) {
14. sb.append(new String(chars, 0, len));
15. }
16. System.out.println("from server:
" + sb);
17. writer.close();
18. reader.close();
19. client.close();
20. }
21.}
利用linux实现的Socket通讯步骤
服务端:
1.类似的,首先定义一个套接字描述符sockfd
2.定义服务器网络地址结构体sockaddr_in
3.创建服务器端套接字--IPv4协议,面向连接通信,TCP协议
4.将套接字绑定到服务器的网络地址上
5.建立监听等待客户端连接请求到达
6.接收客户端的数据并将其发送给服务器端
客户端:
1.首先定义一个套接字描述符sockfd
2.定义服务器网络地址结构体sockaddr_in
3.创建客户端套接字--IPv4协议,面向连接通信,TCP协议
4.将套接字绑定到服务器的网络地址上
5.向服务器发起呼叫连接请求
6.循环的发送接收信息并打印接收信息
程序示例:
服务器端:
∙#include
∙#include
∙#include
∙#include
∙#include
∙#include
∙
∙int main()
∙{
∙int sfp,nfp;
∙struct sockaddr_in s_add,c_add;
∙int sin_size;
∙unsigned short portnum=0x8888;
∙
∙printf("Hello,welcome to my server !
\r\n");
∙sfp = socket(AF_INET, SOCK_STREAM, 0);
∙if(-1 == sfp)
∙{
∙ printf("socket fail !
\r\n");
∙ return -1;
∙}
∙printf("socket ok !
\r\n");
∙bzero(&s_add,sizeof(struct sockaddr_in));
∙s_add.sin_family=AF_INET;
∙s_add.sin_addr.s_addr=htonl(INADDR_ANY);
∙s_add.sin_port=htons(portnum);
∙if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
∙{
∙ printf("bind fail !
\r\n");
∙ return -1;
∙}
∙printf("bind ok !
\r\n");
∙if(-1 == listen(sfp,5))
∙{
∙ printf("listen fail !
\r\n");
∙ return -1;
∙}
∙printf("listen ok\r\n");
∙
∙while
(1)
∙{
∙sin_size = sizeof(struct sockaddr_in);
∙nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size);
∙if(-1 == nfp)
∙{
∙ printf("accept fail !
\r\n");
∙ return -1;
∙}
∙printf("accept ok!
\r\nServer start get connect from %#x :
%#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));
∙if(-1 == write(nfp,"hello,welcome to my server \r\n",32))
∙{
∙ printf("write fail!
\r\n");
∙ return -1;
∙}
∙printf("write ok!
\r\n");
∙close(nfp);
∙}
∙close(sfp);
∙return 0;
∙}
客户机端:
∙#include
∙#include
∙#include
∙#include
∙#include
∙#include
∙
∙int main()
∙{
∙int cfd;
∙int recbytes;
∙int sin_size;
∙char buffer[1024]={0};
∙struct sockaddr_in s_add,c_add;
∙unsigned short portnum=0x8888;
∙
∙printf("Hello,welcome to client !
\r\n");
∙cfd = socket(AF_INET, SOCK_STREAM, 0);
∙if(-1 == cfd)
∙{
∙ printf("socket fail !
\r\n");
∙ return -1;
∙}
∙printf("socket ok !
\r\n");
∙bzero(&s_add,sizeof(struct sockaddr_in));
∙s_add.sin_family=AF_INET;
∙s_add.sin_addr.s_addr= inet_addr("192.168.1.2");
∙s_add.sin_port=htons(portnum);
∙printf("s_addr = %#x ,port :
%#x\r\n",s_add.sin_addr.s_addr,s_add.sin_port);
∙if(-1 == connect(cfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
∙{
∙ printf("connect fail !
\r\n");
∙ return -1;
∙}
∙printf("connect ok !
\r\n");
∙if(-1 == (recbytes = read(cfd,buffer,1024)))
∙{
∙ printf("read data fail !
\r\n");
∙ return -1;
∙}
∙printf("read ok\r\nREC:
\r\n");
∙
∙buffer[recbytes]='\0';
∙printf("%s\r\n",buffer);
∙
∙getchar();
∙close(cfd);
∙return 0;
∙}
利用php实现的Socket通讯步骤
1.第一步是建立两个变量来保存Socket运行的服务器的IP地址和口
你可以配置为你自己的服务器和端口
2.调用socket_create()函数建立一个Socket
3.绑定 socket to 指定地址和端口
4.当Socket被建立好并绑定到一个端口就可以开始监听外部的连接
5.等待客户端连接请求到达
6.当一个连接被建立后,服务器就会等待客户端发送一些输入信息
程序示例:
1.// 配置一些基本的变量
2.
3.$host="192.168.1.99";
4.
5.$port=1234;
6.
7.// 配置超时时间
8.
9.set_time_limit(0);
10.
11.// 建立一个Socket
12.
13.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 通信 设计 课程设计