Hi all,
I wrote these two classes to simplify network communication a bit. It seems to work (only transfers strings atm) except one day it stopped working all together and im not sure why.
Any constructive Criticism would be greatly appreciated.
using System;
using System.Collections.Generic;
using System.Text;
namespace MyNameSpace
{
using System;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Windows.Forms;
public class ServerSocket
{
private TcpListener myListener;
private int port = 4000;
private Thread listenerThread;
private Socket Client;
private bool keepListening=false;
public ServerSocket(int port)
{
this.port = port;
}
public void setPort(int port)
{
this.port = port;
}
public void start()
{
try
{
this.keepListening = true;
myListener = new TcpListener(port);
myListener.Start();
listenerThread = new Thread(new ThreadStart(listen));
listenerThread.Start();
}
catch (Exception e) { }
}
public void stop()
{
this.keepListening = false;
myListener.Stop();
listenerThread.Abort();
}
public void listen()
{
while (this.keepListening)
{
try
{
Client = myListener.AcceptSocket();//Catch Socket Exception
}
catch (SocketException) { }
if (Client.Connected)
{
//MessageBox.Show("Client Connected!!");
try
{
while (Client.Connected && this.keepListening)
{
Byte[] receive = new Byte[64];
int i = Client.Receive(receive, receive.Length, 0);
char[] unwanted = { ' ', ' ', '\0' };
recieveText(System.Text.Encoding.ASCII.GetString(receive).TrimEnd(unwanted));
}
}
catch (SocketException e)
{
Client.Disconnect(true);
}
}
Thread.Sleep(500);
}
}
public void sendText(string text)
{
Byte[] byteDateLine = System.Text.Encoding.ASCII.GetBytes(text.ToCharArray());
Client.Send(byteDateLine, byteDateLine.Length, 0);
}
public void recieveText(string text)
{
string sendText = "ERROR - Unrecognised Command";
if (text.Equals("SayHello:"))
sendText = "Hello Dude!";
this.sendText(sendText);
}
}
}
public class ClientSocket
{
private TcpClient Server;
private int port = 4554;
private string ip;
private bool readData = false;
public ClientSocket(string ip, int port)
{
this.ip = ip;
this.port = port;
}
public bool connect()
{
try
{
Server = new TcpClient(this.ip, this.port);
return true;
}
catch (Exception e) { return false; }
}
public void disconnect()
{
Server.Close();
}
public string sendRequest(string request)
{
if (Server!=null&&Server.Connected == true)
{
string returnString = "";
NetworkStream nts = Server.GetStream();
if (nts.CanWrite)
{
Byte[] sends = System.Text.Encoding.ASCII.GetBytes(request.ToCharArray());
nts.Write(sends, 0, sends.Length);
nts.Flush();
}
readData = false;
while (!readData && nts.CanRead)
{
//if data available then read from the stream
if (nts.DataAvailable)
{
byte[] rcd = new byte[128];
int i = nts.Read(rcd, 0, 128);
char[] unwanted = { ' ', ' ', ' ' };
returnString = System.Text.Encoding.ASCII.GetString(rcd).TrimEnd(unwanted);
readData = true;
}
}
return returnString;
}
return "Error - Not connected to server";
}
}
Kelly LloydPosted Nov 30, 2006, 8:26 AM
If the code was working at one point and then stops, that would indicate to me you are losing some connectivity between your networking applications. Are you testing this on two separate machines or on the same machine? Is windows firewall turned on?
As far as your coding methodology, it depends on what you are trying to do. Are you trying to use synchronous or asynchronous sockets, what kind of data are you trying to transmit? What kind of application will you be using this in?