求大神帮忙了listview 数据绑定动态更新 socket连接

无主之城 2013-11-07 06:45:22
 
//绑定数据
public void CreatServerList()
{
Utility.parseServerList("ClientServerList.xml");
shareData = ShareData.getInstace();
servercontentlist = shareData.servercontentlist;
for (int i = 0; i < servercontentlist.ToArray().Length; i++)
{
Items.Add(new Item
{
lbserverlisten = @"Resources\disconnect.png",
lbcomputer = @"Resources\image_computer.png",
lbid = servercontentlist[i].id,
lbservername = servercontentlist[i].servername,
lbserverip = "Address:" + servercontentlist[i].serverip,
lbserverport = "PORT:" + servercontentlist[i].serverport,
lbedit = @"Resources\edit_computer.png",
lbdelete = @"Resources\remove.png"
});
this.serverlistview.ItemsSource = Items;
}
ContentStatus();
}
//判断状态的函数
public void ContentStatus()
{
mySocket = new MySocket(this);
for (int i = 0; i < Items.ToArray().Length; i++)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
DateTime dateStart = DateTime.Now;
bool statubool = mySocket.StatusConnect(servercontentlist[i].serverip.ToString(), servercontentlist[i].serverport);
if (statubool)
{
if (status.Equals("OK"))
{
stopwatch.Stop();
TimeSpan span = DateTime.Now - dateStart;
connecttimer = span.TotalMilliseconds;
if (connecttimer > statutimer)
{ //响应OK时间超过我预定的时间 绑定成忙的颜色
Items[i].lbserverlisten = @"Resources\busy.png";

}
else
{
Items[i].lbserverlisten = @"Resources\connect.png";

}
}
else if (status.Equals("Busy"))
{ //响应的是busy的消息,显示忙碌
stopwatch.Stop();
Items[i].lbserverlisten = @"Resources\busy.png";
}
else
{
}

}
else
{ //socket没连接上,显示不可连接状态。
Items[i].lbserverlisten = @"Resources\disconnect.png";

}
this.serverlistview.ItemsSource = Items;
mySocket.closeClientSocket();

}

}



listview上面的红点,listveiw上面放的是各个Server,server的IP和port是动态绑定在serverlist上面的.当窗体起来时,listvew加载绑定的信息。并且每隔item的server发socket给对应的server,判断返回的信息决定server的状态(Busy.Ok)Busy显示黄灯,Ok显示绿灯,连接不上显示红灯。但是现在我的监听的server实现不了了。求帮助啊。
 
MySocket类
public bool StatusConnect(string ip, int port)
{
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(ip), port);
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
clientSocket.Connect(ipep);
Command command = new Command();
command.SequenceNo = 2;
string m_content = "Ping";
command.Content = m_content;
command.Lenght = m_content.Length;
send(command);
[color=#99CC00][color=#FFCC00]ThreadStart receiveDelegate = new ThreadStart(onReceive);[/color]
receiveThread = new Thread(receiveDelegate);
receiveThread.Start();[/color]
return true;
}
catch (SocketException)
{
return false;

}


private void onReceive()
{


string fileName = "clientUI.xml";
FileStream fileStream = new FileStream(fileName, FileMode.Create);
int readSize = -1;
while (true)
{
byte[] recBuf = new byte[4096 * 2];
MemoryStream ms = new MemoryStream();
try
{
if (clientSocket != null)
{
readSize = clientSocket.Receive(recBuf, recBuf.Length, 0);
if (readSize > 0)
{
ms.Write(recBuf, 0, readSize);
}
}
else {
MessageBox.Show("The connection is broken!!!");
}
}
catch (ArgumentNullException e)
{
MessageBox.Show(e + "");
}
catch (ArgumentOutOfRangeException e)
{
MessageBox.Show(e + "");
}



if (ms.Length > 0)
{
byte[] rBuf = ms.ToArray();
Position position = new Position();
Command command = Utility.parseData(rBuf, position);
string content = command.Content;
string[] scontent = content.Split(':');
if (scontent[0].Equals("LoginResult"))
{
if (scontent[1].Equals("True"))
{
Command m_command = new Command();
command.SequenceNo = 1;
string m_content = "GetClientUI:";
command.Content = m_content;
command.Lenght = content.Length;
send(command);
}
else
{

}
}
else if (scontent[0].Equals("ClientUIResult"))
{

string data = scontent[1];
byte[] writeBuf = Encoding.UTF8.GetBytes(data);
try
{
fileStream.Write(writeBuf, 0, writeBuf.Length);
fileStream.Flush();
fileStream.Close();
Utility.parseGUI("clientUI.xml");
showOperatWindow = showMain;
dispatcher.BeginInvoke(showOperatWindow);

}
catch (Exception e)
{
MessageBox.Show("error:" + e);

}

}
else if (scontent[0].Equals("PingResponse"))
{
if (scontent[1].Equals("OK"))
{
//把这个状态string值传给serverlist窗体里的值 每次报错都在这里说没有实例化对象
[color=#FF0000]m_main.ContentStatus
(scontent[1]);
}
else if (scontent[1].Equals("Busy"))
{
m_main.ContentStatus(scontent[1]);
}
else
{
}[/color]
}


}

}
...全文
271 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wpda_csdn 2015-05-18
  • 打赏
  • 举报
回复
正好在做这个功能
海涵德 2013-11-07
  • 打赏
  • 举报
回复
这一段程序是有问题的,那个循环只有最后一个在起作用,每次循环覆盖了前一个 this.serverlistview.ItemsSource = Items; 也不知道为什么在这里要写个这样的没用的循环。
public void CreatServerList()
        {
            Utility.parseServerList("ClientServerList.xml");
            shareData = ShareData.getInstace();
            servercontentlist = shareData.servercontentlist;
            for (int i = 0; i < servercontentlist.ToArray().Length; i++)
            {
                Items.Add(new Item
                {
                    lbserverlisten = @"Resources\disconnect.png",
                    lbcomputer = @"Resources\image_computer.png",
                    lbid = servercontentlist[i].id,
                    lbservername = servercontentlist[i].servername,
                    lbserverip = "Address:" + servercontentlist[i].serverip,
                    lbserverport = "PORT:" + servercontentlist[i].serverport,
                    lbedit = @"Resources\edit_computer.png",
                    lbdelete = @"Resources\remove.png"
                });
                this.serverlistview.ItemsSource = Items;
            }
            ContentStatus();
        }
无主之城 2013-11-07
  • 打赏
  • 举报
回复
我改了代码,报错这样的求解。

        public ServerListWindow()
        {
            InitializeComponent();
            slManager = new ServerListManager();
            slWindow = this;
            statutimer = Utility.parseAppConfig("ApplictionConfig.xml");
            mySocket = new MySocket(slWindow);
            CreatServerList();
            ThreadStart receiveDelegate = new ThreadStart(ContentStatus);
            connetServerThread = new Thread(receiveDelegate);
            connetServerThread.Start();
           // GoFullScreen();
        }
public void CreatServerList()
        {
            Utility.parseServerList("ClientServerList.xml");
            shareData = ShareData.getInstace();
            servercontentlist = shareData.servercontentlist;
            for (int i = 0; i < servercontentlist.ToArray().Length; i++)
            {
                Items.Add(new Item
                {
                    lbserverlisten = @"Resources\disconnect.png",
                    lbcomputer = @"Resources\image_computer.png",
                    lbid = servercontentlist[i].id,
                    lbservername = servercontentlist[i].servername,
                    lbserverip = "Address:" + servercontentlist[i].serverip,
                    lbserverport = "PORT:" + servercontentlist[i].serverport,
                    lbedit = @"Resources\edit_computer.png",
                    lbdelete = @"Resources\remove.png"
                });
                this.serverlistview.ItemsSource = Items;
            }
               
        }
 public void ContentStatus()
        {
            mySocket = new MySocket(this);
            for (int i = 0; i < Items.ToArray().Length; i++)
            {
                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();
                DateTime dateStart = DateTime.Now;
                string serverStatu= mySocket.StatusConnect(servercontentlist[i].serverip.ToString(), servercontentlist[i].serverport);
                if (serverStatu.Equals("OK"))
                    {
                        stopwatch.Stop();
                        TimeSpan span = DateTime.Now - dateStart;
                        connecttimer = span.TotalMilliseconds;
                        if (connecttimer > statutimer)
                        {
                            Items[i].lbserverlisten = @"Resources\busy.png";

                        }
                        else
                        {
                            Items[i].lbserverlisten = @"Resources\connect.png";

                        }
                    }
                    else if (serverStatu.Equals("Busy"))
                    {
                        stopwatch.Stop();
                        Items[i].lbserverlisten = @"Resources\busy.png";
                    }
                    else if (serverStatu.Equals("NO"))
                    {
                        stopwatch.Stop();
                        Items[i].lbserverlisten = @"Resources\disconnect.png";
                    }
                this.serverlistview.ItemsSource = Items;//报错
                //The calling thread cannot access this object because a different thread owns it.
                mySocket.closeClientSocket();
            }

        }
无主之城 2013-11-07
  • 打赏
  • 举报
回复
引用 2 楼 KumaPower 的回复:
你 m_main 在哪定义的啊?既然有提示了,应该很容易排查吧,还是不一定会报错?
        
private ServerListWindow m_main = null;
public MySocket(ServerListWindow main)
        {
            dispatcher = main.Dispatcher;
            m_main = main;
            m_mySocket = this;
        }
Bonjour-你好 2013-11-07
  • 打赏
  • 举报
回复
你 m_main 在哪定义的啊?既然有提示了,应该很容易排查吧,还是不一定会报错?
无主之城 2013-11-07
  • 打赏
  • 举报
回复
求人帮忙啊,谢谢大神们了,我着急。

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧