当前位置:编程学习 > C#/ASP.NET >>

关于TCP怎么建立连接问题?

现在我有两个客户端一个服务端,并且这两个客户端都与服务端都建立了套接字连接在服务端都有一个线程开启为它服务。如果现在有一个客户端想与另一个客户端交流,所以它先给服务器发一个请求并告诉它要想交流的用户,那么服务器要怎么能查找到它 要连接的客户端Socket线程,并在转发客户端发给另一客户端的消息?求C#实现。。。。。。
还有就是我个人觉得转发是不是有点慢,能不能让服务器帮忙将这两个客户端建立套接字连接,然后直接交流,中间不经过服务器? --------------------编程问答-------------------- 1.要分清局域网通信还是外网间通信
2.如果是局域网通信好办,需求中如果明确另一个客户端的ip端口就不需要服务端。
如果不知道当然要去服务端获得。每个客户端上线都要通知服务端自己的ip和端口。
获取到对方ip和端口的话就可以p2p了。
3.外网的话必然需要服务端。原理同第二条,可以每条消息都通过服务端转。如果不想
通过服务器转而直接p2p的话需要涉及到打洞。 --------------------编程问答--------------------

 int port = 5011;
            string host = "127.0.0.1";
            IPAddress ip = IPAddress.Parse(host);
            IPEndPoint ipe = new IPEndPoint(ip, port);
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
            s.Bind(ipe);//绑定2000端口
            s.Listen(0);//开始监听     
            
  Socket temp = s.Accept();//为新建连接创建新的Socket。;

            while (true)
            {
                string recvStr = "";
                byte[] recvBytes = new byte[1024];
                int bytes;
               

                bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
                if (bytes==0)
                {
                    Thread.Sleep(1000);
                    continue;
                }

                recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);

                if(recvStr=="01")
                {
                    clsRtSrvobjData cls = new clsRtSrvobjData();
                    cls.Test(1);
                }

            }
--------------------编程问答-------------------- 求2楼仁兄实现
还有3楼写的只不过是普通服务端的处理线程,这个我知道,
它先给服务器发一个请求并告诉它要想交流的用户,那么服务器要怎么能查找到它 要连接的客户端Socket线程,并在转发客户端发给另一客户端的消息,我想知道这个 --------------------编程问答-------------------- 请问楼主是不是想叫两个客户端直接建立连接,不通过服务器中转处理? --------------------编程问答-------------------- 是这么想的,想做一个局域网内的即使通信软件,个人认为如果客户端都是采用服务器将消息中转到另一客户端会很慢,不符合局域网块的特点,只是想服务端为这两个客户端搭建连接,求实现。。。。 --------------------编程问答--------------------
引用 3 楼 zhu9658234 的回复:
求2楼仁兄实现
还有3楼写的只不过是普通服务端的处理线程,这个我知道,
它先给服务器发一个请求并告诉它要想交流的用户,那么服务器要怎么能查找到它 要连接的客户端Socket线程,并在转发客户端发给另一客户端的消息,我想知道这个

局域网的话很简单啊
每个客户端应该都有一个唯一标识,类似qq的qq号。每个客户端上线需要告诉服务端你的ip和端口以及自己的id和想要聊天的客户端id,并且将在线标志制成true。服务端根据id找到对应的另一个客户端并判断他在不在线以及获得他的ip和端口。将这个客户端的信息返回给客户端。之后你们就可以p2p了。 --------------------编程问答-------------------- 或者可以像ipmsg那样,每个客户端登录后都要想服务端索要一个当前局域网在线所有人的列表。这个列表包括id,ip,端口。你就可以选择性的和这些客户端通信了。前提都是每个客户端都要有自己的一个id --------------------编程问答-------------------- 嗯,大概了解了,想问下腾讯QQ是不是在两个人通信的时候用的P2P?还有就是我要满足多对一个通信,就是说同时可能有2个以上的客户端要求与另外一个客户端通信交流,用p2p都能为这两个客户端建立连接吗?会不会出现端口被占用的问题? --------------------编程问答--------------------     我觉得腾讯应该是 p2p。至于聊天记录服务器存在应该也是在登录或者每隔一定时间统一上传到服务器。应该不是每聊一句聊天记录都进服务器然后转给你的好友。负载会很大的。这是个人浅见。
     socket监听是单独一个线程,不管对方几个人,都是通过这个监听线程获得消息。获得消息后你在解析一下。比如包头前10位是对方客户端id。你读一下这个包前10位不就知道id了么。然后把这条消息扔给对应的窗体。所以不存在端口占用问题。 --------------------编程问答--------------------
引用 8 楼 zhu9658234 的回复:
嗯,大概了解了,想问下腾讯QQ是不是在两个人通信的时候用的P2P?还有就是我要满足多对一个通信,就是说同时可能有2个以上的客户端要求与另外一个客户端通信交流,用p2p都能为这两个客户端建立连接吗?会不会出现端口被占用的问题?


要是这样做,腾讯早就被用户骂死了。

要知道这个世界上还有放火墙,代理这些东西存在。

至少要准备两种预案,客户端能互联则互联,不能互联则连服务器。 --------------------编程问答--------------------
引用 10 楼 cgabriel 的回复:
引用 8 楼 zhu9658234 的回复:
嗯,大概了解了,想问下腾讯QQ是不是在两个人通信的时候用的P2P?还有就是我要满足多对一个通信,就是说同时可能有2个以上的客户端要求与另外一个客户端通信交流,用p2p都能为这两个客户端建立连接吗?会不会出现端口被占用的问题?


要是这样做,腾讯早就被用户骂死了。

要知道这个世界上还有放火墙,代理这些东西存在。

至少要准备两种预案,……

不能互联则连服务器,如果用连接服务器这种怎样传输消息,既能保证消息的及时性,又不至于服务器负担过大呢?总不能像上面说的那样说一句然后回传服务器,然后解析在转发吧? --------------------编程问答--------------------
引用 11 楼 zhu9658234 的回复:
引用 10 楼 cgabriel 的回复:
引用 8 楼 zhu9658234 的回复:
嗯,大概了解了,想问下腾讯QQ是不是在两个人通信的时候用的P2P?还有就是我要满足多对一个通信,就是说同时可能有2个以上的客户端要求与另外一个客户端通信交流,用p2p都能为这两个客户端建立连接吗?会不会出现端口被占用的问题?


要是这样做,腾讯早就被用户骂死了。

要知道这个世界上还有放火墙,……

你做的是局域网通信,根本不需要服务端转发。服务端只是在客户端登录时用一下。还有下线的时候通知一下。10楼说的是因为外网间通信是要穿透防火墙的。也就是p2p打洞。所以可能存在无法实现p2p。所以这种情况要服务端转一下。你的局域网通信不用这么麻烦的 --------------------编程问答--------------------
引用 12 楼 wangyue4 的回复:
引用 11 楼 zhu9658234 的回复:
引用 10 楼 cgabriel 的回复:
引用 8 楼 zhu9658234 的回复:
嗯,大概了解了,想问下腾讯QQ是不是在两个人通信的时候用的P2P?还有就是我要满足多对一个通信,就是说同时可能有2个以上的客户端要求与另外一个客户端通信交流,用p2p都能为这两个客户端建立连接吗?会不会出现端口被占用的问题?


要是这样做,腾讯早就……

你做的是局域网通信,根本不需要服务端转发。服务端只是在客户端登录时用一下。还有下线的时候通知一下。10楼说的是因为外网间通信是要穿透防火墙的。也就是p2p打洞。所以可能存在无法实现p2p。所以这种情况要服务端转一下。你的局域网通信不用这么麻烦的


通常放火墙是装在电脑上的,跟网络是什么类型没有关系吧。 --------------------编程问答-------------------- 求P2P大概实现 --------------------编程问答--------------------
引用 3 楼 zhu9658234 的回复:
求2楼仁兄实现
还有3楼写的只不过是普通服务端的处理线程,这个我知道,
它先给服务器发一个请求并告诉它要想交流的用户,那么服务器要怎么能查找到它 要连接的客户端Socket线程,并在转发客户端发给另一客户端的消息,我想知道这个


你没有用一个集合保存所有接入的客户端的套接字吗? --------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,