You are on page 1of 6

Threaded Socket for Chatting Program with Windows Interface

(Windows Based Program)


In this we create two sockets

a. Server Side b. Client Side c. Client Handler (which runs in the form of the client for every individual client)
Client Handler Class
using using using using using using using using System; System.Collections.Generic; System.Linq; System.Text; System.Net; System.Net.Sockets; System.Threading; System.Collections;

namespace Multithreading { class ClientHandler { protected TcpClient clientSocket; public Thread thrd; protected NetworkStream ns; protected static ArrayList ClientList=new ArrayList(); private String ExtractName(String temp) { char[] tt = temp.ToCharArray(); String vResult = ""; for (int x = 0; x < tt.Length; x++) { if (tt[x] != '\0') { vResult = vResult + tt[x]; } } return vResult; } public ClientHandler(TcpClient vClient) { clientSocket = vClient; ClientList.Add(clientSocket); ns = clientSocket.GetStream(); thrd = new Thread(new ThreadStart(this.doChat)); thrd.Start(); } private void BroadCast(String temp)

{ IEnumerator ie=ClientList.GetEnumerator(); while (ie.MoveNext()) { TcpClient tt = (TcpClient)ie.Current; NetworkStream vNsTemp=tt.GetStream(); lock (vNsTemp) { byte[] vBytesToAllClient = Encoding.ASCII.GetBytes(temp); vNsTemp.Write(vBytesToAllClient, 0, vBytesToAllClient.Length); vNsTemp.Flush(); } } } private void doChat() { //read the clientname from the client byte[] vbyteclientname = new byte[clientSocket.ReceiveBufferSize]; ns.Read(vbyteclientname, 0, Convert.ToInt32(clientSocket.ReceiveBufferSize)); String nameFromClient = ""; nameFromClient = System.Text.Encoding.ASCII.GetString(vbyteclientname); nameFromClient = ExtractName(nameFromClient); //BroadCastInitial message to all clients String vWelcomeMessage = nameFromClient + " has joined chat"; BroadCast(vWelcomeMessage); while (clientSocket.Connected) { try { //receiving the message from Client byte[] vBytesFromServer=new byte[clientSocket.ReceiveBufferSize]; ns.Read(vBytesFromServer, 0, Convert.ToInt32(clientSocket.ReceiveBufferSize)); String dataFromClient = ""; dataFromClient = System.Text.Encoding.ASCII.GetString(vBytesFromServer); dataFromClient = ExtractName(dataFromClient); if (clientSocket.Connected == true) Console.WriteLine("From client-"+dataFromClient); //BroadCast the message to all the clients if(clientSocket.Connected==true) BroadCast(dataFromClient);

} catch (Exception ex) { //Console.WriteLine(" >> " + ex.ToString()); ns.Close(); clientSocket.Close(); Console.WriteLine("Client Disconnected"); break; } } ns.Close(); clientSocket.Close(); Console.WriteLine("Client Disconnected"); thrd.Abort(); } } }

SERVER SOCKET
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Net; using System.Net.Sockets; using System.Threading;

namespace Multithreading { class Program { static void Main(string[] args) { //For creating the ServerSide Socket TcpListener vServer = new TcpListener(IPAddress.Parse("127.0.0.1"), 4000); vServer.Start(); Console.WriteLine("Server Socket started at 127.0.0.1 and Port No: 4000"); Console.WriteLine("Waiting for the client to Connect!!!!!!"); TcpClient vClient; while (true) { vClient = vServer.AcceptTcpClient(); ClientHandler vClientHandler = new ClientHandler(vClient); } vClient.Close(); vServer.Stop(); } } }

CLIENT SOCKET (Windows based Interface)

namespace LearnCSharp { public partial class Form2 : Form { NetworkStream ns; TcpClient vClient; Thread thrd; private void run() { vClient = new TcpClient(); vClient.Connect("127.0.0.1", 4000); ns = vClient.GetStream(); ns.Flush(); String vClientName = textBox2.Text; //Sending ClientName to the server byte[] vClientNamebytes = new byte[vClient.ReceiveBufferSize]; vClientNamebytes = System.Text.Encoding.ASCII.GetBytes(vClientName); ns.Write(vClientNamebytes, 0, vClientNamebytes.Length); ns.Flush(); while (vClient.Connected) { //receiving message that is broadcast by the server byte[] bytes1 = new byte[vClient.ReceiveBufferSize];

ns.Read(bytes1, 0, Convert.ToInt32(vClient.ReceiveBufferSize)); String vMessageBroadCastByServer = System.Text.Encoding.ASCII.GetString(bytes1); textBox1.Text = textBox1.Text + Environment.NewLine; textBox1.Text = textBox1.Text + vMessageBroadCastByServer; } ns.Close(); vClient.Close(); thrd.Abort(); } private void Form2_Closed(object sender, FormClosedEventArgs e) { thrd.Abort(); ns.Close(); vClient.Close(); } private void button2_Click(object sender, EventArgs e) { ns.Flush(); String vMessageToAll = textBox3.Text; //Sending Message to all clients byte[] vMessageToAllClientsbytes = new byte[vClient.ReceiveBufferSize]; vMessageToAllClientsbytes = System.Text.Encoding.ASCII.GetBytes(vMessageToAll); ns.Write(vMessageToAllClientsbytes, 0, vMessageToAllClientsbytes.Length); ns.Flush(); textBox3.Text = ""; } private void button1_Click(object sender, EventArgs e) { //CONNECT BUTTON thrd = new Thread(new ThreadStart(this.run)); thrd.Start(); } } }

You might also like