具有多个客户端的异步套接字服务器

哈西姆·罗德(Hashim Rood)

我有一个我无法解决的问题,因为我的C#知识不是很好。我在互联网上找到了一些代码,并根据需要对其进行了修改。

我的问题是,当我向客户端发送消息时,只有一个接收该消息,然后下一个消息被另一个客户端接收,依此类推。我想向所有连接的客户端发送相同的消息而不会丢失任何数据。

服务器

using System;
using System.Net.Sockets;
using System.Threading;


public class AsynchIOServer
{
    static TcpListener tcpListener = new TcpListener(10);

    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);

            ////here we send message to client
            while (true){
                Console.WriteLine("type your message to be recieved by client:");
                string theString = Console.ReadLine();
                streamWriter.WriteLine(theString);
                ////Console.WriteLine(theString);
                streamWriter.Flush();
            }
            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 tcpListener = new TcpListener(10);
        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();
        }
    }
}

客户:

using System;
using System.Net.Sockets;
using System.Threading;
public class Client
{
    static public void Main(string[] Args)
    {
        TcpClient socketForServer;
        try
        {
            socketForServer = new TcpClient("localHost", 10);
        }
        catch
        {
            Console.WriteLine(
            "Failed to connect to server at {0}:999", "localhost");
            return;
        }

        NetworkStream networkStream = socketForServer.GetStream();
        System.IO.StreamReader streamReader =
        new System.IO.StreamReader(networkStream);
        System.IO.StreamWriter streamWriter =
        new System.IO.StreamWriter(networkStream);
        Console.WriteLine("*******This is client program who is connected to localhost on port No:10*****");

            try
            {
                string outputString;
            // read the data from the host and display it
            {
                while (true)
                {
                    outputString = streamReader.ReadLine();
                    Console.WriteLine("Message Recieved by server:" + outputString);

                    streamWriter.Flush();
                }
            }
        }
            catch
            {
                Console.WriteLine("Exception reading from Server");
            }
        // tidy up
        networkStream.Close();
        Console.WriteLine("Press any key to exit from client program");
        Console.ReadKey();
    }

    private static string GetData()
    {
        //Ack from sql server
        return "ack";
    }
}

谢谢

斯塔克

简单工作的多线程服务器:

    static void Process(Socket client) {

        Console.WriteLine("Incoming connection from " + client.RemoteEndPoint);

        const int maxMessageSize = 1024;
        byte[] response;
        int received;

        while (true) {

            // Send message to the client:
            Console.Write("Server: ");
            client.Send(Encoding.ASCII.GetBytes(Console.ReadLine()));
            Console.WriteLine();

            // Receive message from the server:
            response = new byte[maxMessageSize];
            received = client.Receive(response);
            if (received == 0) {
                Console.WriteLine("Client closed connection!");
                return;
            }

            List<byte> respBytesList = new List<byte>(response);
            respBytesList.RemoveRange(received, maxMessageSize - received); // truncate zero end
            Console.WriteLine("Client (" + client.RemoteEndPoint + "+: " + Encoding.ASCII.GetString(respBytesList.ToArray()));
        }
    }

    static void Main(string[] args) {

        int backlog = -1, port = 2222;

        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        server.ReceiveTimeout = -1;

        // Start listening.
        try {
            server.Bind(new IPEndPoint(IPAddress.Any, port));
            server.Listen(backlog);
        }
        catch (Exception) {
            Console.WriteLine("Listening failed!");
            Console.ReadKey();
            return;
        }

        Console.WriteLine("Start listening...");

        while(true) {
            Socket client = server.Accept();
            new System.Threading.Thread(() => {
                try { Process(client); } catch (Exception ex) { Console.WriteLine("Client connection processing error: " + ex.Message); }
            }).Start();
        }

        //Console.WriteLine("Press any key for exit...");
        //Console.ReadKey();
    }

和客户:

    static void WorkWithServer(Socket server) {

        const int maxMessageSize = 1024;
        byte[] response;
        int received;

        while(true) {

            try {

                // Receive message from the server:
                response = new byte[maxMessageSize];
                received = server.Receive(response);
                if (received == 0) {
                    Console.WriteLine("Server closed connection.");
                    return;
                }

                List<byte> respBytesList = new List<byte>(response);
                respBytesList.RemoveRange(received, maxMessageSize - received); // truncate zero end
                Console.WriteLine("Server: " + Encoding.ASCII.GetString(respBytesList.ToArray()));

                // Send message to the server:
                Console.Write("You: ");
                server.Send(Encoding.ASCII.GetBytes(Console.ReadLine()));
                Console.WriteLine();
            }
            catch (Exception ex) {
                Console.WriteLine("Error: " + ex.Message);
                return;
            }
        }

    }

    static void Main(string[] args) {

        IPEndPoint serverEp = new IPEndPoint(IPAddress.Parse("192.168.1.2"), 2222);

        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        server.ReceiveTimeout = -1;

        // Connect to the server.
        try { server.Connect(serverEp); }
        catch (Exception) {
            Console.WriteLine("Establish connection with server (" + serverEp + ") failed!");
            Console.ReadKey();
            return;
        }

        Console.WriteLine("Connection with server (" + serverEp + ") established!");
        WorkWithServer(server);

        Console.WriteLine("Press any key for exit...");
        Console.ReadKey();
    }

根据需要进行编辑。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有IOS客户端兼容性的Web套接字服务器

套接字服务器同时响应来自客户端套接字的多个请求

C#中的异步套接字服务器,通过套接字服务器进行客户端到客户端的通信

具有多个客户端的服务器-JAVA

确定异步套接字服务器中客户端的主机名

服务器套接字不能接受客户端。(C# UWP 异步套接字编程)

Java TCP 客户端/服务器套接字

客户端js上的套接字服务器?

套接字Java客户端-Python服务器

服务器/客户端套接字连接

Java套接字。服务器-客户端通信

套接字编程-简单的客户端/服务器

Java客户端/服务器套接字问题

识别具有多个异步tcp客户端的套接字

C ++套接字-服务器不接受多个客户端(Linux)

在python套接字服务器中接受多个客户端

在套接字客户端服务器中发送多个文件

处理套接字服务器上多个客户端的间隔的最佳实践

TCP套接字从多个顺序客户端转发到与服务器的单个持久套接字连接

客户端套接字找不到服务器套接字。尽管具有相同的端口号,但引发UnknownHostException

使用带有随机端口的套接字将客户端绑定到服务器

带有JavaScript客户端的Java套接字服务器

带有 PHP 客户端的 Java 套接字服务器

在服务器套接字C#中获取有关客户端的数据

客户端/服务器/客户端通过套接字通信

Java套接字服务器-客户端;卡在服务器端

设置客户端套接字和服务器套接字侦听器 (Java)

TCP服务器的异步读取使用boost :: asio打印客户端套接字发送的数据

C#异步套接字服务器仅从客户端收到一条消息