using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Web;
namespace test
{
public partial class Form1 : Form
{
private static UdpClient m_Client;
private static int ListenerPort = 9000;
private static int SenderPort = 9000;
private static int LocalPort;
private static int RemotePort;
private static string m_szHostName;
private static IPAddress m_GroupAddress_C;
private static IPAddress m_GroupAddress_S;
private static IPHostEntry m_LocalHost;
private static IPEndPoint m_RemoteEP;
private Thread th;
public Form1()
{
InitializeComponent();
//Control.CheckForIllegalCrossThreadCalls = false;
}
private void Form1_Load(object sender, EventArgs e)
{
LocalPort = SenderPort;
RemotePort = ListenerPort;
m_szHostName = Dns.GetHostName();
m_LocalHost = Dns.GetHostByName(m_szHostName);
textBox2.Text = m_LocalHost.AddressList[0].ToString();
Initialize();
th = new Thread(new ThreadStart(Listener));
th.Start();
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text.Trim() == "")
{
MessageBox.Show("发送字符不允许为空");
return;
}
m_GroupAddress_S = IPAddress.Parse(textBox2.Text); //要发送到的计算机IP
m_RemoteEP = new IPEndPoint(m_GroupAddress_S, RemotePort);
Byte[] buffer = null;
Encoding ASCII = Encoding.ASCII;
string s = HttpUtility.UrlEncode(textBox1.Text);
textBox1.Text = "";
buffer = new Byte[s.Length + 1];
//
// 将数据发送给远程对方主机
//
int len = ASCII.GetBytes(s.ToCharArray(), 0, s.Length, buffer, 0);
int ecode = m_Client.Send(buffer, len, m_RemoteEP);
}
public void Terminate()
{
m_Client.DropMulticastGroup(m_GroupAddress_C);
}
public void Initialize()
{
//
// 实例化 UdpCLient
//
m_Client = new UdpClient(LocalPort);
//
// 创建对方主机的终结点
//
//m_GroupAddress_S = IPAddress.Parse("10.99.56.229"); //要发送到的计算机IP
//m_RemoteEP = new IPEndPoint(m_GroupAddress_S, RemotePort);
}
public void Listener()
{
//
// 创建多路广播组对象
//
System.Net.IPHostEntry localhost = Dns.GetHostByName(Dns.GetHostName());
string local_IP = localhost.AddressList[0].ToString();//接收消息的本地IP,用于监听
m_GroupAddress_C = IPAddress.Parse(local_IP);
//
// 联接组
//
try
{
m_Client.JoinMulticastGroup(m_GroupAddress_C, 100); //不添加到多路广播组也可以
}
catch (Exception err)
{
throw (err);//无法联接多路广播组
}
//
// 侦听器等待数据到来
// 并用缓冲区保存它。
Thread.Sleep(2000); // 确保 client2 正在接收
Encoding ASCII = Encoding.ASCII;
// while(!m_Done)
while (true)
{
IPEndPoint endpoint = null;
endpoint = new IPEndPoint(m_GroupAddress_C,LocalPort);//这句代码不要也可以
try
{
Byte[] data = m_Client.Receive(ref endpoint);
String strData = HttpUtility.UrlDecode(ASCII.GetString(data));
//listBox1.Items.Add(strData);
ReceiveCallBack rc = new ReceiveCallBack(writeReceive);
this.Invoke(rc, new object[] { strData });
}
catch(Exception ex)
{
//throw ex;
}
}
}
private delegate void ReceiveCallBack(string str);
public void writeReceive(string str)
{
listBox1.Items.Add(str);
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
try
{
if (th != null)
{
if (th.IsAlive)
{
th.Abort();
}
th = null;
}
}
catch
{
try
{
System.Threading.Thread.ResetAbort();
}
catch
{ }
}
Terminate();
m_Client.Close();
}
catch
{
}
}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
button1_Click(null, null);
}
}
}
}