Short answer - run the TCP listener in a separate thread / task (TPL). For a complete working solution, you also need to implement sending any changes to a separate user interface, using a separate thread in the main thread, using a special technique that depends on the Framework you use. I mean WPF / WinForms / whatever.
The code below works fine for me. Read the TODO section before.
TODO:
Add to the form Textbox, ListBox, Button, make public:
public System.Windows.Forms.TextBox console; public System.Windows.Forms.ListBox incommingMessages; private System.Windows.Forms.Button sendSampleDataButton;
Point of entry:
private static Form1 form; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); form = new Form1(); form.Load += OnFormLoad; Application.Run(form); } private static void OnFormLoad(object sender, EventArgs e) { CreateServer(); }
Server:
private static void CreateServer() { var tcp = new TcpListener(IPAddress.Any, 25565); tcp.Start(); var listeningThread = new Thread(() => { while (true) { var tcpClient = tcp.AcceptTcpClient(); ThreadPool.QueueUserWorkItem(param => { NetworkStream stream = tcpClient.GetStream(); string incomming; byte[] bytes = new byte[1024]; int i = stream.Read(bytes, 0, bytes.Length); incomming = System.Text.Encoding.ASCII.GetString(bytes, 0, i); form.console.Invoke( (MethodInvoker)delegate { form.console.Text += String.Format( "{0} Connection esatblished: {1}{2}", DateTime.Now, tcpClient.Client.RemoteEndPoint, Environment.NewLine); }); MessageBox.Show(String.Format("Received: {0}", incomming)); form.incommingMessages.Invoke((MethodInvoker)(() => form.incommingMessages.Items.Add(incomming))); tcpClient.Close(); }, null); } }); listeningThread.IsBackground = true; listeningThread.Start(); }
Client
private void button1_Click(object sender, EventArgs e) { Connect("localhost", "hello localhost " + Guid.NewGuid()); } static void Connect(String server, String message) { try { Int32 port = 25565; TcpClient client = new TcpClient(server, port); Byte[] data = System.Text.Encoding.ASCII.GetBytes(message); NetworkStream stream = client.GetStream();
Screenshot:

source share