• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

◥〓★〓◤-在线等待(QQ:9531511) 一个超难的问题,请版主予以解答或者其他有能力解决者(关于在IE中网页中嵌入.NET Windows 控件的难题)

stardicky 2005-01-17 11:50:45
这是一个示例程序,只是为了证明这个问题的存在性,(我怀疑这个是 Microsoft 的 Bug),这是一个嵌入在网页的Socket 通讯程序

我有两个Socket 服务器程序, 一个程序是侦听UDP 消息, 一个是侦听 TCP 消息

客户端是放在网页中的控件,注意 客户端的.NET 的安全性我已经设置成完全信任,所以应该不是安全性的问题

问题:
如果这个控件放在Web中,那么这两个客户端发送第一条消息的时候非常慢(大概2分钟后才发送成功),但是可以发送成功, 以后发送的消息就很快了!

如果这个控件放在WinForm中,发送消息很正常

代码如下:
TcpServer.cs

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace TcpServer
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
try
{
Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Any,5200);
server.Bind(ipep);
server.Listen(10);

Console.WriteLine("服务器套接字开始侦听......");

while(true)
{
Socket Client = server.Accept();
Console.WriteLine("发现一个客户端......");
byte[] buffer = new byte[1024];
Console.WriteLine("正在接收数据......");
int recv = Client.Receive(buffer);
Console.WriteLine(Encoding.Default.GetString(buffer,0,recv));
Console.WriteLine("正在发送数据......");
Client.Send(Encoding.Default.GetBytes(DateTime.Now.ToString()));
Client.Close();
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
}
}
}
}

//----------------------------------------------------------------------------------------
UdpServer.cs

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UdpServer
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Any,5201);
server.Bind(ipep);
IPEndPoint sender = new IPEndPoint(IPAddress.Any,0);
EndPoint Remote = (EndPoint)sender;
while(true)
{
byte[] buffer = new byte[1024];
Console.WriteLine("正在等待数据......");
int recv = server.ReceiveFrom(buffer,ref Remote);
Console.WriteLine("接收到数据......");
Console.WriteLine(Encoding.Default.GetString(buffer,0,recv));
Console.WriteLine("正在发送数据......");
server.SendTo(Encoding.Default.GetBytes(DateTime.Now.ToString()),Remote);
Console.WriteLine("数据发送完毕......");
}
}
}
}
//---------------------------------------------------------------------------------------
TcpClientControl.cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

using System.Net;
using System.Net.Sockets;
using System.Text;


namespace Control
{
public class UserControl1 : System.Windows.Forms.UserControl
{
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.Button button1;
...........................
...........................
private void button1_Click(object sender, System.EventArgs e)
{
try
{
Socket client = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.10.6"),5200);
client.Connect(ipep);

client.Send(Encoding.Default.GetBytes(this.textBox1.Text.Trim()));

byte[] buffer = new byte[1024];

int recv = client.Receive(buffer);

this.textBox2.Text = Encoding.Default.GetString(buffer,0,recv);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message + "\n" + ex.StackTrace);
}
}
}
}

//-------------------------------------------------------------------------------------
UdpClientControl.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UdpControl
{
public class UserControl1 : System.Windows.Forms.UserControl
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.TextBox textBox1;
.....................................................
.....................................................
private void button1_Click(object sender, System.EventArgs e)
{
byte[] buffer = new byte[1024];

IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.10.6"),5201);

Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);

server.SendTo(Encoding.Default.GetBytes(this.textBox1.Text.Trim()),ipep);

IPEndPoint Sender = new IPEndPoint(IPAddress.Any,0);

EndPoint Remote = (EndPoint)Sender;

int recv = server.ReceiveFrom(buffer,ref Remote);

this.textBox2.Text = Encoding.Default.GetString(buffer,0,recv);
}
}
}


//-------------------------------------------
网页代码.....
,.......
...全文
1050 点赞 收藏 83
写回复
83 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
marvelstack 2005-01-23
http://blog.csdn.net/zhzuo/category/82770.aspx
回复
CROWN 2005-01-22
我也觉得是的,有一个办法,可以解决 在客户端装 Framework 2.0 可以解决这个问题!

TO:pray1997(pray1997)

谢谢了!
回复
qozms 2005-01-21
haha
回复
kentpower 2005-01-21
关注!!!
回复
xueqs 2005-01-21
gz
回复
844 2005-01-21
关注!!!

大家也关注下我的贴子!!!

http://community.csdn.net/Expert/topic/3742/3742940.xml?temp=.7004206

回复
stardicky 2005-01-21
谢谢大家的支持,我们一起来探讨这个问题!
回复
stardicky 2005-01-21
Activex 控件是绝对行的,但是不能回避这个问题!

代码是对的,我觉得是IE 安全的问题,就是不知道在哪里做手脚而已!
回复
north_star 2005-01-21
你不妨使用VB6再作一个客户端的控件,先确定是那端的问题,正在试验中
回复
programmer11 2005-01-21
好难哦,帮你顶
回复
lhsoft 2005-01-21
mark
回复
盗奶的夜猫 2005-01-21
学习关注中
回复
stardicky 2005-01-21
其实我原来的代码就是异步通讯的,后来为了简单地说明问题的存在,所以就写成了同步通讯!

但是问题没有解决!

请版主予以关注......
回复
stardicky 2005-01-21
请版主予以关注......
回复
elite2018 2005-01-21
经过研究我发现这个似乎是一个Bug,应该是由于线程死锁所造成的。
回复
CROWN 2005-01-21
TO:pray1997(pray1997)

是吗? 你的意思就是说客户端,用Framework 2.0 就可以了吗?

我试一下!
回复
Jinpanxu 2005-01-21
mark
回复
stardicky 2005-01-21
Framework 1.1 SP1
回复
pray1997 2005-01-21
不过我虽然用1.1编译的组件,打开网页的时候需要调节的却是2.0的安全级别,不知道最终程序集是在哪个clr下跑
回复
pray1997 2005-01-21
奇怪,我这里很正常,第一条消息很快,3秒以内
回复
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2005-01-17 11:50
社区公告

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