客户端和服务器监听请求 [英] Clients and Server Listening for requests

查看:171
本文介绍了客户端和服务器监听请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道如果我的思维方式是什么好。
这里是sitution:

I would like to know if my way of thinking is any good. Here is sitution:


  • 服务器接受异步的连接。之后接受的是recieveing​​上接受的套接字异步。

  • 客户端连接到异步服务器,然后侦听请求异步。

我想要做的是发送从客户端和服务器的请求。对方应该接受她。

What I want to do is to send requests from both client and server. Other side should recieve it.

服务器code:

    public ServerHandler()
    {
        _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        _serverSocket.Bind(_ipLocal);
        _serverSocket.Listen(4);
        _serverSocket.BeginAccept(AcceptCallback, null);
    }

    private void AcceptCallback(IAsyncResult ar)
    {
        Socket socket = (Socket)ar.AsyncState;
        _clients.Add(socket);

        socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, RecieveCallback, socket);
        _serverSocket.BeginAccept(AcceptCallback, null);
    }

    private void RecieveCallback(IAsyncResult ar)
    {
        var socket = (Socket) ar.AsyncState;
        var recieved = socket.EndReceive(ar);
        var dataBuff = new byte[recieved];

        Array.Copy(_buffer, dataBuff, recieved);

        OnMessageRecieved(dataBuff);

        socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, RecieveCallback, socket);
    }

    private void Send(byte[] data, Socket socket)
    {
        socket.BeginSend(data, 0, data.Length, SocketFlags.None,
                SendCallback, socket);
    }

    private void SendCallback(IAsyncResult ar)
    {
        var socket = (Socket)ar.AsyncState;
        socket.EndSend(ar);
    }

    private void SendToAll(byte[] data)
    {
        foreach (var clientSocket in _clients)
        {
            Send(data, clientSocket);
            Debug.WriteLine("sent to: " + clientSocket.LocalEndPoint);
        }
    }

客户端code:

Client code:

    public ClientHandler()
    {
        _ipLocal = new IPEndPoint(IPAddress.Parse(ServerIp), Port);
    }

    public void ConnectLoop()
    {
        int attempts = 0;
        while (!_clientSocket.Connected)
        {
            try
            {
                attempts++;
                _clientSocket.BeginConnect(IPAddress.Parse(ServerIp), Port, ConnectCallback, null);
                _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, RecieveCallback,
                                           _clientSocket);
            }
            catch (Exception)
            {
                Debug.WriteLine("Connection attempts: " + attempts);
            }
        }

        Debug.WriteLine("Connected");
    }

    private void ConnectCallback(IAsyncResult ar)
    {
        _clientSocket.EndConnect(ar);
    }

    private void RecieveCallback(IAsyncResult ar)
    {
        var socket = (Socket) ar.AsyncState;
        int recieved = _clientSocket.EndReceive(ar);
        var dataBuff = new byte[recieved];

        Array.Copy(_buffer, dataBuff, recieved);

        OnMessageRecieved(dataBuff);

        _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, RecieveCallback, _clientSocket);
    }

    private void Send(byte[] data, Socket socket)
    {
        socket.BeginSend(data, 0, data.Length, SocketFlags.None,
                SendCallback, socket);
    }

    private void SendCallback(IAsyncResult ar)
    {
        var socket = (Socket)ar.AsyncState;
        socket.EndSend(ar);
    }

将某事像这样的工作?

Will sth like this work?

EDIT1:哦,我想通过1插槽做到这一点。客户端/服务器发送和recieveing​​在同一个插座。但可以有多个客户端<击>插槽,但只有1对客户端 - 服务器。

Oh, and I want to do it through 1 socket. Client/server sending and recieveing on same socket. But there can be multiple clients sockets, but only 1 for pair client-server.

推荐答案

如果没有测试,你的code看起来没事但是,你需要提供额外的code,以确定是否有一个整个邮件或不。

Without testing, your code looks alright however, you'll need to provide extra code to determine if you've got a whole message or not.

当你读,你可能会得到以下情形之一:

When you do a read, you may get one of the following scenarios:


  • 一些消息,但不是全部

  • 所有确切的消息

  • 所有的消息,加上一些/所有其他消息的

  • 套接字错误(断线等)。

有确定的一些普遍接受的方法是什么一个整体消息:

There are a few generally accepted methods of determining what a whole message is:


  • 划定的留言,这样receival code需要寻找分隔符

  • 带有某种嵌入一个固定的消息大小来表示,如果有更多的消息

  • 一个可变信息大小,但与被发送的第一即说的第4个字节将指示消息的大小固定大小的一部分。所以,你知道你总是需要4个字节首先要确定消息的长度;然后你知道多少,为下一个消息处理。

这SO张贴聊天有更多的一些服务应用程序和处理消息的链接。

This SO post Chat service application has some more and links on processing messages.

这篇关于客户端和服务器监听请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆