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();
}