实验目的:通过套接字收发数据,基于网络协议的套接字一般分为TCP套接字和UDP套接字。本次实验采用TCP(即stream)套接字。
操作系统:windows

运行平台:VS2010

迭代服务器端代码:

IM_server:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib,"WS2_32.lib")#define BUF_SIZE 1024
void ErrorHandling(char *message);int main(int argc, char *argv[])
{WSADATA wsaData;SOCKET hServSock, hClntSock;char message[BUF_SIZE];int strLen, i;SOCKADDR_IN servAdr, clntAdr;int clntAdrSize;if(argc!=2) {printf("Usage : %s <port>\n", argv[0]);exit(1);}if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0)ErrorHandling("WSAStartup() error!"); hServSock=socket(PF_INET, SOCK_STREAM, 0);   if(hServSock==INVALID_SOCKET)ErrorHandling("socket() error");memset(&servAdr, 0, sizeof(servAdr));servAdr.sin_family=AF_INET;servAdr.sin_addr.s_addr=htonl(INADDR_ANY);servAdr.sin_port=htons(atoi(argv[1]));if(bind(hServSock, (SOCKADDR*)&servAdr, sizeof(servAdr))==SOCKET_ERROR)ErrorHandling("bind() error");if(listen(hServSock, 5)==SOCKET_ERROR)ErrorHandling("listen() error");clntAdrSize=sizeof(clntAdr);for(i=0; i<5; i++){hClntSock=accept(hServSock, (SOCKADDR*)&clntAdr, &clntAdrSize);if(hClntSock==-1)ErrorHandling("accept() error");elseprintf("Connected client %d \n", i+1);while((strLen=recv(hClntSock, message, BUF_SIZE, 0))!=0){message[strLen]=0;printf("Message from Connected client %d: %s",i+1, message);fputs("Input message(Q to quit): ", stdout);fgets(message, BUF_SIZE, stdin);send(hClntSock, message, strlen(message), 0);}closesocket(hClntSock);}closesocket(hServSock);WSACleanup();return 0;
}void ErrorHandling(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}

迭代客户端:

IM_client:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib,"WS2_32.lib")#define BUF_SIZE 1024
void ErrorHandling(char *message);int main(int argc, char *argv[])
{WSADATA wsaData;SOCKET hSocket;char message[BUF_SIZE];int strLen;SOCKADDR_IN servAdr;if(argc!=3) {printf("Usage : %s <IP> <port>\n", argv[0]);exit(1);}if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0)ErrorHandling("WSAStartup() error!"); hSocket=socket(PF_INET, SOCK_STREAM, 0);   if(hSocket==INVALID_SOCKET)ErrorHandling("socket() error");memset(&servAdr, 0, sizeof(servAdr));servAdr.sin_family=AF_INET;servAdr.sin_addr.s_addr=inet_addr(argv[1]);servAdr.sin_port=htons(atoi(argv[2]));if(connect(hSocket, (SOCKADDR*)&servAdr, sizeof(servAdr))==SOCKET_ERROR)ErrorHandling("connect() error!");elseputs("Connected...........");while(1) //回声服务 发—收—发—收—.....{fputs("Input message(Q to quit): ", stdout);fgets(message, BUF_SIZE, stdin);if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))break;send(hSocket, message, strlen(message), 0);strLen=recv(hSocket, message, BUF_SIZE-1, 0);message[strLen]=0;if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))break;printf("Message from server: %s", message);}closesocket(hSocket);WSACleanup();return 0;
}void ErrorHandling(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}

运行结果:

服务器端:


客户端:

后记:这只是从编程角度的学习,还没有讨论tcp的工作原理。回声客户端是有问题的。

     send(hSocket, message, strlen(message), 0);strLen=recv(hSocket, message, BUF_SIZE-1, 0);message[strLen]=0;if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))break;printf("Message from server: %s", message);

上述代码有个错误的假设:每次调用send,recv函数都会以字符串为单位执行实际的I/O操作。客户端与服务器端军希望通过调用一次send函数传输整个字符串,但是如果数据太大,操作系统就有可能把数据分成多个数据包发送到客户端,则及有可呢个出现在尚未收到全部数据包时就调用了read()。本次实验运转正常,仅仅是运气好!只是因为收发的数据太小,而且运行环境为同一台计算机或相邻的两台计算机,所以没有发生错误,可实际上仍然有发生错误的可能。

那么该如何收发数据呢?

这就需要我们去定义应用层的协议........

简单迭代服务器端/客户端:模仿飞Q聊天功能,实现IM通信相关推荐

  1. 写了个Android聊天客户端框架,基本聊天功能、数据库、服务器都有。大家可以看一看。已经开源

    写了个Android聊天客户端框架,基本聊天功能.数据库.服务器都有.大家可以看一看.已经开源(希望两个手机通信的话,改一下pushid就可以) 几点说明: 1:包含的基本功能.: 1.1比如gif动 ...

  2. Android Studio在类微信程序完成“蓝牙聊天功能”实现蓝牙通信

    Android Studio在类微信程序完成"蓝牙聊天功能"实现蓝牙通信 项目运行截图 通信原理 蓝牙权限 strings.xml tab01.xml 菜单文件option_men ...

  3. java实现简易聊天窗口先运行服务器还是客户端_一个简易聊天功能的服务器端和客户端源码...

    学习完J2SE可以写一个简易的聊天软件来让刚学的知识融会贯通,代码注释的很详细哦! 开发版本历程: V0.1:客户端实现一个界面 V0.2:客户端界面有输入框和显示框的界面 V0.3:客户端关闭按钮可 ...

  4. Android模仿微信语音聊天功能

    项目效果如下: 项目目录结构如下: 代码如下: AudioManager.java package com.xuliugen.weichat;import java.io.File; import j ...

  5. 模仿微信语音聊天功能(4) 音频播放实现以及项目结束

    在上一篇中,我们实现了核心的录音功能.当然,此时你是没有感觉的,因为我们还没法把它播放出来,所以你还不知道到底有没有录音实现.没读过上一篇的朋友,请点击一下链接: http://www.cnblogs ...

  6. 使用Qt5.9实现qq聊天功能(TCP通信)

    利用Tcp协议在Qt里面实现通信,注意:客户端和服务端的网段必须在同一个网段才可以,要不然连接不上.并且改代码能够解决中文乱码问题.字符串.中文都可以发送. 服务器端代码: 首先在.pro文件加入: ...

  7. 四 基于TCP的服务器端/客户端

    ** 第四章 基于TCP的服务器端/客户端(1) ** 主要内容: 这里我们讨论通过套接字收发数据 1.TCP与UDP的区别数据传输方式不同 2.协议栈的层次关系:链路层->IP层->tc ...

  8. 在线服务器和客户端聊天,实验三、客户端和服务器能实现简单的聊天功能

    <实验三.客户端和服务器能实现简单的聊天功能>由会员分享,可在线阅读,更多相关<实验三.客户端和服务器能实现简单的聊天功能(6页珍藏版)>请在人人文库网上搜索. 1.实验三.客 ...

  9. Artical--2--TCP_IP服务器端/客户端迭代一

    Artical–2--TCP_IP服务器端/客户端迭代一 迭代一:服务器端简单将接收到客户端的message,发回给客户端: echo_server.c #include <stdio.h> ...

最新文章

  1. (转)linux基本变量学习:位置变量$0 、$1 shift轮替、本地变量、环境变量、特殊变量...
  2. optee中MMU内存管理模型-页表的建立模型
  3. termux怎么安装python库_Python termux-apt-repo包_程序模块 - PyPI - Python中文网
  4. 【论文学习】ICLR2021,鲁棒早期学习法:抑制记忆噪声标签ROBUST EARLY-LEARNING: HINDERING THE MEMORIZATION OF NOISY LABELS
  5. android ida多线程调试,C/C++知识点之ida动态调试.so 动态加载(必须真机)
  6. 命令提示符中的几个重要的命令
  7. Win10 Linux GPT分区方案,win10+Ubuntu 20.04 LTS双系统安装(UEFI + GPT)(图文,多图预警)
  8. 第一次做项目经理总结_工程总承包项目:项目经理如果是第一次做,一定要把握这4个要点...
  9. 考上MBA,为自己装一双翅膀
  10. 4符号代码_ELF文件格式解析器 原理 + 代码
  11. Oracle开发:常用的数据库字段类型[转]
  12. Luogu2602[ZJOI2010] 数字计数
  13. 向iframe载入html,为iFrame添加动态载入效果,提高用户体验
  14. Google Code注册方法详解 Google Code网盘申请方法
  15. favicon.ico显示,favicon显示,favicon图标显示
  16. Backtrader简单均线交易策略“金叉和死叉”
  17. 清华大学出版社2013年第二期书评征集图书列表
  18. python使用OpenCV批量裁剪图片
  19. fedora35下配置grub2主题
  20. java实现树形菜单

热门文章

  1. 动态头像 Android 实现,Android开发中实现一个头像滑动变大变小功能
  2. iOS 相机拍照、相册获取照片(仿微信) 一一 拍照、图片裁剪
  3. Ubuntu 20.04设置开机自启动
  4. 奥塔在线:CentOS下查看crontab定时任务输出日志
  5. 完美解决“The identity used to sign the executable is no longer valid.”问题
  6. c语言xml库调用方法,c语言如何调用xml的接口函数?
  7. Linux系统软件安装 Jdk MySQL Tomcat
  8. 光大“乌龙指”24小时
  9. 0160 十分钟看懂时序数据库(I)-存储
  10. 发表SCI有什么好处?如何发表一篇SCI论文?