Hey I have problem running my code, the client seems to not connect with the server, hope someone can help me I have been trying to fix this out for 5 days now.
2 Projects. sockerServer contain a client class and socketClient with chatroom GUI
sockerServer
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Collections;
using System.Net;
namespace SocketServer
{
public delegate void LogUpdater(string msg);
public partial class Form1 : Form
{
private Thread serverThread;
private TcpListener serverListener;
private Hashtable clientTable;
public Form1()
{
InitializeComponent();
clientTable = new Hashtable();
serverThread = new Thread(new ThreadStart(startListen));
serverThread.Start();
AddLog("Socket Server Started");
}
public void startListen()
{
try
{
serverListener = new TcpListener(IPAddress.Any, 5151);
serverListener.Start();
do
{
Client newClient = new Client(serverListener.AcceptTcpClient());
newClient.Disconnected += new DisconnectDelegate(OnDisconnected);
newClient.Connected += new ConnectDelegate(this.OnConnected);
newClient.MessageReceived += new MessageDelegate(OnMessageReceived);
newClient.Connect();
}
while (true);
}
catch
{
serverListener.Stop();
}
}
public void OnConnected(object sender, EventArgs e)
{
Client temp = (Client)sender;
clientTable.Add(temp.ID, temp);
Client tempClient;
AddLog("Client Connected:" + temp.UserName);
foreach (DictionaryEntry d in clientTable)
{
tempClient = (Client)d.Value;
tempClient.Send(tempClient.ID + "@Connected@" + temp.UserName);
}
}
public void OnDisconnected(object sender, EventArgs e)
{
Client temp = (Client)sender;
if (clientTable.ContainsKey(temp.ID))
{
AddLog("Client Disconnected:" + temp.UserName);
clientTable.Remove(temp.ID);
ClientList.RemoveClient(temp.UserName, temp.ID);
Client tempClient;
foreach (DictionaryEntry d in clientTable)
{
tempClient = (Client)d.Value;
tempClient.Send(tempClient.ID + "@Disconnected@" + temp.UserName);
}
}
}
public void OnMessageReceived(object sender, MessageEventArgs e)
{
Client temp = (Client)sender;
AddLog(temp.UserName + " :" + e.Message);
Client tempClient;
foreach (DictionaryEntry d in clientTable)
{
tempClient = (Client)d.Value;
tempClient.Send(temp.UserName + " :" + e.Message);
}
}
public void AddLog(string msg)
{
logBox.Items.Add(msg);
}
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
serverListener.Stop();
}
}
}
The Class
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace SocketServer
{
public delegate void ConnectDelegate(object sender, EventArgs e);
public delegate void DisconnectDelegate(object sender, EventArgs e);
public delegate void MessageDelegate(object sender, MessageEventArgs e);
public class MessageEventArgs : EventArgs
{
private string msg;
public string Message
{
get
{
return this.msg;
}
set
{
this.msg = value;
}
}
}
public class Client
{
public event ConnectDelegate Connected;
public event DisconnectDelegate Disconnected;
public event MessageDelegate MessageReceived;
private bool firstTime = true;
private bool connected = false;
private byte[] recByte = new byte[1024];
private StringBuilder myBuilder = new StringBuilder();
private TcpClient myClient;
private string userName, clientID;
public Client(TcpClient myClient)
{
this.myClient = myClient;
}
public void Connect()
{
this.clientID = Guid.NewGuid().ToString();
AsyncCallback GetStreamMsgCallback = new AsyncCallback(GetStreamMsg);
myClient.GetStream().BeginRead(recByte, 0, 1024, GetStreamMsgCallback, null);
}
public string UserName
{
get
{
return this.userName;
}
}
public string ID
{
get
{
return this.clientID;
}
}
public void GetStreamMsg(IAsyncResult ar)
{
int intCount;
try
{
lock (myClient.GetStream())
{
intCount = myClient.GetStream().EndRead(ar);
}
if (intCount < 1)
{
myClient.Close();
if (Disconnected != null)
{
EventArgs e = new EventArgs();
Disconnected(this, e);
}
}
BuildText(recByte, 0, intCount);
if (!firstTime)
{
lock (myClient.GetStream())
{
AsyncCallback GetStreamMsgCallback = new AsyncCallback(GetStreamMsg);
myClient.GetStream().BeginRead(recByte, 0, 1024, GetStreamMsgCallback, null);
}
}
}
catch
{
myClient.Close();
if (Disconnected != null)
{
EventArgs e = new EventArgs();
Disconnected(this, e);
}
}
}
public void Disconnect()
{
this.connected = false;
myClient.Close();
}
public void CheckUserName(string userName)
{
if (userName.Length > 20)
{
Send("sorry@Username too long, enter a Username less than 20 Characters!!");
Disconnect();
return;
}
else if (userName.IndexOf("@") >= 0)
{
Send("sorry@Invalid Character in Username!!");
Disconnect();
return;
}
else if (!ClientList.AddClient(userName, this.clientID))
{
Send("sorry@Duplicate Username, try another Username!!");
Disconnect();
return;
}
else
{
this.connected = true;
this.userName = userName;
StringBuilder userList = new StringBuilder();
userList.Append(this.clientID);
Hashtable clientTable = ClientList.GetList;
foreach (DictionaryEntry d in clientTable)
{
userList.Append("@");
userList.Append(d.Value.ToString());
}
lock (myClient.GetStream())
{
AsyncCallback GetStreamMsgCallback = new AsyncCallback(GetStreamMsg);
myClient.GetStream().BeginRead(recByte, 0, 1024, GetStreamMsgCallback, null);
}
Send(userList.ToString());
if (Connected != null)
{
EventArgs e = new EventArgs();
Connected(this, e);
}
}
}
public void BuildText(byte[] dataByte, int offset, int count)
{
for (int i = 0; i < count; i++)
{
if (dataByte[i] == 13)
{
if (firstTime)
{
CheckUserName(myBuilder.ToString().Trim());
firstTime = false;
}
else if (MessageReceived != null && connected)
{
MessageEventArgs e = new MessageEventArgs();
e.Message = (myBuilder.ToString()).Trim();
MessageReceived(this, e);
}
myBuilder = new System.Text.StringBuilder();
}
else
{
myBuilder.Append(Convert.ToChar(dataByte[i]));
}
}
}
public void Send(string msg)
{
lock (myClient.GetStream())
{
System.IO.StreamWriter myWriter = new System.IO.StreamWriter(myClient.GetStream());
myWriter.Write(msg);
myWriter.Flush();
}
}
}
public class ClientList
{
private static Hashtable clientTable = new Hashtable();
public static bool AddClient(string userName, string id)
{
lock (clientTable)
{
if (clientTable.ContainsValue(userName))
{
return false;
}
else
{
clientTable.Add(id, userName);
return true;
}
}
}
public static bool RemoveClient(string userName, string id)
{
lock (clientTable)
{
if (clientTable.ContainsValue(userName))
{
clientTable.Remove(id);
return true;
}
else
{
return false;
}
}
}
public static Hashtable GetList
{
get
{
return clientTable;
}
}
}
}
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Collections;
namespace SocketClient
{
public delegate void displayMessage(string msg);
public partial class Form1 : Form
{
private string userID, userName;
bool firstTime = true;
private TcpClient chatClient;
private byte[] recByte = new byte[1024];
private StringBuilder myBuilder;
public Form1()
{
InitializeComponent();
myBuilder = new System.Text.StringBuilder();
}
public void GetMsg(IAsyncResult ar)
{
int byteCount;
try
{
byteCount = (chatClient.GetStream()).EndRead(ar);
if (byteCount < 1)
{
Disconnect();
MessageBox.Show("Disconnected!!");
return;
}
BuildText(recByte, 0, byteCount);
if (!firstTime)
{
AsyncCallback GetMsgCallback = new AsyncCallback(GetMsg);
(chatClient.GetStream()).BeginRead(recByte, 0, 1024, GetMsgCallback, this);
}
}
catch (Exception ed)
{
Disconnect();
MessageBox.Show("Exception Occured :" + ed.ToString());
}
}
public void BuildText(byte[] dataByte, int offset, int count)
{
for (int i = offset; i < (count); i++)
{
if (dataByte[i] == 10)
continue;
myBuilder.Append(Convert.ToChar(dataByte[i]));
}
char[] spliters = { '@' };
if (firstTime)
{
string[] tempString = myBuilder.ToString().Split(spliters);
if (tempString[0] == "sorry")
{
object[] temp = { tempString[1] };
this.Invoke(new displayMessage(DisplayText), temp);
Disconnect();
}
else
{
this.userID = tempString[0];
for (int i = 1; i < tempString.Length; i++)
{
object[] temp = { tempString[i] };
this.Invoke(new displayMessage(AddUser), temp);
}
firstTime = false;
AsyncCallback GetMsgCallback = new AsyncCallback(GetMsg);
(chatClient.GetStream()).BeginRead(recByte, 0, 1024, GetMsgCallback, this);
}
}
else
{
if (myBuilder.ToString().IndexOf(this.userID) >= 0)
{
string[] tempString = myBuilder.ToString().Split(spliters);
if (tempString[1] == "Connected")
{
object[] temp = { tempString[2] };
this.Invoke(new displayMessage(AddUser), temp);
}
else if (tempString[1] == "Disconnected")
{
object[] temp = { tempString[2] };
this.Invoke(new displayMessage(RemoveUser), temp);
}
}
else
{
myBuilder.Append("\r\n");
object[] temp = { myBuilder.ToString() };
this.Invoke(new displayMessage(DisplayText), temp);
}
}
myBuilder = new System.Text.StringBuilder();
}
private void RemoveUser(string user)
{
if (userlistBox.Items.Contains(user))
userlistBox.Items.Remove(user);
DisplayText(user + " left chat\r\n");
}
private void AddUser(string user)
{
if (!userlistBox.Items.Contains(user))
userlistBox.Items.Add(user);
if (!firstTime)
DisplayText(user + " joined chat\r\n");
}
public void SendText(string msg)
{
System.IO.StreamWriter chatWriter = new System.IO.StreamWriter(chatClient.GetStream());
chatWriter.WriteLine(msg);
chatWriter.Flush();
}
public void DisplayText(string msg)
{
msgViewBox.AppendText(msg);
}
private void sendButton_Click(object sender, EventArgs e)
{
if (sendBox.Text != "")
{
SendText(sendBox.Text);
sendBox.Text = "";
}
}
private void Disconnect()
{
if (chatClient != null)
{
chatClient.Close();
chatClient = null;
}
userlistBox.Items.Clear();
sendButton.Enabled = false;
connectButton.Text = "Connect";
usernameBox.Enabled = true;
sendBox.Enabled = false;
this.AcceptButton = connectButton;
firstTime = true;
userID = "";
}
private void connectButton_Click(object sender, EventArgs e)
{
if (connectButton.Text == "Connect" && usernameBox.Text != "")
{
try
{
chatClient = new TcpClient("localhost", 5151);
DisplayText("Connecting to Server ...\r\n");
AsyncCallback GetMsgCallback = new AsyncCallback(GetMsg);
(chatClient.GetStream()).BeginRead(recByte, 0, 1024, GetMsgCallback, null);
SendText(usernameBox.Text);
this.userName = usernameBox.Text;
this.Text = "Chat Client :" + userName;
usernameBox.Text = "";
connectButton.Text = "Disconnect";
usernameBox.Enabled = false;
sendButton.Enabled = true;
sendBox.Enabled = true;
this.AcceptButton = sendButton;
}
catch
{
Disconnect();
MessageBox.Show("Can't connect to Server...");
}
}
else if (connectButton.Text == "Disconnect")
{
Disconnect();
}
}
}
}
|