黑马程序员技术交流社区

标题: 在线聊天室的问题 [打印本页]

作者: hehe04    时间: 2012-8-31 23:35
标题: 在线聊天室的问题
看了在线聊天室的视频,我想实现客户端向指定客户端发送消息,但是在推送在线列表的时候遇到了问题,大家帮忙看看。
打开第一个客户端,第二个客户端都没有问题,

但是到第三个客户端就会出现这样的问题



有时第三个客户端出现 ,有时第四个时出现,有时连续7,8个客户端都不会出现此问题,真是见鬼了


这是服务端代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Net.Sockets;
  9. using System.Net;
  10. using System.Threading;
  11. using System.IO;
  12. namespace Server
  13. {
  14.     public partial class FormSrv : Form
  15.     {
  16.         public FormSrv()
  17.         {
  18.             InitializeComponent();
  19.             TextBox.CheckForIllegalCrossThreadCalls = false;
  20.         }

  21.         Socket watchSocket = null;
  22.         Socket connSocket = null;
  23.         Dictionary<string, Socket> connDictionary = new Dictionary<string, Socket>();
  24.         Dictionary<string, Thread> recThreadDic = new Dictionary<string, Thread>();
  25.         private void buttonSrvStart_Click(object sender, EventArgs e)
  26.         {

  27.             watchSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);;
  28.             IPAddress IP = IPAddress.Parse(textBoxIP.Text.Trim());
  29.             IPEndPoint port = new IPEndPoint(IP, int.Parse(textBoxPort.Text.Trim()));
  30.             watchSocket.Bind(port);
  31.             watchSocket.Listen(10);
  32.             Thread watchThread = new Thread(StartSrv);
  33.             watchThread.Start();
  34.             showMsg("服务成功启动,等待客户端连接………………\n");

  35.         }
  36.         private void showMsg(string Msg)
  37.         {
  38.             textBoxMsg.AppendText(Msg);
  39.         }

  40.         private void StartSrv()
  41.         {
  42.             connSocket = watchSocket.Accept();
  43.             connDictionary.Add(connSocket.RemoteEndPoint.ToString(), connSocket);
  44.             listBoxClient.Items.Add(connSocket.RemoteEndPoint);
  45.             showMsg("连接成功!\n");
  46.             Thread threadRecieveMsg = new Thread(RecieveMsg);
  47.             threadRecieveMsg.Start(connSocket);
  48.             recThreadDic.Add(connSocket.RemoteEndPoint.ToString().Trim(), threadRecieveMsg);
  49.             
  50.             //推送在线列表
  51.             foreach (Socket s in connDictionary.Values)
  52.             {
  53.                 foreach (string item in connDictionary.Keys)
  54.                 {
  55.                     if (item != s.RemoteEndPoint.ToString())
  56.                     {
  57.                         byte[] byteListBox = Encoding.Default.GetBytes(item);
  58.                         byte[] newByteListBox = new byte[byteListBox.Length + 1];
  59.                         newByteListBox[0] = 2;
  60.                         Buffer.BlockCopy(byteListBox, 0, newByteListBox, 1, byteListBox.Length);
  61.                         s.Send(newByteListBox);
  62.                     }
  63.                 }
  64.             }
  65.             //递归
  66.             StartSrv();
  67.             
  68.         }

  69.         private void buttonSend_Click(object sender, EventArgs e)
  70.         {
  71.             string strMsg = textBoxSendMsg.Text.Trim();
  72.             byte[] bytearr = System.Text.Encoding.Default.GetBytes(strMsg);
  73.             connDictionary[listBoxClient.SelectedItem.ToString()].Send(bytearr);
  74.             showMsg("发送了消息:" + strMsg + "\r\n");
  75.         }
  76.         private void RecieveMsg(object socket)
  77.         {
  78.             while (true)
  79.             {
  80.                 Socket socket1 = socket as Socket;
  81.                 byte[] byteMsg = new byte[1024 * 1024 * 2];
  82.                 int RecieveLength = socket1.Receive(byteMsg);
  83.                 if (byteMsg[0] == 0)
  84.                 {
  85.                     string strMsg = Encoding.Default.GetString(byteMsg, 0, RecieveLength);
  86.                     showMsg(strMsg + "\r\n");
  87.                 }
  88.                 else if(byteMsg[0]==1)
  89.                 {
  90.                     SaveFileDialog sfd = new SaveFileDialog();
  91.                     if (sfd.ShowDialog() == DialogResult.OK)
  92.                     {
  93.                         using (FileStream fs = new FileStream(sfd.FileName, FileMode.Create))
  94.                         {
  95.                             fs.Write(byteMsg, 1, RecieveLength - 1);
  96.                             showMsg("保存成功:" + sfd.FileName);
  97.                         }
  98.                     }
  99.                 }

  100.             }
  101.    
  102.         }

  103.         private void textBoxSendMsg_TextChanged(object sender, EventArgs e)
  104.         {

  105.         }

  106.         private void buttonSends_Click(object sender, EventArgs e)
  107.         {
  108.             string strMsg = textBoxSendMsg.Text.Trim();
  109.             byte[] byteMsg = Encoding.Default.GetBytes(strMsg);
  110.             foreach (Socket s in connDictionary.Values)
  111.             {
  112.                 s.Send(byteMsg);
  113.                 showMsg("群发消息:" + strMsg + "\r\n");
  114.             }
  115.         }
  116.       
  117.     }
  118. }
复制代码
这是客户端
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Net.Sockets;
  9. using System.Net;
  10. using System.Threading;
  11. using System.IO;
  12. namespace Client
  13. {
  14.     public partial class FormClient : Form
  15.     {
  16.         public FormClient()
  17.         {
  18.             InitializeComponent();
  19.             TextBox.CheckForIllegalCrossThreadCalls = false;
  20.         }


  21.         Socket clientSocket = null;
  22.         IPAddress ip = null;
  23.         IPEndPoint port = null;
  24.         private void buttonConn_Click(object sender, EventArgs e)
  25.         {
  26.             clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
  27.             ip = IPAddress.Parse(textBoxIP.Text.Trim());
  28.             port = new IPEndPoint(ip,int.Parse(textBoxPort.Text.Trim()));
  29.             clientSocket.Connect(port);
  30.             showMsg("与服务器连接成功"+"\r\n");
  31.             Thread receiveThread = new Thread(ReceiveMsg);
  32.             receiveThread.Start();
  33.         }
  34.         private void showMsg(string msg)
  35.         {
  36.             textBoxMsg.AppendText(msg);
  37.         }
  38.         private void ReceiveMsg()
  39.         {
  40.             while (true)
  41.             {
  42.                 byte[] arrMsg = new byte[1024 * 1024 * 2];
  43.                 int msgLength = clientSocket.Receive(arrMsg);
  44.                 if (arrMsg[0] == 2)//如果传过来第一个字符是2就是在线列表
  45.                 {
  46.                     string item = Encoding.Default.GetString(arrMsg, 1, msgLength - 1);
  47.                     listBoxOnline.Items.Add(item);
  48.                 }
  49.                 else
  50.                 {
  51.                     string strMsg = Encoding.Default.GetString(arrMsg, 0, msgLength);
  52.                     textBoxMsg.AppendText(strMsg + "\r\n");
  53.                 }
  54.             }
  55.         }

  56.         private void buttonSend_Click(object sender, EventArgs e)
  57.         {
  58.             string strMsg = textBoxSendMsg.Text.Trim();
  59.             byte[] byteMsg = Encoding.Default.GetBytes(strMsg);
  60.             clientSocket.Send(byteMsg);
  61.             showMsg("发送消息:" + strMsg + "\r\n");
  62.         }

  63.         private void buttonFilePath_Click(object sender, EventArgs e)
  64.         {
  65.             OpenFileDialog ofd = new OpenFileDialog();
  66.             if (ofd.ShowDialog() != DialogResult.OK)
  67.             {
  68.                 return;
  69.             }
  70.             textBoxFilePath.Text = ofd.FileName;
  71.      
  72.         }
  73.         
  74.         private void buttonFileSend_Click(object sender, EventArgs e)
  75.         {
  76.             using (FileStream fs = new FileStream(textBoxFilePath.Text, FileMode.Open))
  77.             {
  78.                 byte[] byteMsg = new byte[1024 * 1024 * 2];
  79.                 byteMsg[0] = 1;
  80.                 int fileLength = fs.Read(byteMsg, 1, byteMsg.Length - 1);
  81.                 clientSocket.Send(byteMsg);
  82.                 showMsg("发送成功");
  83.             }

  84.         }
  85.         
  86.     }
  87. }
复制代码

作者: 尹晓乐    时间: 2012-9-2 07:00
这是新手写的吗? 感觉自学压力好大.得努力了.....
作者: 资建文    时间: 2012-9-3 10:06
没有设置断点看看么




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2