A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 qiumanlover 于 2013-5-29 13:47 编辑

服务端和客户端是一样的程序,即只有一个程序,开两个,绑定不同地址,然后实现通讯。
发送消息是通过监听TextBox的KeyDown事件实现的,接收消息是放在线程里的
现在的问题是:两边的程序只能接受一次对方的消息,此后就收不到了
如果将接受消息的方法放在按键事件里,则会卡住输入框,直到收到对面的消息
源码如下:
  1. using System;
  2. using System.Text;
  3. using System.Windows.Forms;
  4. using System.Net.Sockets;
  5. using System.Net;
  6. using System.Threading;

  7. namespace UDP_SYN
  8. {
  9.         public partial class UDPClient : Form
  10.         {
  11.                 private IPEndPoint localIpe = null;                                //本地节点
  12.                 private Socket localSock = null;                                //绑定本地节点的套接字
  13.                 private static IPEndPoint remoteIpe = null;                //远程结点
  14.                 private EndPoint Remote = null;                                        //用于接收消息的抽象对象结点
  15.                 private byte[] sendbuff = new byte[1024];                //发送缓冲区
  16.                 private byte[] recvbuff = new byte[1024];                //接收缓冲区
  17.                 private int msgLen;                                                                //接收的数据的字节长度

  18.                 public UDPClient()
  19.                 {
  20.                         CheckForIllegalCrossThreadCalls = false;
  21.                         InitializeComponent();
  22.                         TextBox.CheckForIllegalCrossThreadCalls = false;        //关闭文本框的跨线程检查
  23.                 }

  24.                 private void Form1_Load(object sender, EventArgs e)
  25.                 {
  26.                         button1.Enabled = true;
  27.                         txtSend.Enabled = false;
  28.                 }

  29.                 private void button1_Click(object sender, EventArgs e)
  30.                 {
  31.                         localIpe = new IPEndPoint(IPAddress.Parse(txtLocalIP.Text.ToString().Trim()),
  32.                                 Convert.ToInt32(txtLocalPort.Text.ToString().Trim()));
  33.                         localSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  34.                         remoteIpe = new IPEndPoint(IPAddress.Parse(txtRemoteIP.Text.ToString().Trim()),
  35.                                 Convert.ToInt32(txtRemotePort.Text.ToString().Trim()));

  36.                         localSock.Bind(localIpe);

  37.                         Thread startThrd = new Thread(new ThreadStart(RecvThrd));
  38.                         startThrd.IsBackground = true;
  39.                         startThrd.Start();

  40.                         //处理按键之后的页面布局,阻止修改配置
  41.                         txtSend.Enabled = true;
  42.                         button1.Enabled = false;
  43.                         txtLocalIP.Enabled = false;
  44.                         txtLocalPort.Enabled = false;
  45.                         txtRemoteIP.Enabled = false;
  46.                         txtRemotePort.Enabled = false;
  47.                         txtSend.Focus();

  48.                 }

  49.                 //按下回车键发送消息,并显示在自己的接收消息窗口
  50.                 private void txtSend_KeyDown(object sender, KeyEventArgs e)
  51.                 {
  52.                         if (e.KeyCode == Keys.Enter)
  53.                         {
  54.                                 try
  55.                                 {
  56.                                         sendbuff = Encoding.ASCII.GetBytes(txtSend.Text.ToString());
  57.                                         localSock.SendTo(sendbuff, remoteIpe);
  58.                                         txtRecv.AppendText(localSock.LocalEndPoint.ToString() + "  " +
  59.                                                 DateTime.Now.ToString() + "  " + remoteIpe.ToString()
  60.                                                 + "\r\n\t" + txtSend.Text.ToString() + "\r\n");
  61.                                         SendKeys.Send("{BackSpace}");
  62.                                         txtSend.Clear();
  63.                                 }
  64.                                 catch (Exception ex)
  65.                                 {
  66.                                         MessageBox.Show(ex.ToString());
  67.                                 }
  68.                         }
  69.                 }

  70.                 //接收消息的方法,放入线程,防止阻塞当前窗口
  71.                 private void RecvThrd()
  72.                 {
  73.                         Remote = (EndPoint)(remoteIpe);
  74.                         msgLen = localSock.ReceiveFrom(recvbuff, ref Remote);
  75.                         Remote = (EndPoint)(remoteIpe);
  76.                         ShowMsg(Encoding.ASCII.GetString(recvbuff, 0, msgLen));

  77.                 }

  78.                 public void ShowMsg(string str)
  79.                 {
  80.                         txtRecv.AppendText(Remote.ToString() + "  " + DateTime.Now.ToString()
  81.                                 + "  " + Remote.ToString() + "\r\n\t" + str + "\r\n");
  82.                 }
  83.         }
  84. }
复制代码

3 个回复

倒序浏览
把接收消息在方法里加个死循环  就能不断接收消息
回复 使用道具 举报
淡.。 发表于 2013-5-28 22:40
把接收消息在方法里加个死循环  就能不断接收消息

谢谢提醒,那天灵感来了想起来的,不过后来忘了,还是谢谢你
回复 使用道具 举报
Form1_Load里开一个线程Thread startThrd = new Thread(new ThreadStart(RecvThrd));
然后死循环
While(Listen....)
{
    Receive......
}

发送信息使用UI线程~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马