科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件C#实时申请技术

C#实时申请技术

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文演示在用户申请与服务器申请之间使用Socket类的情况。

作者:crystal编译 来源:yesky 2007年11月14日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
 4. 点击Load Data菜单,从文件中载入信息,然后把所有信息传送到每个将与TcpServer相连接的客户端,客户端会自己更新它的listview。不管是TcpServer 还是 TcpClient ,它们都从运作中的线程之中获取数据,再在主线程中更新Listview control。下面则讲述的是通过MethodInvoker实现该功能。

public void LoadThread()

{

MethodInvoker mi = new MethodInvoker(this.UpdateListView);

string tmp = null;

StreamReader sr = File.OpenText("Issue.txt");

while((tmp = sr.ReadLine()) !=null )

{

if (tmp =="")

break;



isu.symbol= Mid(tmp, 0, 4);

isu.bid = Mid(tmp, 4, 5);

isu.offer = Mid(tmp, 9, 5);

isu.volume = Mid(tmp, 16, tmp.Length-16);



sendMsg ="\v" + tmp + "\n"; //add send message's head and end char

SendDataToAllClient(tmp);

this.BeginInvoke(mi);



JobDone.WaitOne();

}

sr.Close();

fThd.Abort();

}

private void SendDataToAllClient(string str)

{

foreach (Socket s in socketHolder.Values)

{

if(s.Connected)

{

Byte[] byteDateLine=ASCII.GetBytes(str.ToCharArray());

s.Send(byteDateLine, byteDateLine.Length, 0);

}

}

}

  以下代码 操纵XML文件,并且为客户端生成XML文件。

public void LoadXmlThread()

{

MethodInvoker miv = new MethodInvoker(this.UpdateListView);

string tmp = null;

string xmlString = null;



int recordFlg = -1;

int textCount =0;

xmlString = "\v"+"";



XmlTextReader tr = new XmlTextReader("issue.xml");

while(tr.Read())

{

switch (tr.NodeType)

{

case XmlNodeType.Element:

if (tr.Name == "Issue")

{

recordFlg++;

if(recordFlg > 0)

{

textCount=0;

xmlString += CreateXmlElement(

tr.Name, 2);

xmlString += "\n";

SendDataToAllClient(xmlString);

xmlString = "\v"+"
version='1.0'?>";



this.BeginInvoke(miv);

JobDone.WaitOne();

}

}

if (recordFlg >= 0)

{

xmlString += CreateXmlElement(

tr.Name, 1);

tmp = tr.Name;

}



break;

case XmlNodeType.Text:

switch(++textCount)

{

case 1:

isu.symbol=tr.Value;

break;

case 2:

isu.bid=tr.Value;

break;

case 3:

isu.offer=tr.Value;

break;

case 4:

isu.volume=tr.Value;

break;

}

xmlString += tr.Value;

xmlString += CreateXmlElement(tmp, 2);

break;

}

}

fThd.Abort();

}

string CreateXmlElement(string elem, int ord)

{

string tmp = null;

if (ord == 1)

tmp = String.Format("<{0}>", elem);

else

tmp = String.Format("", elem);



return tmp;

}


以下功能演示的是如何设置TcpClient中Listview控件的 BackColor和 Forecolor属性 。
private void UpdateListView()

{

int ind=-1;

for (int i=0; i < this.listView1.Items.Count;i++)

{

if (this.listView1.Items[i].Text == isu.symbol.ToString())

{

ind=i;

break;

}

}

if (ind == -1)

{

ListViewItem newItem new ListViewItem(isu.symbol.ToString());

newItem.SubItems.Add(isu.bid);

newItem.SubItems.Add(isu.offer);

newItem.SubItems.Add(isu.volume);



this.listView1.Items.Add(newItem);

int i=this.listView1.Items.IndexOf(newItem);

setRowColor(i, System.Drawing.Color.FromArgb(255, 255, 175));

setColColorHL(i, 0, System.Drawing.Color.FromArgb(128,0,0));

setColColorHL(i, 1, System.Drawing.Color.FromArgb(128,0,0));

this.listView1.Update();

Thread.Sleep(300);

setColColor(i, 0, System.Drawing.Color.FromArgb(255, 255,175));

setColColor(i, 1, System.Drawing.Color.FromArgb(255, 255, 175));

}

else

{

this.listView1.Items[ind].Text = isu.symbol.ToString();

this.listView1.Items[ind].SubItems[1].Text = (isu.bid);

this.listView1.Items[ind].SubItems[2].Text = (isu.offer);

this.listView1.Items[ind].SubItems[3].Text = (isu.volume);

setColColorHL(ind, 0, System.Drawing.Color.FromArgb(128,0,0));

setColColorHL(ind, 1, System.Drawing.Color.FromArgb(128,0,0));

this.listView1.Update();

Thread.Sleep(300);

setColColor(ind, 0, System.Drawing.Color.FromArgb(255,255,175));

setColColor(ind, 1, System.Drawing.Color.FromArgb(255,255,175));

}

JobDone.Set();

}



private void setRowColor(int rowNum, Color colr )

{

for (int i=0; i < this.listView1.Items[rowNum].SubItems.Count;i++)

if (rowNum%2 !=0)

this.listView1.Items[rowNum].SubItems[i].BackColor = colr;

}



private void setColColor(int rowNum, int colNum, Color colr )

{

if (rowNum%2 !=0)

this.listView1.Items[rowNum].SubItems[colNum].BackColor=colr;

else

this.listView1.Items[rowNum].SubItems[colNum].BackColor =

System.Drawing.Color.FromArgb(248, 248,248);

if (colNum==0)

{

this.listView1.Items[rowNum].SubItems[colNum].ForeColor =

System.Drawing.Color.FromArgb(128, 0, 64);

this.listView1.Items[rowNum].SubItems[colNum].BackColor =

System.Drawing.Color.FromArgb(197, 197, 182);

}

else

this.listView1.Items[rowNum].SubItems[colNum].ForeColor =

System.Drawing.Color.FromArgb(20, 20,20);

}



private void setColColorHL(int rowNum, int colNum, Color colr )

{

this.listView1.Items[rowNum].SubItems[colNum].BackColor = colr;

this.listView1.Items[rowNum].SubItems[colNum].ForeColor =

System.Drawing.Color.FromArgb(255,255,255);

}

  运行该例子的步骤

  1. 在A机上运行TcpServer.exe文件。

  2. 在A机或B机上运行一次或多次TcpClient.exe文件。

  3. 在TcpClient端,点击菜单连接,进入TcpServer正在运行中的服务器端。在编辑栏键入用户名及口令,点击确认。

  4. 当在TcpServer顶部的istview上瞧见客户端的提示时,则在TcpServer,上点击Load Data菜单,然后实时数据则会出现在TcpServer 和TcpClien上。

  注意:请确认Data file, Issue.txt and Issue.xml等文件总是处于同一根目录下,正如TcpSvr.exe 和 MaskedTextBox.dll, WTcpClient.exe.是处于同一目录下一样。

  Update at 10/20/2001.

  当添加/删除项目时,请锁住Hash表,这样可以确保线程的安全。

  添加功能,以便生成和处理XML格式文件。

  在发送讯息至客户端时,请在服务器端添加发送讯息起始和结尾的字符。

  上述方法可以增加客户端的稳定性。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章