Javljam se posle dužeg vremena sa konkretnim problemom. A pre svega hvala Dušane što ste se javili!
Sve vreme sam bunario po internetu i pokušavao svašta. Uspeo sam da razmenjujem poruke između servera i klijenta, što je i deo zadatka koji moram da uradim. Da ne dužim dalje, moja aplikacija treba da obezbedi razmenu poruka (sada) i glasa (kasnije) između 2 korisnika i to sve treba da ide preko servera. Ja sam za sada uspeo da napravim aplikaciju koja to radi, ali server salje poruke svim korisnicima, što trenutno zadovoljava, bitno mi je da radi. Posebno imam program koji ubacuje klijente u bazu, i tamo sve radi, a njega ću implementirati u program trenutnog servera.
Aplikacija klijenta ima 2 forme, jednu za logovanje i drugu za chat-ovanje. Sada hoću da na formi logovanja upišem ime i lozinku (a bilo je ime i ip servera) i to proveravam u bazi servera.
Aplikaciju koju sam napravio sam našao na netu, i modifikovao je za moje potrebe. Ona je u sebi imala sve što mi je trebalo, što se tiče razmenjivanja podataka. Ja sada hoći da ubacim i još jedan podatak, a to je šifra, i tu je problem. Pokušao sam sve analogijom u odnosu na izvorni program da uradim, međutim nikako da uspem.
Postovaću delove koda koji mislim da se odnose na definisanje podatka koji želim da šaljem.
Ovo je deo koda aplikacije klijenta u formi logovanja
Code:
private void btnOK_Click(object sender, EventArgs e)
{
strime = txtime.Text;
strsifra = txtsifra.Text;
try
{
//Using UDP sockets
clientSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
//IP address of the server machine
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
//Server is listening on port 1000
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 1000);
epServer = (EndPoint)ipEndPoint;
Data msgSlanje = new Data();
msgSlanje.cmdKomanda = Command.Logovanje;
msgSlanje.strPoruka = null;
msgSlanje.strIme = strime;
msgSlanje.strSifra = strsifra;
byte[] byteData = msgSlanje.ToByte();
//Login to the server
clientSocket.BeginSendTo(byteData, 0, byteData.Length,
SocketFlags.None, epServer, new AsyncCallback(OnSend), null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "SGSclient",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Ovo je deo na serveru gde sam stavio da ispiše šifru samo pored imena, da znam da je poslata
Code:
msgSlanje .cmdKomanda = msgPrimljena .cmdKomanda ;
msgSlanje .strIme = msgPrimljena .strIme;
msgSlanje.strSifra = msgPrimljena.strSifra;
switch (msgPrimljena .cmdKomanda)
{
case Command .Logovanje :
//Kada se korisnik loguje dodajemo ga na listu klijenata
KlijentInfo klijentInfo = new KlijentInfo ();
klijentInfo.endpoint = epPosaljilac ;
klijentInfo .strIme = msgPrimljena .strIme;
klijentInfo.strSifra = msgPrimljena.strSifra;
klijentiLista.Add (klijentInfo );
//textBox1.Text = msgPrimljena.strSifra;
msgSlanje .strPoruka = "<<<" + msgPrimljena .strIme + msgPrimljena .strSifra + " se logovao >>>";
break ;
A ovde mislim da je možda i problem, kod ove klase za formiranje poruke za slanje i primanje, koja je naravno ista i kod servera i kod klijenta
Code:
class Data
{
public string strIme; //Ime logovanog korisnika
public string strPoruka; //Poruka korisnka
public string strSifra;
public Command cmdKomanda; //Tip komande (definisano u enum na pocetku)
public Data()
{
this.cmdKomanda = Command .Null ;
this .strIme = null ;
this .strPoruka = null ;
this.strSifra = null;
}
public Data(byte [] data) //Konvertovanje bajta u objekat tipa bajt
{
//Prva 4 bajta su za komandu
this.cmdKomanda = (Command)BitConverter.ToInt32(data, 0);
//Sledeca 4 su za cuvanje duzine imena
int imeDuzina = BitConverter.ToInt32(data, 4);
//Sledeca 4 su za cuvanje duzine poruke
int msgDuzina = BitConverter.ToInt32(data, 8);
//Sledeca 4 za sifru
int sifraDuzina = BitConverter.ToInt32(data, 12);
//Provera da li je i me prebaceno u niz
if (imeDuzina > 0)
this.strIme = Encoding.UTF8.GetString(data, 16, imeDuzina );
else
this.strIme = null;
//Provera da poruke nije null
if (msgDuzina > 0)
this.strPoruka = Encoding.UTF8.GetString(data, 16 + imeDuzina , msgDuzina );
else
this.strPoruka = null;
if (sifraDuzina > 0)
this.strPoruka = Encoding.UTF8.GetString(data, 16 + imeDuzina + msgDuzina , sifraDuzina );
else
this.strSifra = null;
}
public byte[] ToByte() //Konvertovanje Data strukture u niz bajtova
{
List<byte> rezultat = new List<byte>();
//Prva 4 za komandu
rezultat.AddRange(BitConverter.GetBytes((int)cmdKomanda ));
//Dodavanje duzine imena
if (strIme != null)
rezultat.AddRange(BitConverter.GetBytes(strIme.Length));
else
rezultat.AddRange(BitConverter.GetBytes(0));
//Duzina poruke
if (strPoruka != null)
rezultat.AddRange(BitConverter.GetBytes(strPoruka.Length));
else
rezultat.AddRange(BitConverter.GetBytes(0));
//Duzina sifre
if (strSifra != null)
rezultat.AddRange(BitConverter.GetBytes(strSifra.Length));
else
rezultat.AddRange(BitConverter .GetBytes (0));
//Dodavanje imena
if (strIme != null)
rezultat.AddRange(Encoding.UTF8.GetBytes(strIme));
//Dodavanje poruke u obliku niya bajtova
if (strPoruka != null)
rezultat.AddRange(Encoding.UTF8.GetBytes(strPoruka));
if (strSifra != null)
rezultat.AddRange(Encoding .UTF8 .GetBytes (strSifra ));
return rezultat.ToArray();
}
}
Hvala svima puno unapred na pomoći i nadam se da nisam bio predugačak...