i found a piece of code on the web that was designed to show the basic functionality of the socket class, so I decided to comment the code as it was uncommented and see where I would be struggling...
1) It seems to be missing code to check whether there is a connection before sending which might be a good idea incase the connection is lost... Would a try/catch block solve this?
2)The amount of data send seems to be limited to a single Kb [I wouldnt go much larger] as a byte array is used with 1024 elements..
3)I'm not sure why a byte array is used of only 2 elements which contains the data to be send...
4) What happens if the data arrival loop is executing while data is still missing. Would the following be a solution? :
Data Arrives
Get the first byte denoting the amount of chars contained in the message
If the array does not contain that much data yet continue adding to the array [somehow]
5) How would one go about setting up a tcp server to accept multiple connections? simply create an array of threads [resources consuming?] or would the threads also need variable arrays as otherwise each thread element in the thread array would be accessing the same variable? (hope that made sense)
Thank you
Code:
private void btnListen_Click(object sender, System.EventArgs e)
{
//starts the server
btnListen.Enabled = false;
btnConnect.Enabled = false;
txtServerIP.Enabled = false;
myThread = new Thread(new ThreadStart(RunListener));
myThread.Start();
//thread listening for incoming connections
}
private void RunListener()
{
//get ready for connections
myListener = new TcpListener(IPAddress.Any, 9000);
//accept from any ip on port 9000
myListener.Start();
//start tcp listener
lstChat.Items.Add("Listening for a client...");
//notify user
while (!myListener.Pending())
//this loops runs while the listener is waiting for incoming connections
{
Thread.Sleep(100);
//wait a while to mitigate the load on system resources
}
lstChat.Items.Add("Connecting...");
//notify user
myClient = myListener.AcceptTcpClient();
//defined globally in the form class definition [???]
//as an instance of the tcpClient class [protected]
myThread = new Thread(new ThreadStart(ReceiveData));
//prepare for incoming data
myThread.Start();
//incoming data thread
}
private void ReceiveData()
{
//this is the most discombobulating thread in the program
//IMHO
int i; //not sure what it is used for
string sStreamString; //:S
byte[] baData = new byte[1024];
//byte array with 1024 elements...
myStream = myClient.GetStream();
// myStream is a netWork Stream [protected]
//attaches a stream to the tcpClient
lstChat.Items.Add("Connected!");
//notify user
while (true)
//run infinite loop until the peer decides to close
{
i = myStream.Read(baData, 0, baData.Length);
//I'm gonna guess here... ...this reads the first Kb [array of 1024 bytes...] of the incoming data and assigns the contents to an int???? :S or does i contain the length of the read data...?
sStreamString = Encoding.ASCII.GetString(baData);
//sStreamString now contains the byte array contents... converted into/read as ASCII keycodes....
if (sStreamString.IndexOf("/close") == 0)
//if /close is found then break the loop as we are closing?
{
break;
}
lstChat.Items.Add("<< " + sStreamString);
//show the contents of the string
}
//we received the close command so confirm it
baData = Encoding.ASCII.GetBytes("/close");
//fill our byte array with the close command
myStream.Write(baData, 0, baData.Length);
//write this from pos 0...?
myStream.Close();
myClient.Close();
//dont need tcp client and network stream no more
lstChat.Items.Add("Connection closed.");
//notify user
}
private void btnConnect_Click(object sender, System.EventArgs e)
//clicked to connect
{
btnListen.Enabled = false;
txtServerIP.Enabled = false;
btnConnect.Enabled = false;
lstChat.Items.Add("Connecting...");
//notify user
myClient = new TcpClient(txtServerIP.Text, 9000);
//connect....what if it fails to connect? try + catch?
myThread = new Thread(new ThreadStart(ReceiveData));
//go check for incoming data
myThread.Start();
}
private void btnSend_Click(object sender, System.EventArgs e)
{
if (txtMessage.Text != "")
//aslong as we have a msg to send
{
byte[] baData = new byte[2];
//a two byte array..?:S
baData = Encoding.ASCII.GetBytes(txtMessage.Text);
//load msg into byte array...
myStream.Write(baData, 0, baData.Length);
//send the contents of the byte array..from pos 0 to the end..
lstChat.Items.Add(">> " + txtMessage.Text);
txtMessage.Clear();
txtMessage.Focus(); //obvious
}
else
txtMessage.Focus();
//we have no msg
}
1) It seems to be missing code to check whether there is a connection before sending which might be a good idea incase the connection is lost... Would a try/catch block solve this?
2)The amount of data send seems to be limited to a single Kb [I wouldnt go much larger] as a byte array is used with 1024 elements..
3)I'm not sure why a byte array is used of only 2 elements which contains the data to be send...
4) What happens if the data arrival loop is executing while data is still missing. Would the following be a solution? :
Data Arrives
Get the first byte denoting the amount of chars contained in the message
If the array does not contain that much data yet continue adding to the array [somehow]
5) How would one go about setting up a tcp server to accept multiple connections? simply create an array of threads [resources consuming?] or would the threads also need variable arrays as otherwise each thread element in the thread array would be accessing the same variable? (hope that made sense)
Thank you