定义客户端的C#tcp套接字
我正在尝试使用Visual Studio 2010设置tcp.net套接字网络。到目前为止,我可以将客户端连接到它,但目前我无法定义连接的客户端。我需要一组连接的客户机,这样我就可以更具体地了解我的客户 这是我的服务器代码,我正在从中复制所有这些 服务器代码定义客户端的C#tcp套接字,c#,sockets,tcp,networkstream,C#,Sockets,Tcp,Networkstream,我正在尝试使用Visual Studio 2010设置tcp.net套接字网络。到目前为止,我可以将客户端连接到它,但目前我无法定义连接的客户端。我需要一组连接的客户机,这样我就可以更具体地了解我的客户 这是我的服务器代码,我正在从中复制所有这些 服务器代码 static TcpListener tcpListener = new TcpListener(25000); static void Listeners() { Socket socketForClie
static TcpListener tcpListener = new TcpListener(25000);
static void Listeners()
{
Socket socketForClient = tcpListener.AcceptSocket();
if (socketForClient.Connected)
{
Console.WriteLine("Client:"+socketForClient.RemoteEndPoint+" now connected to server.");
NetworkStream networkStream = new NetworkStream(socketForClient);
System.IO.StreamWriter streamWriter =
new System.IO.StreamWriter(networkStream);
System.IO.StreamReader streamReader =
new System.IO.StreamReader(networkStream);
Console.WriteLine("type your message to be recieved by client:");
string theString2 = Console.ReadLine();
streamWriter.WriteLine(theString2);
Console.WriteLine(theString2);
streamWriter.Flush();
while (true)
{
string theString = streamReader.ReadLine();
Console.WriteLine("Message recieved by client:" + theString);
if (theString == "exit")
break;
}
streamReader.Close();
networkStream.Close();
streamWriter.Close();
}
socketForClient.Close();
Console.WriteLine("Press any key to exit from server program");
Console.ReadKey();
}
public static void Main()
{
tcpListener.Start();
Console.WriteLine("************This is Server program************");
Console.WriteLine("Hoe many clients are going to connect to this server?:");
int numberOfClientsYouNeedToConnect = int.Parse(Console.ReadLine());
for (int i = 0; i < numberOfClientsYouNeedToConnect; i++)
{
Thread newThread = new Thread(new ThreadStart(Listeners));
newThread.Start();
}
}
静态TcpListener TcpListener=新TcpListener(25000);
静态void侦听器()
{
Socket socketForClient=tcpListener.AcceptSocket();
if(socketForClient.Connected)
{
WriteLine(“客户端:+socketForClient.RemoteEndPoint+“现在已连接到服务器”);
NetworkStream NetworkStream=新的NetworkStream(socketForClient);
System.IO.StreamWriter StreamWriter=
新系统IO.StreamWriter(networkStream);
System.IO.StreamReader StreamReader=
新系统IO.StreamReader(networkStream);
WriteLine(“键入您要由客户端接收的消息:”;
字符串theString2=Console.ReadLine();
streamWriter.WriteLine(字符串2);
控制台写入线(字符串2);
streamWriter.Flush();
while(true)
{
字符串字符串=streamReader.ReadLine();
Console.WriteLine(“客户端接收到的消息:“+theString”);
如果(字符串==“退出”)
打破
}
streamReader.Close();
networkStream.Close();
streamWriter.Close();
}
socketForClient.Close();
Console.WriteLine(“按任意键退出服务器程序”);
Console.ReadKey();
}
公共静态void Main()
{
tcpListener.Start();
Console.WriteLine(“*************这是服务器程序*************”);
WriteLine(“有多少客户端要连接到此服务器?:”;
int numberOfClientsYouNeedToConnect=int.Parse(Console.ReadLine());
for(int i=0;i
如果要坚持原始TCP套接字,则可以将委托/处理程序等传递给线程:
for (int i = 0; i < numberOfClientsYouNeedToConnect; i++)
{
Thread newThread = new Thread(new ParameterizedThreadStart(Listeners));
newThread.Start(i);
}
for(int i=0;i
然后,您的侦听器需要获取一个对象
,以匹配参数化线程开始
然而,如果您正在开发两端(正如我所评论的),我会为这样的场景建议一些更抽象或类似的东西。这会增加一点开销,但您可以在方便的抽象级别上实现服务器到客户端的通信,反之亦然。也许我不理解这个问题,但为什么不在侦听器接受“socketForClient”时将其添加到列表中呢?然后在客户端发送“exit”并且套接字关闭时将其删除。请务必意识到您正在查看的示例有一个糟糕的线程解决方案。你应该找一个更好的教程,有很多。你是在开发两端吗?你有没有看过一些可用的工具来避免所有的麻烦?就像@Fishy说的,这段代码很可怕。不要建立在它之上,找一个更好的教程。无论如何,您似乎只需要从
socketsocketforclient=tcpListener.AcceptSocket()
保存套接字,例如在列表中保存套接字。但是,您仍然需要在服务器端执行线程/消息处理。我会说‘不要建立在这个概念上’。