社区
网络编程
帖子详情
一个服务器开两个客户端怎样实现?
Balana_yan
2012-02-23 05:20:28
我之前做的是一对一的客户端与服务器通信,但是现在需要两个客户端。
我之前的通信之间的套接字是这样实现的:服务器端创建套接字,bind,listen,开启一个Accept线程,当有客户请求连接时开启收数线程。这些我都封装好了成为一个库。
我想问下我要再加入一个客户端怎样加?
还有,当两个客户端都连接上之后,我在服务器端开两个线程接收数据(想要的效果是分别是接收两个客户端的数据),若两个客户端都在发送数据,那么服务器端两个线程要怎样做才能正确的接收呢?
...全文
788
25
打赏
收藏
一个服务器开两个客户端怎样实现?
我之前做的是一对一的客户端与服务器通信,但是现在需要两个客户端。 我之前的通信之间的套接字是这样实现的:服务器端创建套接字,bind,listen,开启一个Accept线程,当有客户请求连接时开启收数线程。这些我都封装好了成为一个库。 我想问下我要再加入一个客户端怎样加? 还有,当两个客户端都连接上之后,我在服务器端开两个线程接收数据(想要的效果是分别是接收两个客户端的数据),若两个客户端都在发送数据,那么服务器端两个线程要怎样做才能正确的接收呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Balana_yan
2012-03-16
打赏
举报
回复
[Quote=引用 24 楼 noback7 的回复:]
对于测试服务器并发性能,这里有一篇文章,这个是别人的功劳,我转载并使用过了,没有错误
http://blog.csdn.net/noback7/article/details/7258620
[/Quote]
谢谢。但是这个是Linux上的用法。
柒号华仔
2012-03-15
打赏
举报
回复
对于测试服务器并发性能,这里有一篇文章,这个是别人的功劳,我转载并使用过了,没有错误
http://blog.csdn.net/noback7/article/details/7258620
柒号华仔
2012-03-15
打赏
举报
回复
两个客户端创建两个线程,accept一次生成一个sockfd,这个sockfd就只属于这一个客户端,后面该客户端的通信都使用这个sockfd.如果有更多的客户端,就采用线程池的做法更方便
cppbegginer
2012-03-01
打赏
举报
回复
两个连接需要两个socket变量
[Quote=引用 14 楼 balana_yan 的回复:]
还有,我这样做了之后不能同时连接:当我连接第一个客户端并发数成功后,没有断开客户端。然后连接第二个也成功,也能发数。但是当我回去用之前的那个客户端发数时,就不能发数了。有的时候必须重新连接才能发数,有的时候是重新连就连不上了。请各位帮帮忙想一下,我实在是不知道这个怎么弄~·
[/Quote]
cppbegginer
2012-03-01
打赏
举报
回复
每开一次都是新的线程
[Quote=引用 12 楼 balana_yan 的回复:]
引用 11 楼 cppbegginer 的回复:
开线程的代码是同一个,但是运行的是不同的线程,传不同的参数进去跑是没什么问题的。
你的意思是虽然开的线程代码是一样的,但是当每开一次,这个线程处理的是不同的内容,对吗?
[/Quote]
qq24447678
2012-03-01
打赏
举报
回复
fd_set fdSocket; //所有的可用套接字集合
FD_ZERO(&fdSocket);
FD_SET(pdlg->m_socket.m_sockSrv,&fdSocket);
char buf[1024] = {0};
int nLength = 0;
while(TRUE)
{
fd_set fdRead = fdSocket;
int nRet = ::select(0, &fdRead, NULL, NULL, NULL);
if (nRet)
{
for (int i = 0; i < (int)fdSocket.fd_count; i++)
{
if (FD_ISSET(fdSocket.fd_array[i], &fdRead))
{
if (fdSocket.fd_array[i] == pdlg->m_socket.m_sockSrv)
{
if (fdSocket.fd_count < FD_SETSIZE)
{
sockaddr_in addrRemote;
int nAddrLen = sizeof(addrRemote);
SOCKET sNew = ::accept(pdlg->m_socket.m_sockSrv, (SOCKADDR*)&addrRemote, &nAddrLen);
FD_SET(sNew, &fdSocket);
TRACE("接收到连接(%s)\n",::inet_ntoa(addrRemote.sin_addr));
}
else
{
TRACE("连接数太多!");
continue;
}
}
else
{
char* flag= new char[sizeof(int)];
nLength =::recv(fdSocket.fd_array[i],flag,sizeof(int),MSG_PEEK);//接收示警信息
if ( nLength > 0)
{ }
}
这是一段代码,你可参考一下
Balana_yan
2012-03-01
打赏
举报
回复
每一个工作完的线程结束时就关掉它使用的SOCKET。
你的机器能支持的数量就是你在现有资源下这个做法的并发数,这个并……
[/Quote]
有没有例子给一个呢?
gameslq
2012-03-01
打赏
举报
回复
建议先看看windows下通信的几种模型,问的问题都可以找到答案
然后再选定合适的模型来开发
yanyuchonglou
2012-03-01
打赏
举报
回复
[Quote=引用 18 楼 balana_yan 的回复:]
貌似这样不行啊,我试过了。这个理论上有点不通。
2个就需要两个socket的话,那1000个就要1000个socket?
还有无线循环是在accept处一直等待新的请求到来的,你要退出重新建立连接,很危险吧~~?
[/Quote]
每一个工作完的线程结束时就关掉它使用的SOCKET。
你的机器能支持的数量就是你在现有资源下这个做法的并发数,这个并发数应该大于你在ACCEPT里指定的BLOCK的阈值。还有一点就是刚释放的资源还不是马上就能用呢,所以有时候封装并不是最好的选择。
Balana_yan
2012-03-01
打赏
举报
回复
貌似这样不行啊,我试过了。这个理论上有点不通。
2个就需要两个socket的话,那1000个就要1000个socket?
还有无线循环是在accept处一直等待新的请求到来的,你要退出重新建立连接,很危险吧~~?
Balana_yan
2012-03-01
打赏
举报
回复
[Quote=引用 16 楼 cppbegginer 的回复:]
两个连接需要两个socket变量
引用 14 楼 balana_yan 的回复:
还有,我这样做了之后不能同时连接:当我连接第一个客户端并发数成功后,没有断开客户端。然后连接第二个也成功,也能发数。但是当我回去用之前的那个客户端发数时,就不能发数了。有的时候必须重新连接才能发数,有的时候是重新连就连不上了。请各位帮帮忙想一下,我实在是不知道这个怎么弄~·
[/Quote]
啊?这样啊?????
cppbegginer
2012-02-28
打赏
举报
回复
开线程的代码是同一个,但是运行的是不同的线程,传不同的参数进去跑是没什么问题的。
cppbegginer
2012-02-28
打赏
举报
回复
pServer->m_socketClient = accept(pServer->m_socketListen, (struct sockaddr *)&sockRemote, &nAddrLen); //创建接收套接字pServer->m_socketClient
这个是保存接收的的socket对象?你这样只能保存一个socket对象?建议采用链表或者其它的方式,可以保存多个socket对象,然后对这些对象进行操作就可以了
Balana_yan
2012-02-28
打赏
举报
回复
[Quote=引用 8 楼 cppbegginer 的回复:]
若两个客户端都在发送数据,那么服务器端两个线程要怎样做才能正确的接收呢?
两个服务端线程依然在接收就行了,发送数据不影响接收
[/Quote]
我是这样做的
while (pServer->IsListenStarted())
{
pServer->m_socketClient = accept(pServer->m_socketListen, (struct sockaddr *)&sockRemote, &nAddrLen); //创建接收套接字pServer->m_socketClient
if (pServer->m_socketClient == INVALID_SOCKET)
{
continue;
}
AfxBeginThread(ReceiveThread, pParam);//这样开的这个线程这里总觉得有点问题。每次接收到一个请求后,开启这个线程,但是当再来一个线程时,开的还是这个线程,那么接收的数据都是在同一个线程里面实现的。这点我觉得有不妥之处。但是我不知奥怎样改、、、
}
cppbegginer
2012-02-28
打赏
举报
回复
若两个客户端都在发送数据,那么服务器端两个线程要怎样做才能正确的接收呢?
两个服务端线程依然在接收就行了,发送数据不影响接收
Balana_yan
2012-02-28
打赏
举报
回复
还有,我这样做了之后不能同时连接:当我连接第一个客户端并发数成功后,没有断开客户端。然后连接第二个也成功,也能发数。但是当我回去用之前的那个客户端发数时,就不能发数了。有的时候必须重新连接才能发数,有的时候是重新连就连不上了。请各位帮帮忙想一下,我实在是不知道这个怎么弄~·
Balana_yan
2012-02-28
打赏
举报
回复
[Quote=引用 10 楼 cppbegginer 的回复:]
pServer->m_socketClient = accept(pServer->m_socketListen, (struct sockaddr *)&sockRemote, &nAddrLen); //创建接收套接字pServer->m_socketClient
这个是保存接收的的socket对象?你这样只能保存一个socket对象?建议采用链表或者其它的方式,可以……
[/Quote]
请问有没有好的例子供我参考一下,不太明白这个意思。感觉怎么样做都不对一样。
Balana_yan
2012-02-28
打赏
举报
回复
[Quote=引用 11 楼 cppbegginer 的回复:]
开线程的代码是同一个,但是运行的是不同的线程,传不同的参数进去跑是没什么问题的。
[/Quote]
你的意思是虽然开的线程代码是一样的,但是当每开一次,这个线程处理的是不同的内容,对吗?
Balana_yan
2012-02-27
打赏
举报
回复
还有没有人知道呢?
w20120125
2012-02-24
打赏
举报
回复
开新线程来处理新的连接,这样的思路根本就应当抛弃,建议你放弃原来的封装,重新设计合理的封装。
采用完成端口是最佳方案
加载更多回复(5)
一个
服务器
对多个
客户端
的MFC Socket编程示例(
实现
简单的即时通讯功能)
实现
一个
服务器
对多个
客户端
的关键是,在服务端的使用集合CPtrList类用保存
客户端
的socket对象,思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存
客户端
的socket对象,而MFC框架提供了...
Socket聊天程序(
一个
服务端,多个
客户端
)
Socket聊天程序是
一个
基于C#编程语言
实现
的网络通信应用,它允许
一个
服务端与多个
客户端
进行实时交互。在本文中,我们将深入探讨Socket编程的基本概念、C#中的Socket类、
服务器
端与
客户端
的设计以及如何
实现
多用户...
Android Socket编程
客户端
服务器
端源码
通过这
两个
流,
客户端
可以发送数据到
服务器
并接收
服务器
返回的数据。 3. 数据交互:
客户端
通常会使用BufferedReader和PrintWriter进行数据的读写操作,例如: ```java BufferedReader in = new BufferedReader(new...
C# Socket简单例子(
服务器
与
客户端
通信)
总的来说,"C# Socket简单例子(
服务器
与
客户端
通信)"是
一个
基础的网络编程教程,旨在帮助
开
发者了解如何使用C#的Socket类建立简单的TCP连接并进行数据交换。这
两个
程序为理解Socket通信机制提供了直观的实践,为...
Android基于Socket聊天最终版
在本项目中,“Android基于Socket聊天最终版”是
一个
实现
了基于Socket通信的简易聊天应用,它模仿了QQ的一些功能。这个项目包含三个主要部分:
服务器
端、
客户端
和数据库管理。通过Socket编程,Android设备可以作为...
网络编程
18,364
社区成员
64,187
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章