I'm new to both Threading and TCP programming.
I got a tutorial that uses a single Windows form app as both Client and Server. It works when send and receive a message from the same windows form app. But when I try to separate its client and server to different app I got NullReferenceException error and can't figure why.
Here's the code that I try to use.
Server
private void bt_start_server_Click(object sender, EventArgs e)
{
TCPServer obj_server = new TCPServer();
System.Threading.Thread obj_thread = new System.Threading.Thread(obj_server.StartServer);
obj_thread.Start();
}
class TCPServer
{
TcpListener obj_server;
public TCPServer()
{
obj_server = new TcpListener(IPAddress.Any, 6868);
}
public void StartServer()
{
obj_server.Start();
while (true)
{
TcpClient tc = obj_server.AcceptTcpClient();
NetworkStream ns = tc.GetStream();
if (ns.ReadByte() == 2)
{
byte[] recv_data = ReadStream(ns);
Form1.ActiveForm.Invoke(new MethodInvoker(delegate
{
((Label)Form1.ActiveForm.Controls.Find("msg_label", true)[0]).Text = Encoding.UTF8.GetString(recv_data);
}
));
}
}
}
public byte[] ReadStream(NetworkStream ns)
{
byte[] data_buff = null;
int b = 0;
String buff_length = "";
while ((b = ns.ReadByte()) != 4)
{
buff_length += (char)b;
}
int data_length = Convert.ToInt32(buff_length);
data_buff = new byte[data_length];
int byte_read = 0;
int byte_offset = 0;
while (byte_offset < data_length)
{
byte_read = ns.Read(data_buff, byte_offset, data_length - byte_offset);
byte_offset += byte_read;
}
return data_buff;
}
}
Client
private void bt_send_Click(object sender, EventArgs e)
{
TcpClient tc = new TcpClient("127.0.0.1", 6868);
NetworkStream ns = tc.GetStream();
byte[] data_tosend = CreateDataPacket(Encoding.UTF8.GetBytes(tx_data_send.Text));
ns.Write(data_tosend, 0, data_tosend.Length);
}
private byte[] CreateDataPacket(byte[] data) {
byte[] initialize = new byte[1];
initialize[0] = 2;
byte[] separator = new byte[1];
separator[0] = 4;
byte[] datalength = Encoding.UTF8.GetBytes(Convert.ToString(data.Length));
MemoryStream ms = new MemoryStream();
ms.Write(initialize, 0, initialize.Length);
ms.Write(datalength, 0, datalength.Length);
ms.Write(separator, 0, separator.Length);
ms.Write(data, 0, data.Length);
return ms.ToArray();
}
error message
System.NullReferenceException: 'Object reference not set to an instance of an object.'
System.NullReferenceException
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=ThreadClient
StackTrace:
at ThreadClient.TCPServer.StartServer() in C:\Users\Win 10\...\ThreadClient\Form1.cs:line 79
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
At
Form1.ActiveForm.Invoke(new MethodInvoker(delegate
{
((Label)Form1.ActiveForm.Controls.Find("msg_label", true)[0]).Text = Encoding.UTF8.GetString(recv_data);
}
));
User contributions licensed under CC BY-SA 3.0