本例实现一个简单的控制台与wp7端的聊天对话。采用多线程处理接入的客户端。代码都贴上来吧。注释写的很明白了应该。
xaml文件:
wp7 cs:
控制台:
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);
- }
- }
- }
- }