求助:C#实现局域网内两个进程通信 A、B两个进程,某一事件触发A给B发一个消息(内容不定,"123"),B一直处于监听状态,一旦受到消息("123"),便执行另一个操作,执行完成后,继续监听。谢谢... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 采用通道进行处理吧!!!! --reply by CSDN Study Trial V1.0.1 (starts_2000) 要用Socket加线程,如果你不了解,做起来比较麻烦。 我做过用ini文件来传递,进程1将数据写入ini文件,进程2再去读,我做的是两个完全独立的程序,他们之间的数据交换 线程 + socket单独开启一个线程监听某个端口,如果有消息,监听线程再开启另一个处理线程,自己继续监听,是这样的么?就是不知道怎么发消息,和怎么接收信息,谢谢。 http://download.csdn.net/source/2708345socket范例 你想用什么协议?socket中有TCP 和 UDP两种。TCP要写传输安全但效率差点UDP传的快,但不安全。数据少点可以用。类库中他们都有封装好的类,有发送和接收的方法。你只要调用方法就可以了。 用通道或内存映射文件System.IO.MemoryMappedFiles.MemoryMappedFile //B:接收端 private void Form1_Load(object sender, EventArgs e) { //监听所有ip IPEndPoint ipPoint = new IPEndPoint(IPAddress.Any, 8888); TcpListener tcpListener = new TcpListener(ipPoint); tcpListener.Start(); while (true) { //如果没有Connect请求 if (!tcpListener.Pending()) { Thread.Sleep(1000); continue; } //如果有Connect请求 Socket client = tcpListener.AcceptSocket(); //调用函数,接收发送端的信息 //接收发送端传过来的byte[] byte[] byte_content = ReceiveVarData(client); //将byte[]还原成字符串 string str_content = System.Text.Encoding.Unicode.GetString(byte_content); if(str_content=="123") { //你想执行的操作,写在这: } else { } //关闭套接字 client.Close(); } } //被调函数ReceiveVarData() //传入值:监听到的Socket. 返回值:发送端传过来的byte[] public static byte[] ReceiveVarData(Socket s) { int total = 0; int recv; //这个此报告发送端的byte[]中每次取个,存入到byte[] datasize中 //Socket.Receive(byte[] 存入哪个地方,) byte[] datasize = new byte[4]; recv = s.Receive(datasize, 0, 4, SocketFlags.None); //将datasize 中的四个元素转成一个整数. 从byte[]中第零个元素开始. int size = BitConverter.ToInt32(datasize, 0); int dataleft = size; byte[] data = new byte[size]; while (total < size) { recv = s.Receive(data, total, dataleft, SocketFlags.None); if (recv == 0) { data = null; break; } total += recv; dataleft -= recv; } return data; }//A:发送端 //点击按钮 发送信息 private void button1_Click(object sender, EventArgs e) { //实例化Socket Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //指定向哪个ip,哪个端口发送 IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.1.45"), 8888); //连接 client.Connect(ipPoint); //将字符串转换成byte[]发送 string str_content="123" byte[] byte_content=System.Text.Encoding.Unicode.GetBytes(str_content); //调用SendVarData发送信息 SendVarData(client, byte_content); //关闭Socket client.Close(); } //被调函数SendVarData //发送数据 public static int SendVarData(Socket s, byte[] data) { int total = 0; int size = data.Length; int dataleft = size; int sent; //这次发送让我很费解,不过去掉的话,程序就不可用 byte[] datasize = new byte[4]; datasize = BitConverter.GetBytes(size); sent = s.Send(datasize); //这次发送让我很费解 while (total < size) { sent = s.Send(data, total, dataleft, SocketFlags.None); total += sent; dataleft -= sent; } return total; } 在局域网上弄两台机器~~接收机用 B.exe发送机用 A.exe运行能看到效果 为什么不使用Remoting方式呢,通过HTTP通道,传递对象,进行相应 你是不是说RDP 协议啊 ? 谢谢大家 用hinada99的方法实现了 关于serialport 未能加载文件或程序集“Infragistics2.WebUI.UltraWebNavigator.v7.1, Version=7.1.20071.1061, 执行一条计算查询结果语句,返回查询结果 如何把一个数据中的所有表信息一次性添加到一个DATASET中 dfusion5的图形化是怎么开发的? 工程怎么分配多个模块? 问各位一下以前 vb中的Asc函数在c#中换成什么了? 非常不开心,公司经营出了问题,我要重新找工作了!~ 对dataset进行fill时出错 利用C#开发的WEB应用中如何向新打开的页面传递参数!30分 .CSV 文件导入到access 数据库中 求助webBrowser获取网页代码
如果你不了解,做起来比较麻烦。
就是不知道怎么发消息,和怎么接收信息,谢谢。
socket范例
socket中有TCP 和 UDP两种。TCP要写传输安全但效率差点
UDP传的快,但不安全。数据少点可以用。类库中他们都有封装好的类,有发送和接收的方法。
你只要调用方法就可以了。
private void Form1_Load(object sender, EventArgs e)
{
//监听所有ip
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Any, 8888);
TcpListener tcpListener = new TcpListener(ipPoint);
tcpListener.Start(); while (true)
{
//如果没有Connect请求
if (!tcpListener.Pending())
{
Thread.Sleep(1000);
continue;
} //如果有Connect请求
Socket client = tcpListener.AcceptSocket();
//调用函数,接收发送端的信息
//接收发送端传过来的byte[]
byte[] byte_content = ReceiveVarData(client);
//将byte[]还原成字符串
string str_content = System.Text.Encoding.Unicode.GetString(byte_content);
if(str_content=="123")
{
//你想执行的操作,写在这:
}
else
{ }
//关闭套接字
client.Close();
}
}
//被调函数ReceiveVarData()
//传入值:监听到的Socket. 返回值:发送端传过来的byte[]
public static byte[] ReceiveVarData(Socket s)
{
int total = 0;
int recv; //这个此报告发送端的byte[]中每次取个,存入到byte[] datasize中
//Socket.Receive(byte[] 存入哪个地方,)
byte[] datasize = new byte[4];
recv = s.Receive(datasize, 0, 4, SocketFlags.None); //将datasize 中的四个元素转成一个整数. 从byte[]中第零个元素开始.
int size = BitConverter.ToInt32(datasize, 0);
int dataleft = size;
byte[] data = new byte[size];
while (total < size)
{
recv = s.Receive(data, total, dataleft, SocketFlags.None);
if (recv == 0)
{
data = null;
break;
}
total += recv;
dataleft -= recv;
}
return data;
}
//A:发送端
//点击按钮 发送信息
private void button1_Click(object sender, EventArgs e)
{
//实例化Socket
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//指定向哪个ip,哪个端口发送
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.1.45"), 8888);
//连接
client.Connect(ipPoint);
//将字符串转换成byte[]发送
string str_content="123"
byte[] byte_content=System.Text.Encoding.Unicode.GetBytes(str_content);
//调用SendVarData发送信息
SendVarData(client, byte_content); //关闭Socket
client.Close();
} //被调函数SendVarData
//发送数据
public static int SendVarData(Socket s, byte[] data)
{
int total = 0;
int size = data.Length;
int dataleft = size;
int sent; //这次发送让我很费解,不过去掉的话,程序就不可用
byte[] datasize = new byte[4];
datasize = BitConverter.GetBytes(size);
sent = s.Send(datasize);
//这次发送让我很费解 while (total < size)
{
sent = s.Send(data, total, dataleft, SocketFlags.None);
total += sent;
dataleft -= sent;
}
return total;
}
接收机用 B.exe
发送机用 A.exe
运行能看到效果