public void addItem(object o) { if (this.lstOPNames.InvokeRequired) { SetListAddCallback d = new SetListAddCallback(addItem); this.Invoke(d, new object[] { o }); } else { lstOPNames.Items.Add(o); } }
private void ListenForServer(object client) { TcpClient tcpClient = (TcpClient)client; NetworkStream clientStream = tcpClient.GetStream(); SetTextCallback d = new SetTextCallback(Settext); SetListAddCallback listAdd = new SetListAddCallback(AddList); SetListRemoveCallback listRemove = new SetListRemoveCallback(RemoveList); //buffer = encoding.GetBytes(""); byte[] message = new byte[65535]; byte[] message2 = new byte[2]; int bytesRead = 0; // I realize this is a mess, I dont care string text = ""; int length = 0; int length2 = 0; int offset = 0; int i = 0; int ID = 0; int LOGGEDIN = 0; int value = 0; bool firstlogin = true; while (true) { try { Array.Clear(message, 0, message.Length); // firstlogin = false; if (firstlogin == true) { bytesRead = clientStream.Read(message, 0, 1); bytesRead = clientStream.Read(message2, 0, 1); length = ((int)message[0] << 8) | (int)message2[0];//LENGTH OF DATA // bytesRead = clientStream.Read(message, 0, 2); // length = message[0]; bytesRead = clientStream.Read(message, 0, length); for (i = 0; i <= length + 1; i++) { text += (char)message[i]; } this.Invoke(d, new object[] { text }); firstlogin = false; text = ""; } else { //AFTER INITIAL LOGIN SERVER WILL SEND 2 BYTES (LENGTH), then the message! bytesRead = clientStream.Read(message, 0, 1); bytesRead = clientStream.Read(message2, 0, 1); length = ((int)message[0]<<8) | (int)message2[0];//LENGTH OF DATA //string text2 = encoding.GetString(message, 0, bytesRead); Thread.Sleep(100); if (length == 0) {//PING? //this.Invoke(d, new object[] {DateTime.Now.ToString("HH:mm:ss tt") + " : --PING!-- "}); } else { bytesRead = clientStream.Read(message, 0, 1); bytesRead = clientStream.Read(message2, 0, 1); length2 = ((int)message[0] << 8) | (int)message2[0];//LENGTH OF MESSAGE bytesRead = clientStream.Read(message, 0, length-2);//full message //text2 = encoding.GetString(message, 0, bytesRead); offset = 4; while (offset <= bytesRead) { ID = message[offset - 2];//ID OF USER, need to be used to create a list of users LOGGEDIN = message[offset - 4];//IF LOGGED IN OR NOT (ONLY USEFUL WHEN GRABBING ID LIST ON FIRST LOG, OR IF SOMEONE LOGS IN OR OUT) //0 on message, 1 on login, 2 on logout value = message[offset-1];//LENGTH OF NAME BEFORE TEXT, ONLY USEFUL ON FIRST LOGIN. // else // { //TEXT for (i = offset; i <= length2 - 1; i++) { text += (char)message[i]; } if (value > 0) {text = text.Insert(value, ">");} if (LOGGEDIN == 1) {//LOGGED IN this.Invoke(listAdd, new object[] { text, ID.ToString() }); } else if (LOGGEDIN == 2) {//LOGGED OUT this.Invoke(listRemove, new object[] { text, ID.ToString() }); } else {//LOGGED OUT // this.Invoke(d, new object[] { text }); int ndx = UserID.FindIndex(s => s == ID.ToString()); //int Name = UserName.IndexOf(ndx); // UserName.Find(b => b.Property == value); if (ndx == -1) { this.Invoke(d, new object[] { text }); } else { string Name = UserName[ndx]; text = text.Insert(0, Name + ">"); this.Invoke(d, new object[] { text }); } } text = ""; offset = (i + 6); length2 = message[i + 1] + (offset - 4); // } } } } } catch { // richTextBox1.Text += "Some Error"; break; } if (bytesRead == 0) { // this.closeRequested = true; this.Invoke(d, new object[] { "***SERVER HAS DROPPED*** \r\n" }); MessageBox.Show("***SERVER HAS DROPPED***", "No Connection!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); break; // return; } } Disconnect(); // message = encoding.GetBytes(""); // clientStream.Flush(); clientStream.Close(); tcpClient.Close(); //System.Console.Write("---the client has disconnected from the server---"); }