MFC中用socket服务端写的一个服务端和一个客户端连接正常但不能通讯

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
1 为什么网络流不建议用字节读取行 line = bufferreader.readLine() 2 起初我也为如何判断读取完成而恼火,读取文件流可以用(line = br.readLine()) != null(按字节读取用-1判断),但是在网络流里面这个怎么也读不对,后来别人告诉我在服务器发送完信息后用socket.shutdownOutput(),之后!= null可以判断了
你用它读网络流它仍然是按照它的 Buffer 大小来读入字节数的,所以读多了就会有麻烦了。
(不用mina的时候项目中就这么做。)
1 缓存中有多于一行(\r\n)的纪录,那么readLine()读取一行,buff里还剩下一些 2 缓存中有不到一行的记录,那么readLine() & (1)是阻塞,直到缓存中出现\r\n为止 ? & (2)现在缓存中有多少就认为是一行? 我觉得很可能是第2个情况,因为一个网络流很可能没有换行,那么不可能直到超时才继续执行。 我觉得可能是这样: 情况一:你只是希望你文件所有的内容都传到服务器上而已,那么一行读取是否为实际真的一行就不重要了,因为最终拼成的文件是完整的就够了。 情况二:你的客户端基于服务器段传输信息格式,比如说第一行是命令,第二行是版本号,那么你需要明确知道读多少是一行,那可能buff就有你说的问题了,总之仅仅需要传输完整的文件,无所谓读多读少问题。
阅读(3783)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'一个“Socket的长连接”问题的解决',
blogAbstract:'一:关于Socket的长连接 这个项目中,客户提出了“一次连接,10次交互”的需求,就是说创建一个Socket后,在客户端与服务端完成10次交互前(客户端请求,服务端响应算一次交互),不会被关掉。起初按照这种思路来做Socket的长连接,发现在使用阻塞IO的情况下,如果,在一次交互后不关闭Socket,那么下次客户端虽然可以正常发送请求,但是怎么也读不出服务端的响应信息,因为服务端的输入流被阻塞在上次读取后。如果,每次交互后都关掉Socket,就不符合客户的要求了。于是查资料,说是用异步输入输出流java.nio,于是将其引入项目中,结果发现,异步IO虽然为多个Socket提供了不同的通道,但是对一个Socket而言,依然存在上述问题。于是和客户沟通,客户问一技术牛人,结果得到“Socket长连接指的是服务端将消息往客户端推, 就是在一次连接下,客户端向服务端发多条消息, 服务端一次响应完毕,其间,客户端如果在一定的时间内没有消息发往服务端,服务端会主动断开连接”。 ',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:2,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}gsoap 写的WebServer服务端不能在IE上正确显示wsdl信息(帮帮忙,小弟我只有那么点分哦)_MFC编写微信PC客户端,小弟我封装了一个CWeixin类_sql server2008 存储过程解决方法__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
gsoap 写的WebServer服务端不能在IE上正确显示wsdl信息(帮帮忙,小弟我只有那么点分哦)
MFC编写微信PC客户端,小弟我封装了一个CWeixin类
sql server2008 存储过程解决方法
gsoap 写的WebServer服务端不能在IE上正确显示wsdl信息(帮帮忙,小弟我只有那么点分哦)
gsoap 写的WebServer服务端不能在IE上正确显示wsdl信息(各位大哥帮帮忙,我只有那么点分哦)语言:C/C++,
gsoap_linux_2.7.9j(最新)
功能:客户端通过调用服务端的接口,能够把一段比特流传送到服务端
问题:服务端写好后,通过我服务器ip在IE上不能正确得到wsdl信息;
   在IE上键入(程序运行的服务器实际ip)
http://192.168.18.180:9090/
   显示如下:
version= "1.0 "
encoding= "UTF-8 "
&SOAP-ENV:Envelope
xmlns:SOAP-ENV= "http://schemas.xmlsoap.org/soap/envelope/ "
xmlns:SOAP-ENC= "http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance "
xmlns:xsd= "http://www.w3.org/2001/XMLSchema "
xmlns:ns= "urn:OCWeb "&
&SOAP-ENV:Body&
&SOAP-ENV:Fault
SOAP-ENV:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/ "&
&faultcode& SOAP-ENV:Client &/faultcode&
&faultstring& HTTP
implemented &/faultstring&
&/SOAP-ENV:Fault&
&/SOAP-ENV:Body&
&/SOAP-ENV:Envelope&  
小弟实在不懂为什么会在Body部分出错,望指点,谢谢!代码如下:
OCWeb.h部分:
name: OCWeb
style: rpc
encoding: encoded
namespace: http://192.168.18.180:9090/OCWeb.wsdl
location: http://192.168.18.180:9090
namespace: urn:OCWeb
xsd__base64Binary{
ns__transferStream(struct
xsd__base64Binary
*pstBinary,
OCWebServer.c部分的代码:
"soapH.h "
"OCWeb.nsmap "
soap_init(&soap);
soap_serve(&soap); /*
application
soap_bind(&soap,
atoi(argv[1]),
soap_print_fault(&soap,
fprintf(stderr,
connection
successful:
soap_accept(&soap);
fprintf(stderr,
connection
successful:
soap_print_fault(&soap,
soap_serve(&soap);
soap_end(&soap);
ns__transferStream(struct
xsd__base64Binary
*pstBinary,
pstBinary-& __
pstBinary-& __
char[pstBinary-& __size
memcpy(data,
pstBinary-& __ptr,
pstBinary-& __size);
//把从客户端传来的数据输出
fprintf(stdout,
fprintf(stdout,
fprintf(stdout,
//输出完就释放
makefile如下:(gsoap安装目录:/usr/local/gsoap-linux-2.7)
SOAPCPP2=/usr/local/gsoap-linux-2.7/bin/soapcpp2
SOAP2H=/usr/local/gsoap-linux-2.7/stdsoap2.h
SOAP2C=/usr/local/gsoap-linux-2.7/stdsoap2.c
STDSOAP2=/usr/local/gsoap-linux-2.7/stdsoap2.cpp
COFLAGS=-O2
CWFLAGS=-Wall
CIFLAGS=-I../..
$(CWFLAGS)
$(COFLAGS)
$(CIFLAGS)
$(CMFLAGS)
server: OCWeb.h
OCWebServer.c
$(SOAPCPP2)
OCWebServer.c
soapServer.c
运行$./server
程序和gsoap自带例子calc差不多,请大哥们帮帮忙,谢谢!------解决方案--------------------mark,等高人讲解.
------解决方案--------------------应该没错,你写个客户端调用下试试!你用浏览器访问的,没有给服务端传参数调用其方法ns_transferStream,所以就显示 HTTP GET method not implemented! 冒昧的问下,你是不是参加了齐鲁软件设计大赛?
------解决方案--------------------同样问题,帮顶!
------解决方案--------------------用gSOAP写的客户端和服务器端,客户端发送的是HTTP POST请求,而你用浏览器发送给服务器的请求是HTTP GET请求。你可以参考gSOAP的用户文档看看如何在服务器端实现HTTP GET的支持
------解决方案--------------------根据gSOAP文档所说,你需要设置soap.fget回调函数。例如:
你在你的main函数中的soap_init(&soap);的下面加入:
soap.fget = http_
然后写一个函数int http_get(strcut soap *soap)
soap_response(soap, SOAP_HTML);
soap_send(soap,
" &HTML& My Web sevice is operational &/HTML&
soap_end_send(soap);
return SOAP_OK;
当然了别忘了在main函数前面声明一下此函数:int http_get(strcut soap *soap);
运行/server 9090
在浏览器中输入http://你的主机地址:9090
应该在浏览器上显示:My Web sevice is operational
MFC编写微信PC客户端,小弟我封装了一个CWeixin类
【分享】MFC编写微信PC客户端,我封装了一个CWeixin类请看我的博客,有源码和demo的下载地址:http://blog.csdn.net/joneeky/article/details/8633681
CWeixin类非常容易使用,试试吧~
#define WM_WX_SCANOK (WM_USER + 101) /*扫描成功*/
#define WM_WX_LOGINOK (WM_USER + 102) /*登录成功*/
#define WM_WX_HASMSG (WM_USER + 103) /*收到消息*/
typedef struct tagWXMSG
CString strN
CString strM
class CWeixin
CWeixin();
CWeixin(CWeixin& wxin);
~CWeixin();
void Attach(HWND hWnd);
//设置关联窗口
HGLOBAL GetQRCode();
//得到登录二维码(内存)
BOOL GetQRCode(LPCTSTR lpszPath);
//得到登录二维码(文件)
void GotoScan();
//准备扫描
BOOL QueryContacts();
//请求联系人列表
int GetContanctsCount();
//得到联系人数量
CString GetContanctAt(int nIndex);
//得到指定联系人
BOOL SendMsg(LPCTSTR lpszContact, LPCTSTR lpszMsg);
//发送文本
BOOL SendImg(LPCTSTR lpszContact, LPCTSTR lpszFilePath); //发送图片
static UINT CheckScanProc(LPVOID pParam);
//检测二维码被扫描
static UINT CheckOKProc(LPVOID pParam);
//检测确认登录
static UINT SyncProc(LPVOID pParam);
//保持在线状态(暂时未用到)
static UINT CheckMsgProc(LPVOID pParam);
//检测是否有消息
void UTF8ToGBK(CString& strTarget);
//UTF8 转 GBK
void GBKToUTF8(CString& strTarget);
//GBK 转 UTF8
void GetSelfInfo();
//得到自己的信息
UINT PeekMsg(WXMSG& wxMsg);
//取出消息
CInternetSession *m_pS
CString m_strCode, m_strSid, m_strS
CStringArray m_saC
CString m_strMyUin, m_strMyUserN
CString m_strVal1, m_strVal2, m_strVal3;
------解决方案--------------------顶~~~~~------解决方案--------------------这个真能和手机微信发信息么?------解决方案--------------------------解决方案--------------------真贵啊!!!!!!!------解决方案--------------------Markup------解决方案--------------------你这个怎么登陆?------解决方案--------------------怎么使用啊?不能用?------解决方案--------------------不知道能不能用这个和手机发信息啊,期待中啊!------解决方案--------------------我看了你用的获取的网页版的信息。------解决方案--------------------你下载分有点高....------解决方案--------------------
引用:怎么使用啊?不能用?
可以用。加载二维码,然后用手机端的微信扫描二维码,就登录了。
试了一下,可以发了------解决方案--------------------能把好友列表获取出来吗?------解决方案--------------------引用:
引用:能把好友列表获取出来吗?
可以的,我打算下次升级一下做出这个功能。
期待------解决方案--------------------好东西必须顶起,学习
sql server2008 存储过程解决方法
sql server2008 存储过程ta
以上是两张表、、如何写一个存储过程
将tb中的数据更新为ta的数据
急急急急急急急急。。。。。。。。。。。。。------解决方案--------------------你有什么条件吗?没有条件用一条sql语句就可以了update b
set a=a.a,b=a.b,c=a.c
inner join ta a on a.id=b.id
------解决方案--------------------delete from b
insert into b
select * from a------解决方案--------------------create proc change
update ta set ta.a =tb.a,
ta.b=tb.b,
where ta.id=tb.id and tb.id in(select id from ta)
你试试------解决方案--------------------
--如果批量更新数据,推荐使用MERGE,无论是INSERT还是UPDATE,从执行之间上看,MERGE INTO(MERGE)都要比直接INSERT/UPDATE的效率高;
create table ta(id int,a int,b int,c int)
create table tb(id int,a int,b int,c int)
insert into ta values (1,11,12,13)
insert into ta values (2,21,22,23)
insert into ta values (3,31,32,33)
insert into ta values (4,41,42,43)
insert into ta values (5,51,52,53)
insert into tb values (1,111,12,13)
insert into tb values (2,21,222,23)
insert into tb values (3,31,32,333)
insert into tb values (4,41,42,43)
insert into tb values (5,555,52,53)
--insert into tb values (6,61,666,63)
select * from ta
--ta 目标表
select * from tb
--如果需要存储过程,将以下代码封装到存储过程即可。
-- CREATE PROCEDURE SP_TABLE_DATE_MERGE
merge ta using tb
on(ta.id=tb.id)
when matched then update set ta.a=tb.a , ta.b=tb.b , ta.c=tb.c
-- 匹配的时候,更新
when not matched then INSERT VALUES(tb.id,tb.a,tb.b,tb.c)
-- 源表有,目标表没有,插入
WHEN not matched BY SOURCE THEN DELETE;
-- 目标表有,源表没有,目标表该数据删除(会删除目标表数据,慎用!)
--exec SP_TABLE_DATE_MERGE
--以上例子 在 SQL Server 2008 Express 下测试通过,希望对你有帮助。
------解决方案--------------------
--如果批量更新数据,推荐使用MERGE,无论是INSERT还是UPDATE,从执行之间上看,MERGE INTO(MERGE)都要比直接INSERT/UPDATE的效率高;
create table ta(id int,a int,b int,c int)
create table tb(id int,a int,b int,c int)
insert into ta values (1,11,12,13)
insert into ta values (2,21,22,23)
insert into ta values (3,31,32,33)
insert into ta values (4,41,42,43)
insert into ta values (5,51,52,53)
insert into tb values (1,111,12,13)
insert into tb values (2,21,222,23)
insert into tb values (3,31,32,333)
insert into tb values (4,41,42,43)
insert into tb values (5,555,52,53)
--insert into tb values (6,61,666,63)
select * from ta
--ta 目标表
select * from tb
--如果需要存储过程,将以下代码封装到存储过程即可。
-- CREATE PROCEDURE SP_TABLE_DATE_MERGE
merge ta using tb
on(ta.id=tb.id)
when matched then update set ta.a=tb.a , ta.b=tb.b , ta.c=tb.c
-- 匹配的时候,更新
when not matched then INSERT VALUES(tb.id,tb.a,tb.b,tb.c)
-- 源表有,目标表没有,插入
WHEN not matched BY SOURCE THEN DELETE;
-- 目标表有,源表没有,目标表该数据删除(会删除目标表数据,慎用!)
--exec SP_TABLE_DATE_MERGE
--以上例子 在 SQL Server 2008 Express 下测试通过,希望对你有帮助。
如果是将tb中的数据更新为ta的数据,请将上面列子的目标表和源表调换, 既
merge tb using ta
on(tb.id=ta.id)
when matched then update set tb.a=ta.a , tb.b=ta.b , tb.c=ta.c
-- 匹配的时候,更新
when not matched then INSERT VALUES(ta.id,ta.a,ta.b,ta.c)
-- 源表有,目标表没有,插入
WHEN not matched BY SOURCE THEN DELETE;
------解决方案--------------------
create proc [存储过程名]
set y.a=x.a,
inner join ta x on y.id=x.id
如果您喜欢IT行业或者对IT行业感兴趣,想开拓技术视野,欢迎加入本站官方QQ群:,在群里认识新朋友和交流技术^_^
本站联系邮箱:一个服务器对多个客户端的MFC Socket编程示例 - 下载频道
- CSDN.NET
&&&&一个服务器对多个客户端的MFC Socket编程示例
一个服务器对多个客户端的MFC Socket编程示例
环境:Windows XP SP3、 VC++ 6.0、 Windows 2003 SDK
使用步骤:
1、下载解压之后,使用VC++ 6.0打开两个工程:一个是SocketServer和一个ClientSocket工程。
2、首先运行服务器端工程,选默认的端口1008
3、然后运行客户端工程,选默认的端口1008和默认的服务器地址
4、再运行多个客户端进程
5、如果一切正常,可以每个客户端的消息发送,我们可以在服务端和各个客户端同步看到消息
实现一个服务器对多个客户端的关键是,在服务端的使用集合CPtrList类用保存客户端的socket对象,思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存客户端的socket对象,而MFC框架提供了CSocket类,它是一个异步通信的类,所以看上去代码比较Java的多线程代码简单的实现了一个对多的即时通讯功能。另外,MFC提供了CSocketFile类和CArchive类与CSocket类实现了C++的网络通讯编程功能。
本示例注释非常详细,所有的辅助类都放一个util目录中,然后在工程中分了一个目录来管理这些辅助类,使用代码非常清晰。手动书写部分的代码是按Java的规范书写,当然其它代码由IDE生成的,所以是MS的风格,所以当你看代码时,只要是使用“骆驮命名法”的方法都是本人书写的功能性代码。
参看的思路:在服务端要从回调方法onAccept读起;而客户端代码主要从OnSendButton方法读起,即可理解整个代码的意思。
阅读对象:具有Java的Socket编程经验的人员,并且希望能够书写出比Java效率更高的即时通讯程序的人员
若举报审核通过,可奖励20下载分
被举报人:
xiaoxia711
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
开发技术下载排行

我要回帖

更多关于 c socket 服务端 的文章

 

随机推荐