עבור לתוכן

[c#] סוקטים

Featured Replies

פורסם
  • מחבר

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

ה 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
  • צפיות 5.9k
  • נוצר
  • תגובה אחרונה
פורסם

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


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 מכיוון שהם צריכים להתחבר לשרת. אתה צריך ליצור TcpClient בצד השרת, ולהתחבר לשרת דרכו.

לSaarD - אתה יכול לרשום while(true).

פורסם

אין סיבה לרשום while(true) מכיוון שאני רוצה לתת תנאי עצירה בעתיד ואז פשוט אוכל לשנות את הערך ל false והת'רד יסתיים בצורה נקיה

פורסם
  • מחבר

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

עריכה:

אני משתפר :)

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


// 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?

יש לי את המשתמשים כבר ב arraylist.

פורסם

אי אפשר.

אתה לא יכול לשלוח הודעות דרך 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 וכו'

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

פורסם

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

אתה צריך לשים את הליסן בתראד שונה מהתראד ששולח הודעו כדי שהם לא יהיו תלויים.

פורסם
  • מחבר

האמת שאני לא מצליח לשים את זה בתראד אחר משל הליסטן.. אפשר דוגמא?

ארכיון

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

דיונים חדשים