问题描述
我想写一个客户端和服务端,使用TCP连接,比如服务端开放某个端口,客户端发送连接请求,在服务端能查看到发出连接请求的多个客户端IP地址,然后选择其中一个进行一对一连接。请问服务端能看到多个连接请求的这个列表该如何写,谢谢各位大神!
解决方案
解决方案二:
网上有代码,你搜吧,c#socket通讯
解决方案三:
撸主,你描述的这个就是socket通讯,一句两句也说不清楚,你度娘找个例子,先把socket通讯搞清楚。
解决方案四:
首先你定义一个字典,存客户端唯一标识号和tcpclient,每次新的添加就在字典上保存,如果断开就除掉。其中的逻辑判断你自己可以搞定,那么这字典的长度就是连接的客户端
解决方案五:
建议自行封装TcpListener,TcpClient类。http://honordream.blog.hexun.com/2858506_d.html
解决方案六:
服务器端不可能主动连接客户端,否则就不是服务器端了。只有在客户端连接服务器端并且传送自己的信息之后,服务器端才能“看到”客户端的信息。例如publicabstractclassMyServer:TcpListener{publicList<Session>lst=newList<Session>();//...................}publicclassSession{publicTcpClientClient;public客户端信息Passport;//其它属性,例如心跳报警时间长度,等等}
你的服务中有一个“连接列表”,当Accept到一个客户端连接时,就根据TcpListener.Accept()获取到的TcpClient对象来创建一个Session对象并加入列表中。然后在相关Client的Receive信息时,客户端传送来的“客户端信息”被更新到服务器端自己的列表中。当你想找某个客户端,例如(凡是“女的、80岁以上的”用户),来群发消息,那么就到这个列表中去关联查找相应的Session,并可以知道用哪一个TcpClient来推送消息。
解决方案七:
解决方案八:
我的意思是有个列表能看见客户端向服务端发送的多个地址的连接请求列表,然后再选择其中一个同意请求并开始连接。
解决方案九:
那你多个客户端的请求,在服务器端进入队列就好额,显示出该队列,然后你选定了个客户端,发送一个信息给客户端,表示你已经同意了请求,然后继续之后的通讯了。也就是说,那些客户端请求来连接的,其实已经连接上了,但是,只是你在服务端不去处理它,等选择一个后,再通知客户端客户端也是在接收到服务端的指定确认信息后,才会有会话了。
解决方案十:
引用7楼u012634379的回复:
我的意思是有个列表能看见客户端向服务端发送的多个地址的连接请求列表,然后再选择其中一个同意请求并开始连接。
那就不叫做服务器端。你得服务端是客户,你的客户端才是服务,这样你的服务端才能“开始连接”。先搞清楚什么叫做客户端、服务器端,这样比较好。要知道,服务器端不可能“开始连接客户端”,而是客户端“开始连接服务端”。另外,当客户端在各种nat路由的后边(1层或者多层),你根本无法访问它。比如说我现在这个电脑的IP是192.168.0.2,在我家里(有6、7个设备使用路由器),而上几层的出口是某电信研究院机房(它下面至少有几万个设备通过它上公网),那么我电脑不去访问csdn服务器,csdn得服务器有怎么可能穿过这一层层的路由器、层次交换机来主动地”开始连接“我的192.168.0.2?
解决方案十一:
程序设计要遵循最基本的原理知识,不可能凭空编造流程。所以遇到基本概念的问题你就是绕不过去的。如果不给你”很不客气地“说明白你的基本知识上的欠缺,你反而会听不进去真正具有可执行力的设计者的忠告的。
解决方案十二:
先恶补基础,不要空想
解决方案十三:
楼主,你的服务端不是全心全意为客户端服务的么,居然还要手动选择,这种设计很糟糕。所有客户端都应该是平等的,只要连上来就建立好通道了,两方随时可发送数据,如果需要验证,那是后面的事。
解决方案十四:
代码很多,只写服务端监听和客户端连接;后面还有客户端发送,服务器端接收等等///<summary>///启动服务器程序,开始监听客户端请求///</summary>publicvirtualvoidStart(){try{Socket_svrSock;//初始化socket_svrSock=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//绑定端口IPEndPointiep=newIPEndPoint(IPAddress.Any,_port);_svrSock.Bind(iep);//开始监听_svrSock.Listen(500);//设置异步方法接受客户端连接_svrSock.BeginAccept(newAsyncCallback(AcceptConn),_svrSock);}catch(Exceptionex){log.WriteError(null,"启动服务器程序,开始监听客户端请求","",ex);if(ex.InnerException!=null)ex=ex.InnerException;//WriteLogs.WriteLog("TcpSvr_Start:"+ex.Source+"thrown"+ex.GetType().ToString()+"<br/>"+ex.Message.Replace("r","").Replace("n","<br/>")+"<br/>"+ex.StackTrace.Replace("r","").Replace("n","<br/>"),WriteLogs.LogType.Exception);}}///<summary>///连接服务器///</summary>///<paramname="ip">服务器IP地址</param>///<paramname="port">服务器端口</param>publicvirtualvoidConnect(stringip,intport){if(IsConnected){//重新连接Debug.Assert(_session!=null);Close();}Socketnewsock=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPEndPointiep=newIPEndPoint(IPAddress.Parse(ip),port);newsock.BeginConnect(iep,newAsyncCallback(Connected),newsock);}
解决方案十五:
当你能看到客户端列表的时候,客户端已经和服务端链接成功了,不然你怎么知道是哪个客户端啊?你在服务端做的无非是,选择一个客户端并和客户端通讯,而不是选择客户端再连接。
解决方案:就像打电话给110一样,110事先是不知道谁要报案,那个报案的人在哪的,只能报案的人主动打给110,警察叔叔知道你在哪后,才能去帮你吧
解决方案:引用11楼Z65443344的回复:
先恶补基础,不要空想
我这里所谓的基础,绝对不仅仅是socket的用法,甚至不是C#这门语言你得把网络基础恶补一下,啥叫服务端,啥叫客户端,啥叫TCP连接,3次握手网络基础都不知道,就开始写代码,那完全是在空想
解决方案:度娘,谷歌,一大堆
解决方案:你这个要求很怪异,其实客户端可以都连接上,然后从中选择进行通信,未被选择另做处理