实现迭代服务器端和客户端

原创 2016年06月02日 07:52:17
前面的程序,不管服务器端还是客户端,都有一个问题,就是处理完一个请求立即退出了,没有太大的实际意义。能不能像Web服务器那样一直接受客户端的请求呢?能,使用 while 循环即可。

修改前面的回声程序,使服务器端可以不断响应客户端的请求。

服务器端 server.cpp:
  1. #include <stdio.h>
  2. #include <winsock2.h>
  3. #pragma comment (lib, "ws2_32.lib") //加载 ws2_32.dll
  4. #define BUF_SIZE 100
  5. int main(){
  6. WSADATA wsaData;
  7. WSAStartup( MAKEWORD(2, 2), &wsaData);
  8. //创建套接字
  9. SOCKET servSock = socket(AF_INET, SOCK_STREAM, 0);
  10. //绑定套接字
  11. sockaddr_in sockAddr;
  12. memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充
  13. sockAddr.sin_family = PF_INET; //使用IPv4地址
  14. sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具体的IP地址
  15. sockAddr.sin_port = htons(1234); //端口
  16. bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
  17. //进入监听状态
  18. listen(servSock, 20);
  19. //接收客户端请求
  20. SOCKADDR clntAddr;
  21. int nSize = sizeof(SOCKADDR);
  22. char buffer[BUF_SIZE] = {0}; //缓冲区
  23. while(1){
  24. SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);
  25. int strLen = recv(clntSock, buffer, BUF_SIZE, 0); //接收客户端发来的数据
  26. send(clntSock, buffer, strLen, 0); //将数据原样返回
  27. closesocket(clntSock); //关闭套接字
  28. memset(buffer, 0, BUF_SIZE); //重置缓冲区
  29. }
  30. //关闭套接字
  31. closesocket(servSock);
  32. //终止 DLL 的使用
  33. WSACleanup();
  34. return 0;
  35. }

客户端 client.cpp:
  1. #include <stdio.h>
  2. #include <WinSock2.h>
  3. #include <windows.h>
  4. #pragma comment(lib, "ws2_32.lib") //加载 ws2_32.dll
  5. #define BUF_SIZE 100
  6. int main(){
  7. //初始化DLL
  8. WSADATA wsaData;
  9. WSAStartup(MAKEWORD(2, 2), &wsaData);
  10. //向服务器发起请求
  11. sockaddr_in sockAddr;
  12. memset(&sockAddr, 0, sizeof(sockAddr)); //每个字节都用0填充
  13. sockAddr.sin_family = PF_INET;
  14. sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  15. sockAddr.sin_port = htons(1234);
  16. char bufSend[BUF_SIZE] = {0};
  17. char bufRecv[BUF_SIZE] = {0};
  18. while(1){
  19. //创建套接字
  20. SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  21. connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
  22. //获取用户输入的字符串并发送给服务器
  23. printf("Input a string: ");
  24. gets(bufSend);
  25. send(sock, bufSend, strlen(bufSend), 0);
  26. //接收服务器传回的数据
  27. recv(sock, bufRecv, BUF_SIZE, 0);
  28. //输出接收到的数据
  29. printf("Message form server: %s\n", bufRecv);
  30. memset(bufSend, 0, BUF_SIZE); //重置缓冲区
  31. memset(bufRecv, 0, BUF_SIZE); //重置缓冲区
  32. closesocket(sock); //关闭套接字
  33. }
  34. WSACleanup(); //终止使用 DLL
  35. return 0;
  36. }
先运行服务器端,再运行客户端,结果如下:
Input a string: c language
Message form server: c language
Input a string: C语言中文网
Message form server: C语言中文网
Input a string: 学习C/C++编程的好网站
Message form server: 学习C/C++编程的好网站

while(1) 让代码进入死循环,除非用户关闭程序,否则服务器端会一直监听客户端的请求。客户端也是一样,会不断向服务器发起连接。

需要注意的是:server.cpp 中调用 closesocket() 不仅会关闭服务器端的 socket,还会通知客户端连接已断开,客户端也会清理 socket 相关资源,所以 client.cpp 中需要将 socket() 放在 while 循环内部,因为每次请求完毕都会清理 socket,下次发起请求时需要重新创建。后续我们会进行详细讲解。
版权声明:本文为芝麻软件工作室原创文章,未经芝麻软件工作室允许不得转载。

实现迭代服务器端和客户端

前面的程序,不管服务器端还是客户端,都有一个问题,就是处理完一个请求立即退出了,没有太大的实际意义。能不能像Web服务器那样一直接受客户端的请求呢?能,使用 while 循环即可。 修改前面的回...
  • softn
  • softn
  • 2016年06月02日 07:50
  • 454

4.3 实现迭代服务器端/客户端

标题写的是“实现迭代服务器端/客户端”,实际上就是实现了一个有echo功能的,单用户服务的(单进程/线程)服务器端,再配上一个客户端。服务器端的说明该服务器端是仅面向单用户的,处理有限次用户任务的。服...
  • zzzbkl
  • zzzbkl
  • 2018年02月08日 21:40
  • 12

10、实现迭代服务器端和客户端

前面的程序,不管服务器端还是客户端,都有一个问题,就是处理完一个请求立即退出了,没有太大的实际意义。能不能像Web服务器那样一直接受客户端的请求呢?能,使用 while 循环即可。 修改前面的回...
  • Const_Gong
  • Const_Gong
  • 2017年05月21日 13:56
  • 163

java 客户端和服务器端相互通信(都是从控制台输入)

一、客户端的程序(没用线程,本来想建的,但又觉得麻烦,我是个懒人) package day133; import java.io.*; import java.net.Socket; ...
  • haikuotiankong1997
  • haikuotiankong1997
  • 2012年04月25日 20:15
  • 4671

java-基本的Socket编程-实现服务器端和客户端通信

基本的Socket编程: 本实例介绍Socket编程的基本步骤。启动Socket服务后,再打开Socket刻画段,在输入框中输入消息,然后发送给服务器端,服务器端将收到的消息返回到客户端。关键技术:...
  • zlz18225318697
  • zlz18225318697
  • 2016年10月12日 17:48
  • 2826

Java中利用socket实现简单的服务端与客户端的通信(入门级)

Java编程中,要想要使用网络通信,就离不开Socket编程,在此对socket进行简单的介绍。首先声明,这是一个入门级的介绍,仅仅简单的实现了客户端向服务端发送数据,服务端正常的接收数据,当接收到特...
  • qq_25352981
  • qq_25352981
  • 2015年11月19日 18:15
  • 4358

socket编程(一),实现服务器与客户端简单通信

本节主讲客户端向服务发送信息,服务器转发给客户端,当然也可以稍微改一下代码可以实现互传消息,不再赘述。 难点在于服务器端的代码思路: (1)主程序Socket socket=server.acce...
  • c______________
  • c______________
  • 2017年08月16日 08:46
  • 272

java中,客户端与服务器端跳转的几种方式

客户端跳转时用HttPservletResopse对象的sendRedirect函数实现,服务器端跳转是使用RequestDispather对象的forward方法实现的。这两者之间的区别主要体现在三...
  • asdfzjs
  • asdfzjs
  • 2013年09月16日 20:45
  • 1776

java网络编程实现客户端连接服务器端,并发送消息例子(1)。(阻塞式的方法)

昨天晚上学了网络线程,并写了一个,客户端连接服务器的简单例子,有点QQ的感觉,但是实际上还差远,差不多就是很久之前那种“长江长江我是黄河”的通话形式。 代码如下: 服务器端代码:import ja...
  • u012036171
  • u012036171
  • 2015年06月27日 11:06
  • 1725

Web应用程序中的脚本—客户端和服务器端

动态网页开发技术按照执行的位置不同,分为客户端和服务器端,如下图:     l  那么什么是客户端脚本,什么又是服务器端脚本?       ²  客户端脚本       客户端脚本:无论在牛腩...
  • u010955843
  • u010955843
  • 2014年12月14日 21:17
  • 1349
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现迭代服务器端和客户端
举报原因:
原因补充:

(最多只允许输入30个字)