Report abuse


			
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Net.Sockets;
using System.Net;
using System.Text;

namespace ChatClient
{
    public partial class Page : UserControl
    {
        private Socket socket;
        private byte[] transferBuffer;
        private SocketAsyncEventArgs sendEventArgs;

        private static int BUFFER_SIZE = 500;
        private static int PORT = 4505;
        private static DnsEndPoint IP_END_POINT = new DnsEndPoint(Application.Current.Host.Source.DnsSafeHost, PORT);

        public delegate void SetTextCallback(String _text);

        public Page()
        {
            InitializeComponent();
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            SocketAsyncEventArgs connectEventArgs = new SocketAsyncEventArgs();
            connectEventArgs.RemoteEndPoint = IP_END_POINT;
            connectEventArgs.Completed += new EventHandler(connectEventArgs_Completed);
            socket.ConnectAsync(connectEventArgs);
        }

        void connectEventArgs_Completed(object sender, SocketAsyncEventArgs e)
        {
            sendEventArgs = new SocketAsyncEventArgs();
            sendEventArgs.RemoteEndPoint = IP_END_POINT;

            e.Completed -= new EventHandler(connectEventArgs_Completed);
            e.Completed += new EventHandler(receiveEventArgs_Completed);
            transferBuffer = new byte[BUFFER_SIZE];
            e.SetBuffer(transferBuffer, 0, transferBuffer.Length);
            socket.ReceiveAsync(e);
        }

        void receiveEventArgs_Completed(object sender, SocketAsyncEventArgs e)
        {
            String a = Encoding.UTF8.GetString(transferBuffer, e.Offset, e.BytesTransferred);
            SetText(a);
            socket.ReceiveAsync(e);
        }

        private void SetText(String text)
        {
            if (this.Dispatcher.CheckAccess())
                receiveBox.Text += text;
            else
                this.Dispatcher.BeginInvoke(new SetTextCallback(SetText), text);
        }

        private void sendButton_Click(object sender, RoutedEventArgs e)
        {
            List> l = new List>();
            l.Add(new ArraySegment(Encoding.UTF8.GetBytes(sendBox.Text + "\n")));

            sendEventArgs.BufferList = l;
            socket.SendAsync(sendEventArgs);
        }
    }
}