我在做聊天室
---------服务器端-----------
 udpClient.Send(bys, bys.Length, msgArray[1], ipPort);//发送消息内容()--参数是,(数组,数组的长度,发送给某个ip地址,端口号)
 udpClient.Send(getSer(dic), getSer(dic).Length, ipPoint);//在服务器上 将所有在线用户的ip和端口号 发送给每一个用户...---这是在服务器的一个 序列化的方法----
        /// <summary>
        /// 序列化成字节数组
        /// </summary>
        /// <param name="dic">字符数组</param>
        /// <returns></returns>
        private byte[] getSer(Dictionary<IPAddress, int> dic)
        {
            IFormatter ifor = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            ifor.Serialize(ms, dic);
            return ms.ToArray();
        }---------请问我在客户端应该怎么接收呢-------
rec = udpClient.Receive(ref ipPoint);//如果我这样接收的话,那就把所有的都接收过来了,可是我是想内容接收放一起, 服务器发送过来的ip 放在一起,请大家帮帮我,我在线等 ,如果会的兄弟方便的话,加我QQ好吗?(411123129)谢谢..

解决方案 »

  1.   

    我这是 做连续2次发送的,
    udpClient.Send(bys, bys.Length, msgArray[1], ipPort);//发送消息内容()--参数是,(数组,数组的长度,发送给某个ip地址,端口号)
     udpClient.Send(getSer(dic), getSer(dic).Length, ipPoint);//在服务器上 将所有在线用户的ip和端口号 发送给每一个用户...那应该怎么接收呢.......
      

  2.   

    这是我以前写的,参考一下
    public static void ReceiveFile(object obj)
            {
                while (true)
                {
                    clientSock = receiveSock.Accept();
                    Console.WriteLine("{0} 已与服务端Socket连接成功...", DateTime.Now.ToString("yy-MM-dd HH:mm:ss:mss"));
                    while (true)
                    {
                        try
                        {
                            byte[] clientData = new byte[1024 * 5000];
                            int receivedBytesLen = clientSock.Receive(clientData);
                            int fileNameLen = BitConverter.ToInt32(clientData, 0);
                            int modelLen = BitConverter.ToInt32(clientData, 4);                        string fileName = Encoding.UTF8.GetString(clientData, 8, fileNameLen);                        byte[] mmsModelByte = new byte[modelLen];
                            
                            int modelLenStart = 8 + fileNameLen;
                            for (int i = 0; i < modelLen; i++)
                            {
                                mmsModelByte[i] = clientData[modelLenStart + i];
                            }                        BinaryFormatter formatter = new BinaryFormatter();
                            MemoryStream stream = new MemoryStream(mmsModelByte);
                            T_colormessage_set mmsFile = (T_colormessage_set)formatter.Deserialize(stream);
                            if (mmsFile == null)
                            {
                                throw new Exception("转为实体T_colormessage_set失败!");
                            }
                            if (!System.IO.File.Exists(fileName))
                            {
                                BinaryWriter bWrite = new BinaryWriter(File.Open(msgPathprefix + fileName, FileMode.Create));
                                bWrite.Write(clientData, 8 + fileNameLen + modelLen, receivedBytesLen - 8 - fileNameLen - modelLen);
                                bWrite.Close();
                            }                        if (msgBLl.Update(mmsFile) > 0)
                            {
                                Console.WriteLine("{0} 文件{1}接收成功!", DateTime.Now.ToString("yy-MM-dd HH:mm:ss:mss"), mmsFile.file_name);
                            }
                            else
                            {
                                Console.WriteLine("{0} 文件{1}接收失败!", DateTime.Now.ToString("yy-MM-dd HH:mm:ss:mss"), mmsFile.file_name);
                                EventsLog.Log.Error(string.Format("{0} 文件{1}接收失败!", DateTime.Now.ToString("yy-MM-dd HH:mm:ss:mss"), mmsFile.file_name));
                                EventsLog.Log.Error(mmsFile.ToString());
                            }                    }
                        catch (Exception ex)
                        {
                            Console.WriteLine("客户端接收文件出错或服务端Socket已关闭,关闭Socket");
                            EventsLog.Log.Error("客户端接收文件出错或服务端Socket已关闭,关闭Socket");
                            Console.WriteLine();
                            EventsLog.Log.Error(ex.Message);
                            EventsLog.Log.Error(ex.StackTrace);
                            clientSock.Close();
                            clientSock = null;
                            break;
                        }
                    }
                }
            }        public static void SendFile(object source, System.Timers.ElapsedEventArgs e)
            {
                try
                {
                    T_file_fj fileModel = fileBLL.GetOneModel();
                    if (fileModel == null)
                    {
                        return;
                    }
                    string fileName;
                    if (fileModel.file_path.ToLower().EndsWith(".wav"))
                    {
                        fileName = soundPathProfix + fileModel.file_path;
                    }
                    else
                    {
                        fileName = oldFilePathProfix + fileModel.file_path;
                    }
                    if (!System.IO.File.Exists(fileName))
                    {
                        Console.WriteLine("{0} 客户端要发送的文件不存在,要发送的文件为:{1}", DateTime.Now.ToString("yy-MM-dd HH:mm:ss:mss"), fileName);
                        throw new Exception(string.Format("{0} 客户端要发送的文件不存在,要发送的文件为:{1}", DateTime.Now.ToString("yy-MM-dd HH:mm:ss:mss"),fileName));
                    }
                    string filePath = string.Empty;                fileName = fileName.Replace("\\", "/");
                    while (fileName.IndexOf("/") > -1)
                    {
                        filePath += fileName.Substring(0, fileName.IndexOf("/") + 1);
                        fileName = fileName.Substring(fileName.IndexOf("/") + 1);
                    }                //byte[] fileNameByte = Encoding.ASCII.GetBytes(fileName);
                    byte[] fileNameByte = Encoding.UTF8.GetBytes(fileName);
                    if (fileNameByte.Length > 850 * 1024)
                    {
                        Console.WriteLine("File size is more than 850kb, please try with small file.");
                        EventsLog.Log.Error("File size is more than 850kb, please try with small file.");
                        return;
                    }
                    byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);                byte[] fileData = File.ReadAllBytes(filePath + fileName);                fileModel.upload_flag = "1";
                    MemoryStream stream = new MemoryStream();
                    IFormatter formatter = new BinaryFormatter();
                    formatter.Serialize(stream, fileModel);
                    stream.Flush();
                    byte[] modelData = stream.ToArray();
                    byte[] modelLen = BitConverter.GetBytes(modelData.Length);                byte[] clientData = new byte[8 + fileNameByte.Length + modelData.Length + fileData.Length];                fileNameLen.CopyTo(clientData, 0);
                    modelLen.CopyTo(clientData, 4);
                    fileNameByte.CopyTo(clientData, 8);
                    modelData.CopyTo(clientData, 8 + fileNameByte.Length);
                    fileData.CopyTo(clientData, 8 + fileNameByte.Length + modelData.Length);                sendSock.Send(clientData);
                    Console.WriteLine("{0} 客户端文件:{1}发送成功!", DateTime.Now.ToString("yy-MM-dd HH:mm:ss:mss"), fileName);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("客户端发送文件出错");
                    EventsLog.Log.Error("客户器端发送文件出错");
                    EventsLog.Log.Error(ex.Message);
                    if ("远程主机强迫关闭了一个现有的连接。".EndsWith(ex.Message))
                    {
                        if (senderTimer != null)
                        {
                            Console.WriteLine();
                            Console.WriteLine();
                            EventsLog.Log.Error("客户端接收文件的Socket已关闭");
                            Console.WriteLine();
                            Console.WriteLine();
                            senderTimer.Close();
                        }
                    }
                    EventsLog.Log.Error(ex.StackTrace);
                }
            }你设置一个数组,记录下哪几位记录什么,解释的时候先取出哪几位到哪几位记录什么内容,再解释出来