using System; using System.Text; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Net; using System.Net.Sockets; using System.Threading; using System.IO; namespace win2web_web { public partial class welcome : System.Web.UI.Page { static int count = 0; private Socket s; //定义Socket对象 private Thread th; //客户端连接服务器的线程 public Socket cSocket; //单个客户端连接的Socket对象 public NetworkStream ns; //网络流 public StreamReader sr; //流读取 public StreamWriter sw; //流写入 private delegate void SetTextCallback(); //用于操作主线程控件 protected string dispaly { get; set; } protected void Page_Load(object sender, EventArgs e) { } protected void bt_start_Click(object sender, EventArgs e) { bt_start.Enabled = false; s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress serverIP = IPAddress.Parse("115.156.186.55"); IPEndPoint server = new IPEndPoint(serverIP, 1737); s.Bind(server); s.Listen(10); try { th = new Thread(new ThreadStart(Communication)); th.Start(); lblConnet.Text = "服务器启动成功!"; } catch (Exception ex) { lblError.Text = "服务器启动失败!" + ex.Message; } } public void Communication() { while (true) { try { cSocket = s.Accept(); //用cSocket来代表该客户端连接 if (cSocket.Connected) //测试是否连接成功 { ns = new NetworkStream(cSocket);//建立网络流,便于数据的读取 sr = new StreamReader(ns); //实例化流读取对象 sw = new StreamWriter(ns); //实例化写入流对象 test(); //从流中读取 sw.WriteLine("收到请求,允许连接"); //向流中写入数据 sw.Flush(); //清理缓冲区 } else { lblError.Text = "连接失败"; } } catch (SocketException ex) { lblError.Text = ex.Message; //捕获Socket异常 } catch (Exception es) { lblError.Text = "其它异常" + es.Message; //捕获其他异常 } } } public void send() { lbInfo.Items.Add(sr.ReadLine() + "\n"); } public void test() { SetTextCallback stcb = new SetTextCallback(send); //Invoke(stcb); dispaly = sr.ReadLine(); //lblSend.Text = dispaly; lblSend.Text = "123456"; //问题就是这个语句给控件Label直接赋值都不能在前端显示?怎么解决 } protected void btnClose_Click(object sender, EventArgs e) { //s_Sock.Close(); s.Close(); } protected void OnTimeTick(object sender, EventArgs e) { count++; if (count > 10) count = 0; tbDisplay.Text = "--" + count.ToString(); } } }
在.aspx文件中 label语句如下:
<asp:Label ID="lblSend" runat="server" Text=<%#dispaly %>></asp:Label>
希望各路大神不吝赐教!
这种用法有问题,既然是aspx页面,就要注意其生命期,页面点击后启动线程,多点几次就会出问题,socket关联的线程如何处理销毁
看你的意思,需要查看服务端的一个操作的进展信息,这个可以使用websocket或者comet这类的技术配服务实现,而不能在页面中这样做,这种写法是windows客户端程序的做法,web程序的模式和客户端差别很大
嗯 你说的很对 我这种写法是按照window客户端的写法来的,我之前一直写windows客户端的,这是第一次写网站。其实我要实现的目的很简单就是从windows客户端中发出数据然给服务器然后在网页上显示,对于上面我想在控件lblSent中写入数据 lblSent.Text = display; 这里将display设置为static就可以显示了,关于websocket我今天在网上才看到,是网页实时监控的利器如果你有关于websocket的好的学习资料希望和网站希望告知一二,谢谢了