socket实现Windows Phone 7即时聊天

本例实现一个简单的控制台与wp7端的聊天对话。采用多线程处理接入的客户端。代码都贴上来吧。注释写的很明白了应该。传下图:

xaml文件:

 <Grid x:Name="LayoutRoot" Background="#FF3399FF">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel contains the name of the application and page title-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" FontSize="45" Text="chat with server" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <TextBox Height="72" HorizontalAlignment="Left" Margin="30,463,0,0" Name="textBoxTextToSend" Text="" VerticalAlignment="Top" Width="393" Background="White" BorderBrush="White" BorderThickness="1" />
            <Button Content="Send" Height="72" HorizontalAlignment="Left" Margin="223,526,0,0" Name="buttonSend" VerticalAlignment="Top" Width="160" Click="buttonSend_Click" />
            <ListBox Height="451" HorizontalAlignment="Left" Margin="30,6,0,0" Name="chatlistbox"  VerticalAlignment="Top" Width="395" Background="#E5FFFFFF" Foreground="#FF020700" FontStretch="Normal" />
            <Button Content="Online list" Height="72" HorizontalAlignment="Left" Margin="30,526,0,0" Name="button1" VerticalAlignment="Top" Width="173" Click="button1_Click" />
            <ListBox Background="White" FontStretch="Normal" Foreground="#FF020700" Height="451" HorizontalAlignment="Left" Margin="30,10,0,0" Name="onlinelist"  VerticalAlignment="Top" Width="393" SelectionChanged="onlinelist_SelectionChanged" />
        </Grid>
    </Grid>

wp7 cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
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 Microsoft.Phone.Controls;
using System.Net.Sockets;
using System.Threading;
using System.Text;
namespace WeiboSdkSample.PageViews
{
    public partial class chat : PhoneApplicationPage
    {
        Socket s = null;
        /// <summary>
        /// 枚举状态字
        /// </summary>
        enum ClientStatus : byte
        {
            Connecting, Connected, Receiving, Received, Shutting, Shutted
        } 
        /// <summary>
        /// clientStatus 表示当前连接状态
        /// </summary>
        ClientStatus clientStatus = ClientStatus.Shutted;
        static ManualResetEvent done = new ManualResetEvent(false);
         public chat()
        {
            InitializeComponent();
            bool retVal=EstablishTCPConnection("222.27.111.87", int.Parse("8888"));
        }
        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonSend_Click(object sender, RoutedEventArgs e)
        {
            Send(textBoxTextToSend.Text);
        }
        /// <summary>
        /// 连接服务器
        /// </summary>
        /// <param name="host"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        public bool EstablishTCPConnection(string host, int port)
        {
            s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
            socketEventArg.RemoteEndPoint = new DnsEndPoint(host, port);
            socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object o, SocketAsyncEventArgs e)
            {
                if (e.SocketError != SocketError.Success)
                {

                    if (e.SocketError == SocketError.ConnectionAborted)
                    {
                        Dispatcher.BeginInvoke(() => MessageBox.Show("连接超时请重试! " + e.SocketError));
                    }
                    else if (e.SocketError == SocketError.ConnectionRefused)
                    {
                        Dispatcher.BeginInvoke(() => MessageBox.Show("服务器端问启动" + e.SocketError));
                    }
                    else
                    {
                        Dispatcher.BeginInvoke(() => MessageBox.Show("出错了" + e.SocketError));
                    }
                }
                else
                {
                    //连接成功 开启一个线程循环接收消息
                    Thread th = new Thread(new ThreadStart(Receive));
                    th.Start();
                    //添加服务器到在线列表
                    Dispatcher.BeginInvoke(() => onlinelist.Items.Add("  小i"));
                }
                done.Set();

            });
            done.Reset();
            s.ConnectAsync(socketEventArg);
            clientStatus = ClientStatus.Connecting;
            return done.WaitOne(10000);
        }
        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public bool Send(string data)
        {
            if (s != null)
            {
                SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
                socketEventArg.RemoteEndPoint = s.RemoteEndPoint;
                socketEventArg.UserToken = null;

                socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object o, SocketAsyncEventArgs e)
                {
                    done.Set();
                });

                socketEventArg.SetBuffer(Encoding.UTF8.GetBytes(data), 0, Encoding.UTF8.GetBytes(data).Length);
                done.Reset();
                s.SendAsync(socketEventArg);
                chatlistbox.Items.Add(" 我:" + data);
                return done.WaitOne(10000);
            }
            return false;
        }
        /// <summary>
        /// 循环接收消息
        /// </summary>
        public void Receive()
        {
            string received = "";
            var socketReceiveArgs = new SocketAsyncEventArgs();
            while (clientStatus != ClientStatus.Shutted)
            {
                switch (clientStatus)
                {
                    case ClientStatus.Connecting:
                        {
                            socketReceiveArgs.SetBuffer(new byte[512], 0, 512);
                            socketReceiveArgs.Completed += delegate(object sender1, SocketAsyncEventArgs receiveArgs)
                            {
                                if (receiveArgs.SocketError == SocketError.Success)
                                {

                                    if (clientStatus != ClientStatus.Shutting)
                                    {
                                        if (receiveArgs.BytesTransferred == 0)
                                            clientStatus = ClientStatus.Shutting;
                                        else
                                        {
                                            clientStatus = ClientStatus.Received;
                                            received = Encoding.UTF8.GetString(receiveArgs.Buffer, receiveArgs.Offset, receiveArgs.BytesTransferred);
                                           // MessageBox.Show(received);
                                            Dispatcher.BeginInvoke(() => chatlistbox.Items.Add(" 小i:" + received));

                                           
                                        }
                                    }
                                }
                                else
                                    clientStatus = ClientStatus.Shutting;
                            };
                            clientStatus = ClientStatus.Receiving;
                            s.ReceiveAsync(socketReceiveArgs);

                            break;
                        }
                    case ClientStatus.Received:
                        {
                            clientStatus = ClientStatus.Receiving;
                            s.ReceiveAsync(socketReceiveArgs);
                            break;
                        }
                    case ClientStatus.Shutting:
                        {
                            s.Close();
                            clientStatus = ClientStatus.Shutted;
                            break;
                        }
                }
            }
        }
        public void CloseSocket()
        {
            if (s != null)
            {
                s.Close();
            }
        }
        /// <summary>
        /// 这个listbox在线列表是项目需要加加上来的,你们删掉吧。。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void onlinelist_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            onlinelist.Visibility = Visibility.Collapsed;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            onlinelist.Visibility = onlinelist.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
        }
    }
}

控制台:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static Socket clientSocket=null;
        Socket serverSocket = null;
        static void Main(string[] args)
        {
            Console.WriteLine("----------------------windows phone7 socket server------------------------");
            IPEndPoint id = new IPEndPoint(IPAddress.Parse("222.27.111.87"), 8888);
            Console.WriteLine("local address:"+id.Address+"Port:"+id.Port);
            Console.WriteLine("---input message and press enter to send your message to all client--- ");
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(id);
            serverSocket.Listen(10);
            while (true)
             {
                try
                 {
                    //在套接字上接收接入的连接
                    clientSocket = serverSocket.Accept();
                    //开一个线程处理
                    Thread clientThread = new Thread(new ThreadStart(ReceiveData));
                    clientThread.Start();
            }
            catch (Exception ex)
             {
            }
        }

    }
    private static void ReceiveData()
        {
           //状态
           bool keepalive = true;
           Socket s = clientSocket;
           Byte[] buffer = new Byte[1024];
           //根据收听到的客户端套接字向客户端发送信息
           IPEndPoint clientep = (IPEndPoint)s.RemoteEndPoint;
           Console.WriteLine("Client:" + clientep.Address + "("+clientep.Port+")"+"上线了");
           string welcome = "欢迎使用XXX,您已登录成功";
           byte[] data = new byte[1024];
           data = Encoding.UTF8.GetBytes(welcome);
           s.Send(data, data.Length, SocketFlags.None);
           //开启新线程处理用户输入 换行后发送消息
           Thread clientThread = new Thread(new ThreadStart(delegate (){
               while (keepalive)
               {
                   var newMessage = Console.KeyAvailable ? Console.ReadLine() : null;
                   if (newMessage != null)
                   {
                       data = Encoding.UTF8.GetBytes(newMessage); 
                       s.Send(data, data.Length, SocketFlags.None);
                   }
               }
           })); clientThread.Start();
           while (keepalive)
            {
               //在套接字上接收客户端发送的信息
               int bufLen = 0;
               try
                {
                   bufLen = s.Available;
                   s.Receive(buffer, 0, bufLen, SocketFlags.None);
                   if (bufLen == 0)
                       continue;
               }
               catch (Exception ex)
                {
                   Console.WriteLine("Client:" + clientep.Address + "(" + clientep.Port + ")" + "下线了");
                   keepalive = false;
                   return;
               }
               clientep = (IPEndPoint)s.RemoteEndPoint;
               string clientcommand = System.Text.Encoding.ASCII.GetString(buffer).Substring(0, bufLen);
               Console.WriteLine("wp7:"+clientcommand);
           }
}
    }
}

仓促作品,不善之处 ,望请指教

本博客地址http://www.cnblogs.com/shit

posted @ 2012-04-11 09:20  newShit  阅读(4165)  评论(16编辑  收藏  举报