版主,请教你一个关于 socket 的问题

wanderingies 2013-09-23 01:07:09
现在有一台服务器开了三个以上的端口(IP地址是唯一的)比如
port:12345 // 邮件接收和回执
port:23456 // 信息接收和回执
port:34567 // 状态接收和回执
... ...

现在要写的是客户端,怎么样用 socket 。可以同时连接这三个或三个以上的端口,保持长连接吗?


我试过建 三个socket,报错说,只能建立一个。
我用程序域,可是消息的传送和接收是很大问题。
...全文
662 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanderingies 2013-10-04
  • 打赏
  • 举报
回复
引用 14 楼 lr5420511 的回复:
[quote=引用 13 楼 u012117131 的回复:] [quote=引用 12 楼 lr5420511 的回复:] [quote=引用 11 楼 u012117131 的回复:] [quote=引用 10 楼 lr5420511 的回复:] “/// 服务端和客户端建立连接的方式稍有不同, 子类会重载,客户端重载Access函数 /// </summary> /// <param name="IP"></param> /// <param name="AccessAciton"></param> public override void Access(string IP,int Port, System.Action AccessAciton) ” 领教了,我开始怀疑我是不是老年记忆衰退了,当我看到override时,我发现我的记忆力很好!
不要用火星人的思想和说话方式,请使用地球语言,中文,汉语,[/quote] 呵呵呵,孩子,基本知识先百度下在往论坛上发吧![/quote] 如果你来这里是想让人恶心的话,恭喜你,你的目地达到了[/quote] 不和你争辩了,你连最基本的知识都没搞清楚,给你说什么都是废话![/quote] 哈哈,,,最基础的东西?世上最大的笑话,米饭是粮食,难到吃面就会饿死人了? 同样的目地,我用的方法可能不是最高效的,但你就这么肯定这样错了?
lr5420511 2013-10-03
  • 打赏
  • 举报
回复
引用 13 楼 u012117131 的回复:
[quote=引用 12 楼 lr5420511 的回复:] [quote=引用 11 楼 u012117131 的回复:] [quote=引用 10 楼 lr5420511 的回复:] “/// 服务端和客户端建立连接的方式稍有不同, 子类会重载,客户端重载Access函数 /// </summary> /// <param name="IP"></param> /// <param name="AccessAciton"></param> public override void Access(string IP,int Port, System.Action AccessAciton) ” 领教了,我开始怀疑我是不是老年记忆衰退了,当我看到override时,我发现我的记忆力很好!
不要用火星人的思想和说话方式,请使用地球语言,中文,汉语,[/quote] 呵呵呵,孩子,基本知识先百度下在往论坛上发吧![/quote] 如果你来这里是想让人恶心的话,恭喜你,你的目地达到了[/quote] 不和你争辩了,你连最基本的知识都没搞清楚,给你说什么都是废话!
wanderingies 2013-09-28
  • 打赏
  • 举报
回复
引用 12 楼 lr5420511 的回复:
[quote=引用 11 楼 u012117131 的回复:] [quote=引用 10 楼 lr5420511 的回复:] “/// 服务端和客户端建立连接的方式稍有不同, 子类会重载,客户端重载Access函数 /// </summary> /// <param name="IP"></param> /// <param name="AccessAciton"></param> public override void Access(string IP,int Port, System.Action AccessAciton) ” 领教了,我开始怀疑我是不是老年记忆衰退了,当我看到override时,我发现我的记忆力很好!
不要用火星人的思想和说话方式,请使用地球语言,中文,汉语,[/quote] 呵呵呵,孩子,基本知识先百度下在往论坛上发吧![/quote] 如果你来这里是想让人恶心的话,恭喜你,你的目地达到了
lr5420511 2013-09-28
  • 打赏
  • 举报
回复
引用 11 楼 u012117131 的回复:
[quote=引用 10 楼 lr5420511 的回复:] “/// 服务端和客户端建立连接的方式稍有不同, 子类会重载,客户端重载Access函数 /// </summary> /// <param name="IP"></param> /// <param name="AccessAciton"></param> public override void Access(string IP,int Port, System.Action AccessAciton) ” 领教了,我开始怀疑我是不是老年记忆衰退了,当我看到override时,我发现我的记忆力很好!
不要用火星人的思想和说话方式,请使用地球语言,中文,汉语,[/quote] 呵呵呵,孩子,基本知识先百度下在往论坛上发吧!
wanderingies 2013-09-25
  • 打赏
  • 举报
回复
引用 10 楼 lr5420511 的回复:
“/// 服务端和客户端建立连接的方式稍有不同, 子类会重载,客户端重载Access函数 /// </summary> /// <param name="IP"></param> /// <param name="AccessAciton"></param> public override void Access(string IP,int Port, System.Action AccessAciton) ” 领教了,我开始怀疑我是不是老年记忆衰退了,当我看到override时,我发现我的记忆力很好!
不要用火星人的思想和说话方式,请使用地球语言,中文,汉语,
wanderingies 2013-09-24
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
你胡乱抄了两个自相矛盾的话。 base.communicateSocket.Bind(new IPEndPoint(IPAddress.Any, 3302)); 和 //客户端只用来向指定的服务器发送信息,不需要绑定本机的IP和端口,不需要监听
这个是测试用的,贴代码时候忘记删掉了, 倒想听听你的高见,怎么样解决
lr5420511 2013-09-24
  • 打赏
  • 举报
回复
“/// 服务端和客户端建立连接的方式稍有不同, 子类会重载,客户端重载Access函数 /// </summary> /// <param name="IP"></param> /// <param name="AccessAciton"></param> public override void Access(string IP,int Port, System.Action AccessAciton) ” 领教了,我开始怀疑我是不是老年记忆衰退了,当我看到override时,我发现我的记忆力很好!
shenlanql 2013-09-23
  • 打赏
  • 举报
回复
客户端的socket 不需要指定端口, 只需连接服务器的指定端口就行。 就是说 同一IP的同一端口只能创建一个socket。你可以让客户端的socket自己分配端口。
是_这样吗 2013-09-23
  • 打赏
  • 举报
回复
邮件什么的用UDP比较好吧,UDP可以端口复用。
  • 打赏
  • 举报
回复
你胡乱抄了两个自相矛盾的话。 base.communicateSocket.Bind(new IPEndPoint(IPAddress.Any, 3302)); 和 //客户端只用来向指定的服务器发送信息,不需要绑定本机的IP和端口,不需要监听
wanderingies 2013-09-23
  • 打赏
  • 举报
回复
引用 5 楼 dixh1989 的回复:
邮件什么的用UDP比较好吧,UDP可以端口复用。
不是的,服务端指定TCP连接, 我现在又加了一个服务端,客户端向服务端单端口发送需要的信息,再由自自定义的服务端解析到需要的端口,, 我是想这样加强发送时的数据安全,再者自定义的服务端可以随时断开和再连接到需要的端口,因为最终要连接的服务端有三个端口。 最终的服务端是写好的,不能动,三个端口。
wanderingies 2013-09-23
  • 打赏
  • 举报
回复
/// <summary> /// 不管是服务端还是客户端, 建立连接后用这个Socket进行通信 /// </summary> public Socket communicateSocket = null; /// <summary> /// 服务端和客户端建立连接的方式稍有不同, 子类会重载 /// </summary> /// <param name="IP"></param> /// <param name="AccessAciton"></param> public abstract void Access(string IP,int Port, System.Action AccessAciton); /// <summary> /// 发送消息的函数 /// </summary> /// <param name="message"></param> public void Send(Byte[] msg) { if (communicateSocket.Connected == false) { throw new Exception("还没有建立连接, 不能发送消息"); } //Byte[] msg = new byte[] { 0x80, 0x4F, 0x52, 0x09, 0x49, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x12, 0x34, 0x22, 0x6B, 0xCE, 0x8F, 0x7F, 0x4F, 0x28, 0x75, 0x20, 0x00, 0x57, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x8C, 0x5B, 0x8E, 0x7F, 0xFD, 0x56, 0x45, 0x96, 0x6C, 0x51, 0x4A, 0x54, 0xFB, 0x7C, 0xDF, 0x7E, 0x00 }; communicateSocket.BeginSend(msg, 0, msg.Length, SocketFlags.None, ar => { }, null); } /// <summary> /// 接受消息的函数 /// </summary> /// <param name="ReceiveAction"></param> public void Receive(System.Action<Byte[]> ReceiveAction) { //如果消息超过1024个字节, 收到的消息会分为(总字节长度/1024 +1)条显示 Byte[] msg = new byte[65536]; try { //异步的接受消息 communicateSocket.BeginReceive(msg, 0, msg.Length, SocketFlags.None, ar => { //对方断开连接时, 这里抛出Socket Exception //An existing connection was forcibly closed by the remote host communicateSocket.EndReceive(ar); ReceiveAction(msg); Receive(ReceiveAction); }, null); } catch (SocketException se) { } } /// <summary> /// 断开连接 /// </summary> public void Disconnect() { try { communicateSocket.Close(); communicateSocket.Dispose(); } catch (SocketException se) { throw new ContextMarshalException("PollIOError: " + se.Message); } } /// <summary> /// 客户端重载Access函数 /// </summary> /// <param name="IP"></param> /// <param name="AccessAciton"></param> public override void Access(string IP,int Port, System.Action AccessAciton) { base.communicateSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); base.communicateSocket.Bind(new IPEndPoint(IPAddress.Any, 3302)); //服务器的IP和端口 IPEndPoint serverIP; try { serverIP = new IPEndPoint(IPAddress.Parse(IP), Port); } catch { throw new Exception(String.Format("{0}不是一个有效的IP地址!", IP)); } //客户端只用来向指定的服务器发送信息,不需要绑定本机的IP和端口,不需要监听 try { base.communicateSocket.BeginConnect(serverIP, ar => { AccessAciton(); }, null); } catch { throw new Exception(string.Format("尝试连接{0}不成功!", IP)); } }
threenewbee 2013-09-23
  • 打赏
  • 举报
回复
引用 2 楼 u012117131 的回复:
[quote=引用 1 楼 caozhy 的回复:] 建 三个socket,报错说,只能建立一个。 什么意思?
同一IP,同时只能连接到一个端口[/quote] 怎么可能呢。你的代码怎么写的。
wanderingies 2013-09-23
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
建 三个socket,报错说,只能建立一个。 什么意思?
同一IP,同时只能连接到一个端口
threenewbee 2013-09-23
  • 打赏
  • 举报
回复
建 三个socket,报错说,只能建立一个。 什么意思?

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧