Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
定义客户端的C#tcp套接字_C#_Sockets_Tcp_Networkstream - Fatal编程技术网

定义客户端的C#tcp套接字

定义客户端的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

我正在尝试使用Visual Studio 2010设置tcp.net套接字网络。到目前为止,我可以将客户端连接到它,但目前我无法定义连接的客户端。我需要一组连接的客户机,这样我就可以更具体地了解我的客户

这是我的服务器代码,我正在从中复制所有这些

服务器代码

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()
保存套接字,例如在
列表中保存套接字。但是,您仍然需要在服务器端执行线程/消息处理。我会说‘不要建立在这个概念上’。