简单迭代服务器端/客户端:模仿飞Q聊天功能,实现IM通信
实验目的:通过套接字收发数据,基于网络协议的套接字一般分为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通信相关推荐
- 写了个Android聊天客户端框架,基本聊天功能、数据库、服务器都有。大家可以看一看。已经开源
写了个Android聊天客户端框架,基本聊天功能.数据库.服务器都有.大家可以看一看.已经开源(希望两个手机通信的话,改一下pushid就可以) 几点说明: 1:包含的基本功能.: 1.1比如gif动 ...
- Android Studio在类微信程序完成“蓝牙聊天功能”实现蓝牙通信
Android Studio在类微信程序完成"蓝牙聊天功能"实现蓝牙通信 项目运行截图 通信原理 蓝牙权限 strings.xml tab01.xml 菜单文件option_men ...
- java实现简易聊天窗口先运行服务器还是客户端_一个简易聊天功能的服务器端和客户端源码...
学习完J2SE可以写一个简易的聊天软件来让刚学的知识融会贯通,代码注释的很详细哦! 开发版本历程: V0.1:客户端实现一个界面 V0.2:客户端界面有输入框和显示框的界面 V0.3:客户端关闭按钮可 ...
- Android模仿微信语音聊天功能
项目效果如下: 项目目录结构如下: 代码如下: AudioManager.java package com.xuliugen.weichat;import java.io.File; import j ...
- 模仿微信语音聊天功能(4) 音频播放实现以及项目结束
在上一篇中,我们实现了核心的录音功能.当然,此时你是没有感觉的,因为我们还没法把它播放出来,所以你还不知道到底有没有录音实现.没读过上一篇的朋友,请点击一下链接: http://www.cnblogs ...
- 使用Qt5.9实现qq聊天功能(TCP通信)
利用Tcp协议在Qt里面实现通信,注意:客户端和服务端的网段必须在同一个网段才可以,要不然连接不上.并且改代码能够解决中文乱码问题.字符串.中文都可以发送. 服务器端代码: 首先在.pro文件加入: ...
- 四 基于TCP的服务器端/客户端
** 第四章 基于TCP的服务器端/客户端(1) ** 主要内容: 这里我们讨论通过套接字收发数据 1.TCP与UDP的区别数据传输方式不同 2.协议栈的层次关系:链路层->IP层->tc ...
- 在线服务器和客户端聊天,实验三、客户端和服务器能实现简单的聊天功能
<实验三.客户端和服务器能实现简单的聊天功能>由会员分享,可在线阅读,更多相关<实验三.客户端和服务器能实现简单的聊天功能(6页珍藏版)>请在人人文库网上搜索. 1.实验三.客 ...
- Artical--2--TCP_IP服务器端/客户端迭代一
Artical–2--TCP_IP服务器端/客户端迭代一 迭代一:服务器端简单将接收到客户端的message,发回给客户端: echo_server.c #include <stdio.h> ...
最新文章
- (转)linux基本变量学习:位置变量$0 、$1 shift轮替、本地变量、环境变量、特殊变量...
- optee中MMU内存管理模型-页表的建立模型
- termux怎么安装python库_Python termux-apt-repo包_程序模块 - PyPI - Python中文网
- 【论文学习】ICLR2021,鲁棒早期学习法:抑制记忆噪声标签ROBUST EARLY-LEARNING: HINDERING THE MEMORIZATION OF NOISY LABELS
- android ida多线程调试,C/C++知识点之ida动态调试.so 动态加载(必须真机)
- 命令提示符中的几个重要的命令
- Win10 Linux GPT分区方案,win10+Ubuntu 20.04 LTS双系统安装(UEFI + GPT)(图文,多图预警)
- 第一次做项目经理总结_工程总承包项目:项目经理如果是第一次做,一定要把握这4个要点...
- 考上MBA,为自己装一双翅膀
- 4符号代码_ELF文件格式解析器 原理 + 代码
- Oracle开发:常用的数据库字段类型[转]
- Luogu2602[ZJOI2010] 数字计数
- 向iframe载入html,为iFrame添加动态载入效果,提高用户体验
- Google Code注册方法详解 Google Code网盘申请方法
- favicon.ico显示,favicon显示,favicon图标显示
- Backtrader简单均线交易策略“金叉和死叉”
- 清华大学出版社2013年第二期书评征集图书列表
- python使用OpenCV批量裁剪图片
- fedora35下配置grub2主题
- java实现树形菜单
热门文章
- 动态头像 Android 实现,Android开发中实现一个头像滑动变大变小功能
- iOS 相机拍照、相册获取照片(仿微信) 一一 拍照、图片裁剪
- Ubuntu 20.04设置开机自启动
- 奥塔在线:CentOS下查看crontab定时任务输出日志
- 完美解决“The identity used to sign the executable is no longer valid.”问题
- c语言xml库调用方法,c语言如何调用xml的接口函数?
- Linux系统软件安装 Jdk MySQL Tomcat
- 光大“乌龙指”24小时
- 0160 十分钟看懂时序数据库(I)-存储
- 发表SCI有什么好处?如何发表一篇SCI论文?