2014-11-14 68 views
0

我正在使用C#多线程套接字程序。用于连接客户端代码:C#多客户端 - 发送昵称以及IP和端口号

c.Connect(ipText.Text, port); // Can I add nickName here? probably not? 
thrReceive = new Thread(new ThreadStart(Receive)); //Receive -> accepts buffers from server 
thrReceive.Start(); 

在我开始的问题,什么我想要做一个快速浏览: 所有数据发送由客户应直接向所有其他客户端,但没有寄件人,所以每次客户端发送数据时,程序都应该遍历客户端列表并发送数据。

我一直在努力与端口和IP一起,我想发送一个昵称到服务器。之后,服务器将检查昵称是否唯一。否则,它将拒绝连接。

我想到了一个简单的解决方案,其中客户端发送昵称与它发送的句子,所以这是建立与服务器连接后。服务器保存一个结构列表,可以说结构被称为“参数”。 “参数”由3个变量组成:1)套接字2)bool first = true 3)字符串nick

每当建立新连接时,将创建一个新的“param”,启动“first”为true,“nick”清空字符串,当然还有套接字到客户端。并且第一次同一套接字通过缓冲区发送数据时,我将提取它的昵称,将“first”设置为false并检查其唯一性(如果不唯一),然后断开套接字并删除相关条目。

我相信上面的解决方案不是一个好的解决方案,实际上没什么好的:)我应该有一些正确的方法,我想。

+0

连接后需要发送数据包到服务器。服务器必须接受才能向其发送数据。发送类似Auth 的数据包样式,然后让服务器以yes或no(同样以您的数据包样式)响应并将其从服务器中踢出(如果inavlid – WebFreak001 2014-11-14 14:31:52

回答

0

您无法通过连接发送数据。这意味着您不能拒绝连接,但您可以发送数据包以在服务器上进行身份验证。举例说:

客户端连接

服务器接受

客户端发送类似“验证[用户名]”

服务器会检查用户名是免费

如果不是:服务器发送的东西像“RejectAuth”给客户端并断开连接。

如果它是免费的:服务器发送类似“AcceptAuth”和协议继续(共享信息,发送数据等)

注:这是不是最优化的方式。你可以不要断开连接分配一个随机的用户名,并发送给他一个更改请求。这更好,因为它更快,用户可以发送新的用户名,并立即检查它是否是免费的。

+0

是否有任何现有的用于身份验证的库或应使用缓冲区?我做了一点研究,但找不到任何。有人说套接字没有身份验证,应该在应用程序库中处理。我是应该写一些函数/类的人吗?如果是这样,你可以把头抬起来吗? – notused 2014-11-14 15:48:56

+0

@xCoder如果你真的想要密码auth你可能需要一个auth服务器。因此,一个主服务器发送用户名和密码并获得一个会话密钥。然后,您可以将该会话密钥发送到要连接的服务器,服务器将从主服务器的api获取信息。如果你只是想发送用户名,然后连接后发送它,等待回应^^ – WebFreak001 2014-11-15 00:10:13

+0

我发送数据到服务器时使用了键值。从客户端发送的任何缓冲区都有一个键值,服务器对它们进行评估并相应地执即如果关键是缺口,看看录制的客户端...感谢您的答案btw :) – notused 2014-11-15 01:43:12