PDA

View Full Version : سوال: تفاوت کد تحت کنسول و تحت فرم چیست؟کاربرد xml چیست؟



shahriar.shahrashoob
شنبه 06 فروردین 1390, 00:04 صبح
با سلام و عرض ادب
میبخشید سوالی داشتم درباره برنامه نویسی سیشارپ تحت شبکه.خیلی لطف میکنید اگه پاسخ بدید.
دارم برنامه ی برگزاری آزمون تحت شبکه مینویسم.روند این برنامه این گونه است که سوالات از دیتابیس سروربه دست من برنامه نویس میرسه و بنده باید این سوالات رو در فرمی که کاربر مشاهده میکند، نمایش بدم و کاربر اونها را جواب بده.سوالات میتونه تستی تشریحی و یا ترسیمی با پینت باشه.بعد از پاسخ کاربر جوابها توسط من برنامه نویس برای سرور ارسال میشه تا در سرور عمل قضاوت بشه یا بهتر بگم جوابها صحیح بشه و نمره محاسبه بشه و مجددا کارنامه برای کاربر ارسال بشه.
سوال اول:طبق دستور العمل ما،تاریخ برگزاری امتحان و نام امتحان و زمان امتحان و تمامی سوالات بایستی از سرور برای من ارسال شود تا من در فرم اصلی برنامه جهت نمایش استفاده کنم.از دوستی شنیدم که ارسال این اطلاعات بوسیله زبان xml بواسطه تگ بندی این زبان و ارتباط با سیشارپ قابل حصوله.ولی من xmlبلد نیستم.چه راهی رو بهم پیشنهاد میکنید؟چطور میتونم تاریخ برگزاری امتحان و نام امتحان و زمان امتحان و تمامی سوالات را ارسال کنم بطوریکه سوالات پس از پاسخ دادن کاربر،یکی یکی عوض شود؟
سوال دوم:کدی دارم که ارتباط بین سرور و کلاینت را برقرار میکند.اما این کد تحت کنسول نوشته شده.اساسا چه تفاوتی بین کد تحت کنسول و تحت فرم ویندوزی وجود داره؟آیا میشه از کد تحت کنسول در پشت فرم ویندوزی استفاده کرد؟برای بررسی و درک بهتر سوالم،دو کد ارسال اطلاعات از سرور به کلاینت و بالعکس را در زیر میگذارم:
منت میگذارید اگه کامل راهنماییم کنید . . .

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net.Sockets;


namespace TCPEchoClient
{
class Program
{
static void Main(string[] args)
{
TcpClient client = null;
NetworkStream netStream = null;


try
{
// create socket that is connected to server on specified port
client = new TcpClient("127.0.0.1", 8000);
netStream = client.GetStream();


byte[] byteBuffer = Encoding.ASCII.GetBytes("Hello Server!");


// send the encoded string to the server
netStream.Write(byteBuffer, 0, byteBuffer.Length);
Console.WriteLine(byteBuffer.Length + " bytes sent to server.");


int totalBytesRcvd = 0; // total bytes received so far
int byteRcvd = 0; // bytes received in last read


// receive the same string back from the server
while (totalBytesRcvd < byteBuffer.Length)
{
if ((byteRcvd = netStream.Read(byteBuffer,
totalBytesRcvd,
byteBuffer.Length - totalBytesRcvd))== 0)
{
Console.WriteLine("Connection closed.");
break;
} // end if


totalBytesRcvd += byteRcvd;
} // end while


Console.WriteLine(byteBuffer.Length +
" bytes received from server >>> " +
Encoding.ASCII.GetString(byteBuffer, 0, byteBuffer.Length));
} // end try


catch (Exception err)
{
Console.WriteLine(err.ToString());
} // end catch


finally
{
netStream.Close();
client.Close();
Console.ReadKey();
} // end finally


} // end method main


} // end class program
}
همچنین:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;


namespace TCPEchoServer
{
class Program
{
static void Main(string[] args)
{
byte[] byteBuffer = new byte[32]; // receive buffer
TcpListener listener = null;


try
{
// create a TcpListener to accept client connections
listener = new TcpListener(IPAddress.Any, 8000);
listener.Start();
}
// exit program, if server can not use port number 8000
catch (Exception err)
{
Console.WriteLine(err.ToString());
Environment.Exit(0);
}


int byteRcvd = 0; // received byte count


// run forever, accepting and servicing connections
for (; ; )
{
TcpClient client = null; // for each client connection
NetworkStream netStream = null; // for each connection stream


Console.WriteLine("Waiting for connections...");


try
{
client = listener.AcceptTcpClient(); // get client connection
netStream = client.GetStream(); // get connection stream


Console.WriteLine("Handling client...");


// receive until client closes connection, indicated by 0 return value
int totalByteRcvd = 0;
while ((byteRcvd = netStream.Read(byteBuffer, totalByteRcvd,
byteBuffer.Length - totalByteRcvd)) > 0)
{
netStream.Write(byteBuffer, 0, byteRcvd);
totalByteRcvd += byteRcvd;
} // end while


Console.WriteLine(totalByteRcvd + " bytes received from client >>> " +
Encoding.ASCII.GetString(byteBuffer) + "\r\n");


// close the stream and socket. we are done with this client!
netStream.Close();
client.Close();
} // end try


catch (Exception err)
{
Console.WriteLine(err.ToString());
netStream.Close();
} // end catch


} // end for(;;)


} // end main method
} // end class program
}

hjran abdpor
شنبه 06 فروردین 1390, 00:37 صبح
با سلام.

پاسخ سوال اول شما : شما ميتونيد از Sql server نيز استفاده كنيد براي ارسال سوال ها به كلاينته به روش استاتيك .
عوض كردن سوالها نيز كه خيلي اسونه ( بعد از اينكه جواب سوال اولي داده شد يا معلوم شد سوال دومي را به صورت رندم بين كلاينت ها نشان بده و ......)

دوست عزيز تحت كنسول ديگه خبري از اشيايي ويژوالي خبر نيست و ......
ولي تحت ويندوز خيلي كار شما اسون ميشه و خيلي هم كارپسند و ................. است .

براي ياد گيري xml برو به قسمت xml همين سايت.

با تشكر..........................

shahriar.shahrashoob
شنبه 06 فروردین 1390, 12:23 عصر
دوست گرامی با تبریک سال نو، از راهنماییتون خیلی ممنونم.میشه منت بگذارید و درباره ارسال سوال ها به كلاينته به روش استاتيك تحت sql server برام بیشتر توضیح بدید که مکانیسم و مراحل کارچیه؟
همچنین رندوم بندی نمایش سوالات توسط sql server.میدونید میخوام بعد از پاسخگویی به هر سوال،سوال بعدی اتوماتیک نمایش داده بشه که دیگه کد select نخوام بنویسم برای هر سوال.اینطور که شما میفرمایید برای نمایش تاریخ امتحانوزمانش میشه از sql server نیز استفاده کرد.نه؟
خیلی لطف میکنید اگه راهنماییم کنید...

ahrimaneahurai
یک شنبه 07 فروردین 1390, 00:05 صبح
شما می تونید مثلا 100 تا سوال رو بریزید توی یه دیتاتیبل یا دیتاست و از بین اونها سوالات رو رندوم به کاربر نشون بدید. نمیدونم چندتا کاربر همزمان میخوان وصل شن به سرور اما فک نکنم سرور کم بیاره که نگرانید و می خواید با xml کار کنید.
سوال هم چه تشریحی باشه چه تستی چه ترسیمی شما می تونید یه دکمه بذارید به عنوان سوال بعد و وقتی کاربر این دکمه رو زد سوال بعدی نمایش داده شه. اگه هم سوالات زمان بیندی داره که با تایمر میبرید سوال بعد. برای نمایش امتخان که توی خود برنامه می تونید با استفاده از datetime.now تاریخ و زمان همون لحظه رو بگیرید

shahriar.shahrashoob
یک شنبه 07 فروردین 1390, 10:05 صبح
ممنون ولی مشکل مین رندوم نشون دادن سوالاته.
راستی تفاوتی درکد سوکت پروگرمینگ وقتی کلاینتهامون بیشتر از یکی ان،وجود داره؟

hjran abdpor
یک شنبه 07 فروردین 1390, 12:48 عصر
دوست عزيز سوالات را داخل يه ديتاتيبيل يا ديتاست ميتونيد بريزد وبعد يا استفاده از كلاس رندم (Random) به تعداد كلاينت ها سوال ارسال كني !!!!!!!!!!!!!

ahrimaneahurai
یک شنبه 07 فروردین 1390, 13:02 عصر
شما چرا انقدر سخت میگیری و سوالای خودتو میپیچونی.این برنامه راحت تر از اونه که فکرش رو بکنی
نیاز به سوکت نیست.
با تابع رندوم و دادن کمترین و بیشترین که شماره سوال هست یه سوال انتخاب میشه اطلاعات اون سوال رو از سرور میکشی بیرون به کاربر نشون میدی