繁体   English   中英

如何将带有数据的客户端 IP 地址从服务器发送到另一个客户端?

[英]How can I send clients IP address with data from server to another client?

我开发了一个类似于客户端-服务器-客户端模型的程序。

我已经取得了一切,并成功地为我提供了一个运行代码

  • 通过连接到服务器的多个客户端将信息从一个客户端发送到另一个客户端

  • 服务器充当中间人和

  • 客户端相互交互

我想知道一种通过服务器将客户端(发送方)IP 地址与数据(图像、音频等)一起传输到客户端(接收方)的有效方法,以便接收客户端可以知道谁发送了特定数据。

仅供参考,会有多个客户端同时连续向特定客户端发送数据,因此我需要区分数据的发送者并记录哪个客户端发送了特定数据。

我的代码:

服务器:

try
   {
    // receive data
    byte[] buffer = new byte[300000];
    current.Receive(buffer, buffer.Length, SocketFlags.None);

    Console.WriteLine("Received: " + current.Receive(buffer, buffer.Length, SocketFlags.None));
    ImageConverter convertData = new ImageConverter();
    Image image = (Image)convertData.ConvertFrom(buffer);
    image.Save("image.png");
    Console.WriteLine("Image saved");
     }
    catch (Exception ex)
    {
         Console.WriteLine("Image not saved");
         logFileWrite("Image not saved");
         Console.WriteLine(ex.ToString());
    }

客户:

try
{
    //send the file
    Bitmap bm = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
    Graphics g = Graphics.FromImage(bm);
    g.CopyFromScreen(0, 0, 0, 0, bm.Size);
    MemoryStream ms = new MemoryStream();
    bm.Save(ms, ImageFormat.Jpeg);

    byte[] buffer = ms.ToArray();

    ClientLiveScreenSocket.Send(buffer, 0, buffer.Length, SocketFlags.None);
    Console.WriteLine("Send success " + buffer.Length + " kb");
    logFileWrite("Send success " + buffer.Length + " kb");
    Thread.Sleep(500);
    }
    catch(Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }

在图像发送之后(或之前),发送IPAddress的有线表示:

var wireFormat = sourceClientAddress.GetAddressBytes();

current.Send(wireFormat, 0, wireFormat.Length, SocketFlags.None);

在客户端,您只需接收这 4(16) 个字节并通过以下方式重建该地址:

// pseudo code
byte[] clientBytes = GetAccordingToMyProtocol();

//real code
var sourceClientAddress = new IPAddress(clientBytes);

因此,根据您的应用程序逻辑,任何序列的socket.Receivesocket.Send调用(在客户端和服务器端)都称为应用程序协议 通常,这些实体在大型代码库中成为独立的编程抽象。

更新

检查这个回购协议。 重构的空间很大,并且有一个错误——图像没有通过,但修复它是时间问题。

因此,ImageRetranslation 文件夹中有 3(4) 个项目,依次运行它们(我主要在调试模式下运行它们,我知道没有调试器可能会有错误,我知道):

  1. 重译服务器
  2. 重译接收器
  3. 并且只有一次(没有调试) - ImageSourceClient - 实际上将图像发送到服务器。

因此,尽管图像传输您请求的功能存在错误 - 传递 host:port 效果很好。

再见!

更新 2

错误已修复,回购是可行的 - 检查一下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM