Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2015, 02:19   #1
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию Десереализцаия

Делаю клиент серверный чат.
Есть два отдельных проекта: клиент и сервер.

Есть класс Message описывающий сообщение. Он подключается к проектам как DLL.

вот сторона клиента:
Код:
 IPEndPoint ipep = new IPEndPoint(Dns.GetHostEntry("localhost").AddressList[0], 9999);
            Socket client = new Socket(ipep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            client.Connect(Dns.GetHostEntry("localhost").AddressList[0], 9999);
            if (!client.Connected) this.Close();
            ns = new NetworkStream(client);
            b.Serialize(ns, new MyMessage(LogText.Text, PassText.Text));
Вот сервер:

Код:
public Connection(Socket s)
        {
            System.Console.WriteLine("Попытка подключиться с IP: " + s.RemoteEndPoint.AddressFamily);
            notConnected = false;
            this.s = s;
            ns = new NetworkStream(s);
            MyMessage msg = (MyMessage)b.Deserialize(ns);
В строке где объект десериализуется выскакивает ексцепшен:

Цитата:
Ошибка при синтаксическом анализе: отсутствует сборка, связанная с XML-ключом a1:http://schemas.microsoft.com/clr/nsa...eyToken%3Dnull Message
tolikprankster вне форума Ответить с цитированием
Старый 29.06.2015, 11:20   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Ругается на отсутствие Chat.dll на принимающей стороне
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 29.06.2015, 15:13   #3
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

Добавил полностью всю сторону клиента как Dll библиотеку - не помогло. Все свойства в сериализуемом классе сделал паблик с гетерами и сетерами.

в итоге все равно в строке десериализации выскакивает ексцепшен:
Цитата:
В документе XML (1, 2) присутствует ошибка.
Может кто-то делал подобные вещи, посоветуйте как реализовать сериализацию.

П.С. делал раньше на джава подобное - никаких проблем с сериализацией не возникало... Неужели в C# нет простого способа сериализации чтоб не парить себе мозг?
tolikprankster вне форума Ответить с цитированием
Старый 29.06.2015, 16:30   #4
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Не знаю как на яве, а в шарпе все очень просто с сериализацией
При сериализации вы еще неймспейс указываете, а при обратном процессе - нет
Да и вообще, гадание на огрызке самописанного кода результата не даст
Нужно больше деталей
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 29.06.2015, 17:11   #5
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

Вот полная сторона клиента:

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using ChatUtil;

namespace Chat
{
    public partial class RegistrationForm : Form
    {
        public RegistrationForm()
        {
            InitializeComponent();
            
        }

        private void ClientForm_Load(object sender, EventArgs e)
        {
            
        }

        private void login_Click(object sender, EventArgs e)
        {
            IPEndPoint ipep = new IPEndPoint(Dns.GetHostEntry("localhost").AddressList[0], 2000);
            Socket client = new Socket(ipep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            client.Connect(Dns.GetHostEntry("localhost").AddressList[0], 2000);
            if (!client.Connected) this.Close();
            ns = new NetworkStream(client);
            b.Serialize(ns, new MyMessage(LogText.Text, PassText.Text));
        }
    }
}
Ниже продолжение

Последний раз редактировалось tolikprankster; 29.06.2015 в 17:15.
tolikprankster вне форума Ответить с цитированием
Старый 29.06.2015, 17:12   #6
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

Файл FormDesigner(клиент)

Код:
using System.Net.Sockets;
using ChatUtil;
using System.Runtime.Serialization.Formatters.Binary;

namespace Chat
{
    partial class RegistrationForm
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            ////

        }

        #endregion

        private BinaryFormatter b = new BinaryFormatter();
        private NetworkStream ns;
        private System.Windows.Forms.TextBox LogText;
        private System.Windows.Forms.TextBox PassText;
        private System.Windows.Forms.Label labelLog;
        private System.Windows.Forms.Label labelPass;
        private System.Windows.Forms.Button SignIn;
        private System.Windows.Forms.Button SignUp;
    }
}

Последний раз редактировалось tolikprankster; 29.06.2015 в 17:14.
tolikprankster вне форума Ответить с цитированием
Старый 29.06.2015, 17:12   #7
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

А вот СЕРВЕРНАЯ ЧАСТЬ:
Код:
using System;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;


namespace ConsoleApplication1
{
    class Server
    {
        static bool alreadyExist = false;
        static void Main(string[] args)
        {
            
            IPEndPoint ipep = new IPEndPoint(Dns.GetHostEntry("localhost").AddressList[0], 2000);
            TcpListener server = new TcpListener(ipep);
            
            List<Connection> connections = new List<Connection>();
            server.Start();
            while (true)
            {
                alreadyExist = false;
                Socket s = server.AcceptSocket();
                foreach (Connection c in connections)
                    if (c.s.RemoteEndPoint == s.RemoteEndPoint)
                        alreadyExist = true;
                if(!alreadyExist) 
                    connections.Add(new Connection(s));
                /*foreach (Connection c in connections)
                {
                    if (c.notConnected)
                        connections.Remove(c);
                }*/
            }
        }
    }
}
Код:
using System;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary;
using ChatUtil;
using Chat;

namespace ConsoleApplication1
{
    class Connection
    {
        public Socket s {get; private set;}
        List<Connection> connections;
        NetworkStream ns;
        BinaryFormatter b = new BinaryFormatter();
        byte[] buffer = new byte[1024];
        public bool notConnected { get; private set; }

        public Connection(Socket s)
        {
            System.Console.WriteLine("Попытка подключиться с IP: " + s.RemoteEndPoint);
            notConnected = false;
            this.s = s;
            ns = new NetworkStream(s);
            MyMessage msg = (MyMessage)b.Deserialize(ns);
            if (msg.type == MessageType.SignIn)
            {
                if (msg.login == "name")
                {
                    System.Console.WriteLine("Подключено!");
                }
                else
                {
                    notConnected = true;
                }
                Thread t = new Thread(this.Listen);
                t.Start();
            }
            
           
        }
        public void Listen()
        {
            while (true)
            {
                Thread.Sleep(200);
                lock (ns)
                {
                    ns.Read(buffer, 0, buffer.Length);
                }
            }
        }
        public void setConnectionsList(List<Connection> a)
        {
            connections = a;
        }
    }
}
tolikprankster вне форума Ответить с цитированием
Старый 29.06.2015, 17:13   #8
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

Вот Класс описывающий сообщение, подключается как DLL:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ChatUtil
{
    public enum MessageType
    {
        SignIn, SignUp, Standart
    }
    [Serializable]
    public class MyMessage
    {
        public string text;
        public string password { get;  set; }
        public string login { get;  set; }
        public MessageType type { get; set; }
        public MyMessage(string login, string text, MessageType type)
        {
            this.login = login;
            this.type = type;
            this.text = text;
            this.password = " ";
        }
        public MyMessage(string login, string password)
        {
            this.login = login;
            this.password = password;
            this.type = MessageType.SignIn;
            this.text = " ";
        }
        public MyMessage()
        {
            this.login = null;
            this.password = null;
            this.type = MessageType.SignIn;
            this.text = null;
        }
    }
}
tolikprankster вне форума Ответить с цитированием
Старый 29.06.2015, 17:17   #9
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

Причем пробовал через SOAP, XML, BinaryFormatter - никак не получается чтоб работало
tolikprankster вне форума Ответить с цитированием
Старый 01.07.2015, 07:49   #10
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию УДАЛИТЬ!

Удалите тему.
tolikprankster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц