thread = new Thread(new ThreadStart(StartUp));
Thread.Sleep(100);
thread.Start();
----------------------------窗体加载时执行的线程 用来监听链接的客户端.
public void StartUp()
{
IPAddress _ip = Dns.GetHostAddresses(Dns.GetHostName())[0];
_tcpl = new TcpListener(_ip, _port);
_tcpl.Start();
while (true)
{
byte[] packetBuff = new byte[_maxPacket];
Socket newClient = _tcpl.AcceptSocket();
newClient.Receive(packetBuff);
string UserName = Encoding.Unicode.GetString(packetBuff).TrimEnd('\0');
if (_transmit_tb.Count != 0 && _transmit_tb.ContainsKey(UserName))
{
newClient.Send(Encoding.Unicode.GetBytes("cmd::Failed"));//返回值 已存在的用户名
}
else
{
newClient.Send(Encoding.Unicode.GetBytes("cmd::Successful"));// 添加成功
}
//将新连接加入转发表并创建线程为其服务
Form.CheckForIllegalCrossThreadCalls = false;
_transmit_tb.Add(UserName, newClient);
lbServer.Items.Add(UserName);
}
}
------------------------------------------------点击按钮后执行的线程程序。
foreach (DictionaryEntry de in _transmit_tb)
{
string _clientName = de.Key as string;
Socket _clientSkt = de.Value as Socket;
_clientSkt.Send(Encoding.Unicode.GetBytes("cmd:begin"));
}cliThread = new Thread(new ThreadStart(StartImage));
Thread.Sleep(100);
cliThread.Start();
--------------------------------------------------线程程序
public void StartImage()
{
for (int i = 0; i < lbServer.Items.Count; i++) //循环遍历ListBox中的地址
{
string userName = lbServer.Items[i].ToString();
clientThread = new Thread(new ParameterizedThreadStart(ThreadFunc));
clientThread.Start(userName);-----将地址传输到下一个方法中。
}
}
-----------------------------------------------------------执行线程发送客户端
private void ThreadFunc(object obj)
{
//通过转发表得到当前用户套接字
Socket clientSkt = _transmit_tb[obj] as Socket;
while (true)
{
try
{
byte[] _cmdBuff = new byte[128];
clientSkt.Receive(_cmdBuff);
string _cmd = DecodingBytes(_cmdBuff);
/// "01"-离线
/// "02"-请求在线列表
/// "03"-请求发送图片
switch (_cmd)
{
case "01":
{
_transmit_tb.Remove(obj);
string svrlog = string.Format("[系统消息]用户 {0} 在 {1} 已断开... 当前在线人数: {2}\r\n\r\n", obj, DateTime.Now, _transmit_tb.Count);
MessageBox.Show(svrlog, "用户退出", MessageBoxButtons.OK, MessageBoxIcon.Error);
Thread.CurrentThread.Abort();
break;
}
case "02":
{
byte[] onlineBuff = SerializeOnlineList();
//先发送响应信号,用于客户机的判断,"11"表示服务发给客户机的更新在线列表的命令
clientSkt.Send(new byte[] { 1, 1 });
clientSkt.Send(onlineBuff);
break;
}
case "03":
{
byte[] _msgBuff = InterceptClass.GetDesktopBitmapBytes();//发送图片数组clientSkt.Send(_msgBuff);
foreach (DictionaryEntry de in _transmit_tb)
{
string _clientName = de.Key as string;
Socket _clientSkt = de.Value as Socket;
if (_clientName.Equals(obj))
{
_clientSkt.Send(_msgBuff);
}
}
break;
}
}
catch (SocketException)
{
_transmit_tb.Remove(obj);
Thread.CurrentThread.Abort();
}
}
---------------------------------------------
我的程序是在截取 桌面的屏幕 发送到客户端中 现在 存在的问题是 当我鼠标在服务器端不停运动 程序还不短执行
如果 静止不动 一会 就不在截取屏幕了 是不是我的线程哪里出了问题?
第二个问题就是 当 我程序开始 截屏发送的时候 在登录一个客户端 就会出错 希望各位 给指点下 谢谢啦!~
Thread.Sleep(100);
thread.Start();
----------------------------窗体加载时执行的线程 用来监听链接的客户端.
public void StartUp()
{
IPAddress _ip = Dns.GetHostAddresses(Dns.GetHostName())[0];
_tcpl = new TcpListener(_ip, _port);
_tcpl.Start();
while (true)
{
byte[] packetBuff = new byte[_maxPacket];
Socket newClient = _tcpl.AcceptSocket();
newClient.Receive(packetBuff);
string UserName = Encoding.Unicode.GetString(packetBuff).TrimEnd('\0');
if (_transmit_tb.Count != 0 && _transmit_tb.ContainsKey(UserName))
{
newClient.Send(Encoding.Unicode.GetBytes("cmd::Failed"));//返回值 已存在的用户名
}
else
{
newClient.Send(Encoding.Unicode.GetBytes("cmd::Successful"));// 添加成功
}
//将新连接加入转发表并创建线程为其服务
Form.CheckForIllegalCrossThreadCalls = false;
_transmit_tb.Add(UserName, newClient);
lbServer.Items.Add(UserName);
}
}
------------------------------------------------点击按钮后执行的线程程序。
foreach (DictionaryEntry de in _transmit_tb)
{
string _clientName = de.Key as string;
Socket _clientSkt = de.Value as Socket;
_clientSkt.Send(Encoding.Unicode.GetBytes("cmd:begin"));
}cliThread = new Thread(new ThreadStart(StartImage));
Thread.Sleep(100);
cliThread.Start();
--------------------------------------------------线程程序
public void StartImage()
{
for (int i = 0; i < lbServer.Items.Count; i++) //循环遍历ListBox中的地址
{
string userName = lbServer.Items[i].ToString();
clientThread = new Thread(new ParameterizedThreadStart(ThreadFunc));
clientThread.Start(userName);-----将地址传输到下一个方法中。
}
}
-----------------------------------------------------------执行线程发送客户端
private void ThreadFunc(object obj)
{
//通过转发表得到当前用户套接字
Socket clientSkt = _transmit_tb[obj] as Socket;
while (true)
{
try
{
byte[] _cmdBuff = new byte[128];
clientSkt.Receive(_cmdBuff);
string _cmd = DecodingBytes(_cmdBuff);
/// "01"-离线
/// "02"-请求在线列表
/// "03"-请求发送图片
switch (_cmd)
{
case "01":
{
_transmit_tb.Remove(obj);
string svrlog = string.Format("[系统消息]用户 {0} 在 {1} 已断开... 当前在线人数: {2}\r\n\r\n", obj, DateTime.Now, _transmit_tb.Count);
MessageBox.Show(svrlog, "用户退出", MessageBoxButtons.OK, MessageBoxIcon.Error);
Thread.CurrentThread.Abort();
break;
}
case "02":
{
byte[] onlineBuff = SerializeOnlineList();
//先发送响应信号,用于客户机的判断,"11"表示服务发给客户机的更新在线列表的命令
clientSkt.Send(new byte[] { 1, 1 });
clientSkt.Send(onlineBuff);
break;
}
case "03":
{
byte[] _msgBuff = InterceptClass.GetDesktopBitmapBytes();//发送图片数组clientSkt.Send(_msgBuff);
foreach (DictionaryEntry de in _transmit_tb)
{
string _clientName = de.Key as string;
Socket _clientSkt = de.Value as Socket;
if (_clientName.Equals(obj))
{
_clientSkt.Send(_msgBuff);
}
}
break;
}
}
catch (SocketException)
{
_transmit_tb.Remove(obj);
Thread.CurrentThread.Abort();
}
}
---------------------------------------------
我的程序是在截取 桌面的屏幕 发送到客户端中 现在 存在的问题是 当我鼠标在服务器端不停运动 程序还不短执行
如果 静止不动 一会 就不在截取屏幕了 是不是我的线程哪里出了问题?
第二个问题就是 当 我程序开始 截屏发送的时候 在登录一个客户端 就会出错 希望各位 给指点下 谢谢啦!~
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货