[c#] סוקטים - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

[c#] סוקטים


-LosNir-

Recommended Posts

ניראה לי הבנתי ויש לי גם דוגמא :)

ה main הוא כמו עורק ראשי, התראדים הם כמו ורידים, נכון?

בכ"מ, עוד לא הצלחתי לעשות את ה Listen :nixweiss:

עריכה:

אוקי הצלחתי לעשות ת'ראד חדש אבל יש לי בעיה לגשת למשתנה server:


public void ListenStart()
{
// Set status
lbl_Statusvalue.Text = "Initializing...";

// Set the TcpListener
Int32 port = 12500;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");

// TcpListener server = new TcpListener(port);
TcpListener server = null;
server = new TcpListener(localAddr, port);

// Start TcpListener and change status
lbl_Statusvalue.Text = "Ready.";
server.Start();

Thread getReqTh = new Thread(new ThreadStart(GetReq));
}

public static void GetReq()
{
TcpClient client = server.AcceptTcpClient();
}

אני פשוט עוד לא כ"כ הבנתי את הקטע של public static void וכל השאר.. ז"א, איך הדבר הזה נקרא בכלל?


public void Bla()
{
}

ומה static עושה? =\ סליחה על השאלות חח

קישור לתוכן
שתף באתרים אחרים

  • תגובות 35
  • נוצר
  • תגובה אחרונה

הייתה לי טעות בקוד, נערך


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

namespace ConsoleApplication1
{
class Program
{
static bool listen = true; // when you change this to false the thread will stop listening
static TcpListener listener;
static List<TcpClient> clients = new List<TcpClient>();
static void Main(string[] args)
{
IPAddress localIp = Dns.GetHostAddresses(Dns.GetHostName())[0];// this line gives you the localIP
IPEndPoint localHost = new IPEndPoint(localIp, 12500);// sets local host end point
listener = new TcpListener(localHost);//sets the listener
listener.Start();// starts listening
Listen();
while (listen)
listen = true;
Console.WriteLine("host closing");
}

private static void Listen()
{
listener.BeginAcceptTcpClient(new AsyncCallback(doWhatever), listener);
}

private static void doWhatever(IAsyncResult iar)// async operation to connect the tcpClient
{
TcpListener listener = (TcpListener)iar.AsyncState;// gets the listener
TcpClient client = listener.EndAcceptTcpClient(iar);// gets the tcpClient from the listener
clients.Add(client);// adds client to client list
Console.WriteLine("host: connection made");
Listen();

}
}
}

קישור לתוכן
שתף באתרים אחרים

ניראה לי הבנתי ויש לי גם דוגמא :)

ה main הוא כמו עורק ראשי, התראדים הם כמו ורידים, נכון?

בכ"מ, עוד לא הצלחתי לעשות את ה Listen :nixweiss:

עריכה:

אוקי הצלחתי לעשות ת'ראד חדש אבל יש לי בעיה לגשת למשתנה server:


public void ListenStart()
{
// Set status
lbl_Statusvalue.Text = "Initializing...";

// Set the TcpListener
Int32 port = 12500;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");

// TcpListener server = new TcpListener(port);
TcpListener server = null;
server = new TcpListener(localAddr, port);

// Start TcpListener and change status
lbl_Statusvalue.Text = "Ready.";
server.Start();

Thread getReqTh = new Thread(new ThreadStart(GetReq));
}

public static void GetReq()
{
TcpClient client = server.AcceptTcpClient();
}

אני פשוט עוד לא כ"כ הבנתי את הקטע של public static void וכל השאר.. ז"א, איך הדבר הזה נקרא בכלל?


public void Bla()
{
}

ומה static עושה? =\ סליחה על השאלות חח

1) תגדיר את המשתנה SERVER במחלקה, ולא בתוך הפונקציה. כך כל הפונקציות יכירו את המשתנה, ולא רק אחת.

2) לא התחלת את התראד שיצרת.

3) צריך להפריד בין משתנה סטטי למתודה סטטית. משתנה סטטי, לעומת משתנה שהוא לא סטטי משוייך לכל המחלקה, ולא לאובייקט מסוג המחלקה. מתודה סטטית היא כמו כל מתודה רגילה, אך בשונה ממנה היא יכולה להשתמש רק במשתנים סטטים.

קישור לתוכן
שתף באתרים אחרים

ניסיתי להריץ את הקוד ש Saard נתן לי,

והתוכנה לוקחת 170K מהזכרון וזה ממשיך לעלות :-X

עריכה:

טוב הצלחתי לעשות Listen בשרת, והצלחתי לשלוח socket בקליינט.

איך אני עכשיו גורם לקליינט גם כן להיות במצב listen?

עריכה:

לא משנה :)

תודה לכם.. אני עוד מעט אראה את מה שבניתי :)

קישור לתוכן
שתף באתרים אחרים

גם אני ניסיתי לעשות כמו שהוא עשה.. הבעיה שזה לא עובד לי :-\

עריכה:

אני משתפר :)

גילתי את הבעיה, עשיתי ככה:


// Listen loop
while (StopTH)
{
MessageBox.Show("Runnging.");
}

וזה באמת עבד, כששיניתי את המשתנה ל false זה הפסיק.. אבל שהחזרתי, זה לא חזר שוב.

שברתי ת'ראש שעה וחצי! ועכשיו אני קולט שברגע שהלולאה מקבלת false מבחינת הקוד נגמר והיא לא בודקת שוב ל true :)

אז עשיתי בפנים עוד לולאה, ככה:


while (true)
{
// Listen loop
while (StopTH)
{
MessageBox.Show("Runnging.");
}
}

קישור לתוכן
שתף באתרים אחרים

1) תגדיר את המשתנה SERVER במחלקה, ולא בתוך הפונקציה. כך כל הפונקציות יכירו את המשתנה, ולא רק אחת.

2) לא התחלת את התראד שיצרת.

3) צריך להפריד בין משתנה סטטי למתודה סטטית. משתנה סטטי, לעומת משתנה שהוא לא סטטי משוייך לכל המחלקה, ולא לאובייקט מסוג המחלקה. מתודה סטטית היא כמו כל מתודה רגילה, אך בשונה ממנה היא יכולה להשתמש רק במשתנים סטטים.

אני חשבתי שמה שמיוחד במתודה סטטית זה זה שלא צריך קודם מופע של הCLASS שלה. ובגלל זה main תמיד סטטית.

אתה יכול לבדוק אם זה נכון? לפי הרשימות שלי אני צודק, מצד שני לא תמיד הקשבתי הכי טוב בהרצאות.

קישור לתוכן
שתף באתרים אחרים

אי אפשר.

אתה לא יכול לשלוח הודעות דרך tcpListener האובייקט המדובר הוא רק מאזין לפורט בשביל חיבור קליינטים.

מה שכן.. אתה צריך שיהיה לך networkStream לכל קליינט ואז תוכל לשלוח להם דברים.



networkStream netStream = new networkStream(socket);

ועכשיו לדוגמא נרצה לשלוח סטרינג??

streamWriter sm = new streamWriter(netStream);
sm.writeLine("Hello bob");
כרגע נשלחה הודעה לאדם שאליו הסוקט מחובר

קישור לתוכן
שתף באתרים אחרים

אממ.. אין לי namespace שנקרא streamwriter.

ניסיתי ככה:


public void MSG(string msg)
{
TcpClient client = server.AcceptTcpClient();
NetworkStream stream = client.GetStream();

byte[] data = System.Text.Encoding.ASCII.GetBytes(msg);
stream.Write(data, 0, data.Length);
}

וזה שולח, אבל אני לא יודע אם זה שולח לכולם.. זה אמור?

אה וד"א זה לא בת'ראד משלו..

קישור לתוכן
שתף באתרים אחרים

אין בעיה שתעשה ככה, streamWriter מופיע ב namespace

System.IO, ד"א streamWriter מקל עליך אם אתה רוצה לשלוח טקסט קצר, מספר או אובייקט בגלל העובדה שיש לו פונקציות מוכנות לדברים האלה

writeString, writeInt וכו'

אם אתה רוצה לשלוח לכולם אתה צריך לעשות לולאה על אוסף הקליינטים שלך.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.


×
  • צור חדש...