Tworzenie archiwum

0

Witam. Poniżej zamieściłem kod serwera prostego komunikatora. Jest to aplikacja której kompletny kod znajduje sie tutajhttp://www.centrumxp.pl/dotNet/831,1,Komunikator_w_C.aspx
Chciałbym utworzyć swego rodzaju archiwum (coś na wzór tego z gadu-gadu) niestety nie wiem jak sie do tego zabrać :/

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;
using System.Net.Sockets;
using System.IO;
using komunikaty;

namespace Serwer
{
    public partial class frmSerwer : Form
    {
        private TcpListener listener = null; //nasłuchiwanie połączenia
        private TcpClient klient = null; //nasłuchiwanie klienta
        private bool czypolaczono = false;
        private BinaryReader r = null; //czytanie dancyh ze strumienia sieciowego
        private BinaryWriter w = null; //zapisywanie dancyh ze strumienia sieciowego
        
        public frmSerwer()
        {
            InitializeComponent();
        }

        public void wyswietl(RichTextBox o, string tekst) // dodaje tekst do okna tekstowego
        {
            o.Focus();
            o.AppendText(tekst);
            o.ScrollToCaret();
            txtWysylane.Focus();
        }

        private void Polaczenie_DoWork(object sender, DoWorkEventArgs e)
        {
            wyswietl(txtLog, "Czekam na połaczenie\n");
            listener = new TcpListener(int.Parse(txtPort.Text));
            listener.Start();
            while (!listener.Pending()) //Pętla przestanie się wykonywać, gdy klient zażąda połączenia lub użytkownik przerwie operację
             {
                if (this.Polaczenie.CancellationPending)
                {
                    if (klient != null) klient.Close();
                    listener.Stop();
                    czypolaczono = false;
                    cmdSluchaj.Text = "Czekaj na połączenie";
                    return;
                }
            }
            klient = listener.AcceptTcpClient(); //Tutaj akceptujemy klienta i odczytujemy dane przez niego wysyłane
            wyswietl(txtLog, "Zażądano połączenia\n");
            NetworkStream stream = klient.GetStream();
            w = new BinaryWriter(stream);
            r = new BinaryReader(stream);
            if (r.ReadString() == KomunikatyKlienta.Zadaj) //jeśli tak to akceptujemy połączenie i uruchamiamy kontrolkę Odbieranie
            {
                w.Write(KomunikatySerwera.OK);
                wyswietl(txtLog, "Połączono\n");
                czypolaczono = true;
                cmdWyslij.Enabled = true;
                Odbieranie.RunWorkerAsync();
            }
            else
            {
                wyswietl(txtLog, "Klient odrzucony\nRozlaczono\n");
                if (klient != null) klient.Close();
                listener.Stop();
                czypolaczono = false;
            }
        }

        private void Odbieranie_DoWork(object sender, DoWorkEventArgs e)
        {
            string tekst;
            while ((tekst = r.ReadString()) != KomunikatyKlienta.Rozlacz)
                wyswietl(txtOtrzymywane, "===== Rozmówca =====\n" + tekst + '\n');
            wyswietl(txtLog, "Rozlaczono\n");
            czypolaczono = false;
            klient.Close();
            listener.Stop();
            cmdSluchaj.Text = "Czekaj na połączenie";
        }

        private void cmdWyslij_Click(object sender, EventArgs e)
        {
            string tekst = txtWysylane.Text;
            if (tekst == "") { txtWysylane.Focus(); return; }
            if (tekst[tekst.Length - 1] == '\n')
                tekst = tekst.TrimEnd('\n');
            w.Write(tekst);
            wyswietl(txtOtrzymywane, "===== Ja =====\n" + tekst + '\n');
            txtWysylane.Text = "";
        }

        private void txtWysylane_KeyPress(object sender, KeyPressEventArgs e) 
        {
            if (cmdWyslij.Enabled && e.KeyChar == (char)13) cmdWyslij_Click(sender, e); //  Jeśli przycisk do wysyłania jest aktywny i został wciśnięty enter, to zostanie wywołana funkcja naciśnięcia klawisza cmdWyslij
        }

        private void cmdSluchaj_Click(object sender, EventArgs e)
        {
            if (cmdSluchaj.Text == "Czekaj na połączenie") //Jeśli na przycisku jest napisane "Czekaj na połączenie", to funkcja uruchomi kontrolkę Polaczenie
            {
                Polaczenie.RunWorkerAsync();
                cmdSluchaj.Text = "Rozłącz";  //na przycisku zmieni się napis tak, abyśmy po naciśnięciu "Czekaj na połączenie" mieli możliwość przerwania operacji i rozłączenia się
            }
            else
            {
                if (czypolaczono)
                {
                    w.Write(KomunikatySerwera.Rozlacz);
                    listener.Stop();
                    if (klient != null) klient.Close();
                    czypolaczono = false;
                }
                wyswietl(txtLog, "Rozlaczono\n");
                cmdWyslij.Enabled = false;
                cmdSluchaj.Text = "Czekaj na połączenie";
                cmdWyslij.Enabled = false;
                Polaczenie.CancelAsync();
                Odbieranie.CancelAsync();
            }
        }

        private void frmSerwer_FormClosed(object sender, FormClosedEventArgs e)// Kod ten będzie wywoływany przy zamykaniu programu (formy)
        {
            if (czypolaczono)
            {
                w.Write(KomunikatySerwera.Rozlacz);
                listener.Stop();
                if (klient != null) klient.Close();
                czypolaczono = false;
            }
            Polaczenie.CancelAsync();
            Odbieranie.CancelAsync();
        }
0

odpal MS Acces, zrób nową bazę danych
potem łączysz się z nią i jedziesz zapytaniami SQL
dla każdego usera zrób tabelę o kolumnach

ID - autonumeracja, może się przydać =]
Czas - string, bo chyba nie ma tam typu dla czasu
z kim się gada - string z IP czy jakaś nazwa
rozmowa - notatka/memo czy jak to się tam zwie, długi string, długość chyba 65535

zapodać kodzik co robi coś w z taką bazą?
=]

0

A nie da sie tego załatwić poprzez zapisywanie do pliku??
Jeśli to jedyna opcja to kodzik bardzo mile widziany ;]

0

Sposobów jest tyle ile sobie wymyślisz, ale użycie bazy w SQL'u jest wygodniejsze niż grzebanie po plikach według mnie, a baza z Accesa jest bez problemu obsługiwana przez .NET więc czemu nie skorzystać z takiej wygody, właśnie pisze FAQ o tym jak się połączyć z bazą.

O zapytaniach sQL poczytaj sobie o tu
MySQL w Delphi
nie ważne że Delph bo interesują Cię ( od teraz ) zapytania SQL a tam jest ładnie opisane =]

Artykuł powinien się pojawić za kilka minut =]

0

Ja bym zamiast Accessa polecił MS SQL Server Express. Jest wygodniejszy, potężniejszy i darmowszy.

0
Hass napisał(a)

Jest wygodniejszy, potężniejszy i darmowszy.

Fajne słowo ;)

Można też zrobić DataSeta w pamięci i zapisywać do pliku XML.

0

@Hass: Nie czytałeś całości lub jesteś fanatycznym zwolennikiem instalowania serwerów gdy ich nie trzeba =]

Tu chodzi o malutką bazę, która znajduje się tam gdzie program, plik Accesa nie dość że bez problemu może znajdować się tam gdzie program, to oferuje wygodne gmeranie przez SQL. Instalacja dodatkowego serwera odbierze sens używania SQL'a w tym przypadku =]

@somekind

O, ciekawe, ale chyba nie zrobisz w takim czymś zapytania które wybierze to co akurat jest potrzebne ?

PS. dokarm trochę zwierzaka bo schudł ostatnio =]

0
somekind napisał(a)

Można też zrobić DataSeta w pamięci i zapisywać do pliku XML.

Można. Tylko zanim się obejrzysz archiwa urosną, a Ty zechcesz dodać funkcję przeszukiwania. I skończysz pisząc upośledzoną i mniej wydajną wersję bazy danych :)

Potwoor_ napisał(a)

@Hass: Nie czytałeś całości lub jesteś fanatycznym zwolennikiem instalowania serwerów gdy ich nie trzeba =]

Tu chodzi o malutką bazę, która znajduje się tam gdzie program, plik Accesa nie dość że bez problemu może znajdować się tam gdzie program, to oferuje wygodne gmeranie przez SQL. Instalacja dodatkowego serwera odbierze sens używania SQL'a w tym przypadku =]

Nie jestem fanatycznym zwolennikiem instalowania serwerów. Już prędzej fanatycznym wrogiem Accessa:)
Jak Express jest zbyt ciężki, to można użyć np. SQL Lite, albo MS SQL Server CE - oba trzymają bazę w jednym pliku i nie wymagają instalacji. Access jest zły.

0

Muahaha! Byłem pierwszy =]

@Acces to zuo : Zależy do czego =] Tu akurat jest w sam raz, wygodna do zrobienia baza siedząca w jednym pliku. Nie chodzi o to że jakiś tam serwer jest ciężki tylko o moją niechęć do instalowania czegoś większego od programu żeby ten program działał ( nie krzyczeć ze .NET jest takim czymś bo powiem że on się przyda do wielu rzeczy a ten serwer jest potrzebny do tego jedynego programiku ) Jeśli program ważyłby kilkadziesiąt MB, baza rosła do ogromnych rozmiarów to czemu nie, jakiś porządny serwer byłby miły.

0

A jak zrobić, żeby logi wyświetlane w txtLog zapisywał mi w pliku txt z godzina i datą wyświetlenia ??

1 użytkowników online, w tym zalogowanych: 0, gości: 1