@@ -19,6 +19,14 @@ public partial class Client : Form
1919 private int port = 42069 ;
2020 private string serverIP = "" ;
2121
22+ //Connection handlers
23+ private Thread receivingThread ;
24+ private Thread sendingThread ;
25+ private TcpClient _client ;
26+ private StreamReader _sReader ;
27+ private StreamWriter _sWriter ;
28+ private bool isConnected = false ;
29+
2230 private List < string > connectedUsers = new List < string > ( ) ;
2331
2432 //Messages to send
@@ -66,15 +74,27 @@ private void Client_Load(object sender, EventArgs e)
6674 User_UsernameLabel . Text = username ;
6775 User_ConnectedServer . Text = serverIP ;
6876
69- InitializeConnection ( ) ;
77+ try
78+ {
79+ _client = new TcpClient ( ) ;
80+ isConnected = true ;
81+ InitializeConnection ( ) ;
7082
71- Show ( ) ;
72- SendMsgBox . Focus ( ) ;
83+ //show main form and close login dialog
84+ Show ( ) ;
85+ SendMsgBox . Focus ( ) ;
86+ }
87+ catch
88+ {
89+ isConnected = false ;
90+ }
7391 }
7492
7593 //if connection failed set status to red, else green
76- User_ConnectionStatus . BackColor = Color . FromArgb ( 224 , 102 , 102 ) ;
77- User_ConnectionStatus . BackColor = Color . FromArgb ( 147 , 196 , 125 ) ;
94+ if ( ! isConnected )
95+ User_ConnectionStatus . BackColor = Color . FromArgb ( 224 , 102 , 102 ) ;
96+ else
97+ User_ConnectionStatus . BackColor = Color . FromArgb ( 147 , 196 , 125 ) ;
7898 }
7999
80100 private void SelfHoster_DoWork ( object sender , System . ComponentModel . DoWorkEventArgs e )
@@ -84,7 +104,6 @@ private void SelfHoster_DoWork(object sender, System.ComponentModel.DoWorkEventA
84104
85105 private void CreateAndSendPacket ( string type , string message = null )
86106 {
87- //TODO: make this specify server and channel names
88107 PacketStruct packetStruct = new PacketStruct
89108 {
90109 Type = type ,
@@ -97,7 +116,22 @@ private void CreateAndSendPacket(string type, string message = null)
97116
98117 private void InitializeConnection ( )
99118 {
100- //TODO: create instance of client and add it to an accessible dictionary or something
119+ //connect to server ip on port 42069
120+ _client . Connect ( serverIP , port ) ;
121+ _sWriter = new StreamWriter ( _client . GetStream ( ) , Encoding . ASCII ) ;
122+ _sReader = new StreamReader ( _client . GetStream ( ) , Encoding . ASCII ) ;
123+
124+ //start a background task handling incoming messages
125+ ThreadStart startReceiver = new ThreadStart ( HandleReceiver ) ;
126+ receivingThread = new Thread ( startReceiver )
127+ { IsBackground = true } ;
128+ receivingThread . Start ( ) ;
129+
130+ //start a background task handling outgoing messages
131+ ThreadStart startSender = new ThreadStart ( HandleSender ) ;
132+ sendingThread = new Thread ( startSender )
133+ { IsBackground = true } ;
134+ sendingThread . Start ( ) ;
101135 }
102136
103137 private void HandleReceiver ( )
@@ -106,12 +140,23 @@ private void HandleReceiver()
106140 AddRichMsg addRichMsg = RichMessageReceived ;
107141 AddUserBlock addUser = AddConnectedUser ;
108142 DelUserBlock delUser = RemoveConnectedUser ;
109-
143+
144+ //send to server join message
145+ PacketStruct packetStruct = new PacketStruct
146+ {
147+ Type = "join" ,
148+ User = username
149+ } ;
150+ _sWriter . WriteLine ( JsonConvert . SerializeObject ( packetStruct ) ) ;
151+ _sWriter . Flush ( ) ;
152+
153+ //while connected, recieve messages and process them
110154 PacketStruct packet = new PacketStruct ( ) ;
111- while ( true )
155+ while ( isConnected )
112156 {
113- //Get packet from client instance and process
114- packet = new PacketStruct ( ) ;
157+ //Deserialize packet from StreamReader
158+ try { packet = JsonConvert . DeserializeObject < PacketStruct > ( _sReader . ReadLine ( ) ) ; }
159+ catch { packet = new PacketStruct ( ) ; }
115160
116161 switch ( packet . Type )
117162 {
@@ -159,7 +204,20 @@ private void HandleReceiver()
159204
160205 private void HandleSender ( )
161206 {
162- //TODO: Route packet to correct client instance
207+ //while connected, if there are messages to send, send them
208+ while ( isConnected )
209+ {
210+ if ( ! MessageQueue . IsEmpty )
211+ {
212+ foreach ( string msg in MessageQueue )
213+ {
214+ MessageQueue . TryDequeue ( out string str ) ;
215+ _sWriter . WriteLine ( msg ) ;
216+ _sWriter . Flush ( ) ;
217+ }
218+ }
219+ Thread . Sleep ( 10 ) ;
220+ }
163221 }
164222
165223 private void RichMessageReceived ( Tuple < string , string > nameAndMessage )
@@ -298,13 +356,55 @@ private void Window_Close_Click(object sender, EventArgs e)
298356
299357 private void Client_FormClosing ( object sender , FormClosingEventArgs e )
300358 {
301- //TODO: close all client connections
302- SelfHoster . Dispose ( ) ;
359+ if ( isConnected )
360+ CreateAndSendPacket ( "close" ) ;
303361 }
304362
305363 private void Button_SignOut_LinkClicked ( object sender , LinkLabelLinkClickedEventArgs e )
306364 {
307- //send closing request to single client
365+ //send closing request and reset variables
366+ CreateAndSendPacket ( "close" ) ;
367+ Thread . Sleep ( 10 ) ;
368+ isConnected = false ;
369+ _client . Close ( ) ;
370+ SelfHoster . Dispose ( ) ;
371+
372+ //rerun launch method to sign in again
373+ Client_Load ( sender , e ) ;
374+ }
375+
376+ private void Button_Reconnect_LinkClicked ( object sender , LinkLabelLinkClickedEventArgs e )
377+ {
378+ //try reconnection and set connection bool
379+ try
380+ {
381+ InitializeConnection ( ) ;
382+ isConnected = true ;
383+ }
384+ catch ( SocketException ) { }
385+ catch { isConnected = false ; }
386+
387+ if ( _client . Connected )
388+ isConnected = true ;
389+ else
390+ isConnected = false ;
391+
392+ //useless visual effect
393+ for ( int i = 0 ; i < 3 ; i ++ )
394+ {
395+ User_ConnectionStatus . BackColor = Color . FromArgb ( 255 , 217 , 102 ) ;
396+ Update ( ) ;
397+ Thread . Sleep ( 500 ) ;
398+ User_ConnectionStatus . BackColor = Color . FromArgb ( 183 , 183 , 183 ) ;
399+ Update ( ) ;
400+ Thread . Sleep ( 500 ) ;
401+ }
402+
403+ //update connection status indicator
404+ if ( ! isConnected )
405+ User_ConnectionStatus . BackColor = Color . FromArgb ( 224 , 102 , 102 ) ;
406+ else
407+ User_ConnectionStatus . BackColor = Color . FromArgb ( 147 , 196 , 125 ) ;
308408 }
309409
310410 private void SendMsgBox_KeyDown ( object sender , KeyEventArgs e )
0 commit comments