windowsphone socket聊天

starskun888 2013-04-11 12:11:35
private void OutputMessage(string data)
{

// 在聊天文本框中输出指定的信息,并将滚动条滚到底部
this.Dispatcher.BeginInvoke(
delegate
{
chatmessage.Items.Add(tblock.Text + DateTime.Now.ToShortTimeString() + "\r\n" + data + "\r\n");
//chatmessage.Items.Add( data + "\r\n");

}
);
}
为什么使用chatmessage.Items.Add(tblock.Text + DateTime.Now.ToShortTimeString() + "\r\n" + data + "\r\n");服务器转发 会发很多空信息
而使用chatmessage.Items.Add( data + "\r\n");就不会。
...全文
106 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
littleluoron 2013-04-11
  • 打赏
  • 举报
回复
你debug了吗?看看data里面的结果是否一样?如果一样,那么就在转发的过程中第一条add的值(tblock.Text)存在某些服务器的关键字,被疲敝了。最好的办法就是debug。 不过,你的意思是偶尔会出现空信息?还是只要用第一个add就会出现空信息?
starskun888 2013-04-11
  • 打赏
  • 举报
回复
<StackPanel Grid.Row="0" Margin="12,17,0,28"> <TextBlock Name="tblock" Text="会话" 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"> <ListBox Background="White" Foreground="Black" Name="chatmessage" HorizontalAlignment="Left" Height="561" VerticalAlignment="Top" Width="456" Margin="0,-14,0,0"/> <TextBox Background="White" Name="sendmassage" HorizontalAlignment="Left" Height="72" Margin="-10,552,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="355"/> <Button Content="发送" HorizontalAlignment="Left" Margin="345,552,-14,0" VerticalAlignment="Top" Click="Button_Click_1" Width="125"/> </Grid>
starskun888 2013-04-11
  • 打赏
  • 举报
回复
namespace 控制台服务器 { class Listener { private TcpListener _tcpl = null; private const int _maxPacket = 64 * 1024; private Hashtable hashtable = new Hashtable(); public void StarUp() { IPHostEntry ipep = Dns.Resolve(Dns.GetHostName()); IPEndPoint ip = new IPEndPoint(ipep.AddressList.First(),8888); _tcpl = new TcpListener(ip); _tcpl.Start(); Console.WriteLine("服务器已启动,正在监听....."); Console.WriteLine(string.Format("服务器IP与端口{0}",ip)); while (true) { byte[] packetBuff=new byte[_maxPacket]; Socket newClient = _tcpl.AcceptSocket(); newClient.Receive(packetBuff); string userName = Encoding.Unicode.GetString(packetBuff).TrimEnd('\0'); if (hashtable.Count != 0 && hashtable.ContainsKey(userName)) { newClient.Send(Encoding.Unicode.GetBytes("登录失败\n")); continue; } else { newClient.Send(Encoding.Unicode.GetBytes("登录成功\n")); } hashtable .Add(userName, newClient);//添加哈希表键值对 //----------------------- string svrlog = string.Format("[系统消息]新用户 {0} 在 {1} 已连接... 当前在线人数: {2}\r\n\r\n", userName, DateTime.Now, hashtable.Count); Console.WriteLine(svrlog); //------------------------ Thread clientThread = new Thread(new ParameterizedThreadStart(ThreadFunc)); clientThread.Start(userName); } } private void ThreadFunc(object obj) { Socket clientSkt = hashtable[obj] as Socket; while (true) { try { byte[] _cmdBuff = new byte[128]; clientSkt.Receive(_cmdBuff); string _receiver = Encoding.Unicode.GetString(_cmdBuff).TrimEnd('\0'); byte[] _packetBuff = new byte[_maxPacket]; clientSkt.Receive(_packetBuff); if (hashtable.ContainsKey(_receiver)) { //通过转发表查找接收方的套接字 Socket receiverSkt = hashtable[_receiver] as Socket; receiverSkt.Send(_packetBuff); } else { string sysMessage = string.Format("[系统消息]您刚才的内容没有发送成功。\r\n可能原因:用户 {0} 已离线或者网络阻塞。\r\n\r\n", _receiver); clientSkt.Send(Encoding.Unicode.GetBytes(sysMessage)); } } catch (SocketException) { hashtable.Remove(obj); string svrlog = string.Format("[系统消息]用户 {0} 的客户端在 {1} 意外终止!当前在线人数:{2}\r\n\r\n", obj, DateTime.Now, hashtable.Count); Console.WriteLine(svrlog); ////向所有客户机发送系统消息 //foreach (DictionaryEntry de in hashtable) //{ // string _clientName = de.Key as string; // Socket _clientSkt = de.Value as Socket; // _clientSkt.Send(Encoding.Unicode.GetBytes(svrlog)); //} Console.WriteLine(); Thread.CurrentThread.Abort(); } } } } }
starskun888 2013-04-11
  • 打赏
  • 举报
回复
引用 3 楼 littleluoron 的回复:
你可以尝试一下把第一条的replace("\r\n","#")之后,到了server再replace("#","\r\n")试试。我觉得可能是不能有\r\n。但是好像我的软件用Socket没有这个情况。所以我就不太清楚你的了 不过,能否把两个add的值写出来?俺分析分析
namespace LINE { public partial class Page5 : PhoneApplicationPage { // 客户端 Socket private Socket _socket; // 用于发送数据到服务端的 Socket 异步操作对象 private SocketAsyncEventArgs _socketAsyncSend; // 用于接收数据的 Socket 异步操作对象 private SocketAsyncEventArgs _socketAsyncReceive; public Page5() { InitializeComponent(); } private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) { tblock.Text = (App.Current as App).friend; _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 实例化 SocketAsyncEventArgs ,用于对 Socket 做异步操作,很方便 _socketAsyncReceive = new SocketAsyncEventArgs(); // 服务器的 EndPoint _socketAsyncReceive.RemoteEndPoint = new DnsEndPoint("192.168.1.195", 8888); // 异步操作完成后执行的事件 _socketAsyncReceive.Completed += new EventHandler<SocketAsyncEventArgs>(OnSocketConnectCompleted); // 异步连接服务端 _socket.ConnectAsync(_socketAsyncReceive); } private void OnSocketConnectCompleted(object sender, SocketAsyncEventArgs e) { if (e.SocketError != SocketError.Success) { OutputMessage("Socket 连接错误:" + e.SocketError.ToString()); return; } // 设置数据缓冲区 byte[] response = new byte[1024]; e.SetBuffer(response, 0, response.Length); // 修改 SocketAsyncEventArgs 对象的异步操作完成后需要执行的事件 e.Completed -= new EventHandler<SocketAsyncEventArgs>(OnSocketConnectCompleted); e.Completed += new EventHandler<SocketAsyncEventArgs>(OnSocketReceiveCompleted); // 异步地从服务端 Socket 接收数据 _socket.ReceiveAsync(e); //// 构造一个 SocketAsyncEventArgs 对象,用于用户向服务端发送消息 _socketAsyncSend = new SocketAsyncEventArgs(); _socketAsyncSend.RemoteEndPoint = e.RemoteEndPoint; if (_socket.Connected) { _socketAsyncSend.BufferList = new List<ArraySegment<byte>>() { new ArraySegment<byte>(UTF8Encoding.Unicode.GetBytes((App.Current as App).a )) }; // 异步地向服务端发送消息 _socket.SendAsync(_socketAsyncSend); } else { OutputMessage("无法连接到服务器"); } } private void OnSocketReceiveCompleted(object sender, SocketAsyncEventArgs e) { try { // 将接收到的数据转换为字符串 string data = UTF8Encoding.Unicode.GetString(e.Buffer, e.Offset, e.BytesTransferred); OutputMessage(data); } catch (Exception ex) { OutputMessage(ex.ToString()); } // 继续异步地从服务端接收数据 _socket.ReceiveAsync(e); } private void OutputMessage(string data) { // 在聊天文本框中输出指定的信息 this.Dispatcher.BeginInvoke( delegate { //chatmessage.Items.Add(tblock.Text + DateTime.Now.ToShortTimeString() + "\r\n" + data + "\r\n"); chatmessage.Items.Add(data + "\r\n"); } ); } private void SendData() { if (sendmassage.Text == "") { MessageBox.Show("发送的内容不能为空"); } else { if (_socket.Connected) { _socketAsyncSend = new SocketAsyncEventArgs(); _socketAsyncSend.RemoteEndPoint = new DnsEndPoint("192.168.1.195", 8888); // 设置需要发送的数据的缓冲区 _socketAsyncSend.BufferList = new List<ArraySegment<byte>>() { new ArraySegment<byte>(UTF8Encoding.Unicode.GetBytes(sendmassage.Text)) }; // 异步地向服务端发送消息 _socket.SendAsync(_socketAsyncSend); //chatmessage.Items.Add ((App.Current as App).a + DateTime.Now.ToShortTimeString() + "\r\n" + sendmassage.Text); chatmessage.Items.Add(sendmassage.Text ); sendmassage.Text = ""; } else { chatmessage.Items.Add("无法连接到服务器\r\n"); } } } private void Button_Click_1(object sender, RoutedEventArgs e) { _socketAsyncSend = new SocketAsyncEventArgs(); _socketAsyncSend.RemoteEndPoint = new DnsEndPoint("192.168.1.195", 8888); // 设置需要发送的数据的缓冲区 _socketAsyncSend.BufferList = new List<ArraySegment<byte>>() { new ArraySegment<byte>(UTF8Encoding.Unicode.GetBytes(tblock.Text )) }; // 异步地向服务端发送消息 _socket.SendAsync(_socketAsyncSend); SendData(); } } }[align=left]
littleluoron 2013-04-11
  • 打赏
  • 举报
回复
你可以尝试一下把第一条的replace("\r\n","#")之后,到了server再replace("#","\r\n")试试。我觉得可能是不能有\r\n。但是好像我的软件用Socket没有这个情况。所以我就不太清楚你的了 不过,能否把两个add的值写出来?俺分析分析
starskun888 2013-04-11
  • 打赏
  • 举报
回复
引用 1 楼 littleluoron 的回复:
你debug了吗?看看data里面的结果是否一样?如果一样,那么就在转发的过程中第一条add的值(tblock.Text)存在某些服务器的关键字,被疲敝了。最好的办法就是debug。 不过,你的意思是偶尔会出现空信息?还是只要用第一个add就会出现空信息?
只要用第一个ADD就会出现空信息。 data里面的结果一样。运行的也一样。。但是信息空的时候 并没有表现出来,也没有换行

110,547

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧