1.我用多线程监听电脑的一个端口,1个线程对应局域网中的另一台电脑或者设备的端口地址
现在有100个设备 同时发送数据过来(数据的大小在 byte[100]左右) 。请问我的电脑能顺利正确的接收到这些信息么?
这100太设备几乎每秒都发送信息过来。2.我的电脑在收到信息后,判断收到 数据的大小, 然后返回 2个字节的 回馈信息 告诉他我收到了,请问同一个端口1边接收数据,这里又一边发送, 会出问题么?
3.我写的代码都是直接 TcpServer = threadLinstener.AcceptTcpClient(), ns = TcpServer.GetStream(); 来接收。
ns.Write(sd, 0, sd.Length);来发送的 ,没有用异步的方法。这样会出问题么?4.本人情况:研究 TCP多线程 刚1、2个星期,不是很懂,工作刚2个月。
望高人指点下。。
现在有100个设备 同时发送数据过来(数据的大小在 byte[100]左右) 。请问我的电脑能顺利正确的接收到这些信息么?
这100太设备几乎每秒都发送信息过来。2.我的电脑在收到信息后,判断收到 数据的大小, 然后返回 2个字节的 回馈信息 告诉他我收到了,请问同一个端口1边接收数据,这里又一边发送, 会出问题么?
3.我写的代码都是直接 TcpServer = threadLinstener.AcceptTcpClient(), ns = TcpServer.GetStream(); 来接收。
ns.Write(sd, 0, sd.Length);来发送的 ,没有用异步的方法。这样会出问题么?4.本人情况:研究 TCP多线程 刚1、2个星期,不是很懂,工作刚2个月。
望高人指点下。。
看你的代码你的设备是使用TCP连接的。那我想问一下,你的设备在你这个端口不侦听的情况下是如何运作的。
是每隔多少时间连接一下服务器端口吗。你这里看来设备端是主动发起数据的,也只能用tcpServer 来监听一个端口开多线程来收,但是需要注意的是设备多了之后,线程也会多,需要在Accept的时候做一些控制,指定一个接受线程数目的上限。并且建立一个接收数据线程的句柄集合,以便推出服务程序时,可以依次停止这些线程。
{
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
TcpListener tcpListener = new TcpListener(ipAddress,500);
tcpListener.Start();
while (isListen)
{
ChatClient chatClient = new ChatClient(tcpListener.AcceptTcpClient());
}
tcpListener.Stop();
}public class ChatClient
{
private TcpClient _tcpClient;
private byte[] byteMessage;
public volatile string message;
public static Hashtable clients= new Hashtable();
public ChatClient(TcpClient tcpClient)
{
_tcpClient = tcpClient;
string _clientEndPoint = _tcpClient.Client.RemoteEndPoint.ToString(); ChatClient.clients.Add(_clientEndPoint, this); byteMessage=new byte[_tcpClient.ReceiveBufferSize]; lock (_tcpClient.GetStream())
{
_tcpClient.GetStream().BeginRead(byteMessage, 0, _tcpClient.ReceiveBufferSize, new AsyncCallback(Receive), null);
}
} public void Receive(IAsyncResult iAsyncResult)
{
try
{
int length;
lock (_tcpClient.GetStream())
{
length= _tcpClient.GetStream().EndRead(iAsyncResult);
}
if (length < 1)
{
MessageBox.Show(_tcpClient.Client.RemoteEndPoint + "已经断线");
clients.Remove(_tcpClient);
return ;
} message=Encoding.Unicode.GetString(byteMessage,0,length); lock (_tcpClient.GetStream())
{
_tcpClient.GetStream().BeginRead(byteMessage, 0, _tcpClient.ReceiveBufferSize, new AsyncCallback(Receive), null);
}
}
catch (Exception ex)
{
clients.Remove(_tcpClient);
_tcpClient.GetStream().Close();
_tcpClient.Close();
}
}
}
QQ群:59557329 .NET技术开发联盟
希望大家可以踊跃参加,积极讨论
1我现在也在想如何管理 新建出来的线程,不知道如何写,
2轮询具体代码如何实现,请问有代码参考么?
3 我现在 只能用TcpServer = threadLinstener.AcceptTcpClient();来得知有新的连接了,线程基本在100-200之间吧,现在如何得知连接断开了呢(比如我吧设备的网线给拔了,我现在这么做,程序就卡死了。)
4.现在关闭程序的时候,还不能停止调试,可能很多线程没有结束吧。没有全部释放资源,我想。
求解答
你好,我的水平有限,现在基本都参考别的代码写的。远程的设备,基本上都是要连接到服务器来主动发数据过来,他自己本身不能保存数据的。我不给他回馈信号,他会重发并且做不了别的事情了。
1我现在也在想如何管理 新建出来的线程,不知道如何写,
2轮询具体代码如何实现,请问有代码参考么?
3 我现在 只能用TcpServer = threadLinstener.AcceptTcpClient();来得知有新的连接了,线程基本在100-200之间吧,现在如何得知连接断开了呢(比如我吧设备的网线给拔了,我现在这么做,程序就卡死了。)
4.现在关闭程序的时候,还不能停止调试,可能很多线程没有结束吧。没有全部释放资源,我想。如果是设备主动发送的话,你可以在每个线程中检测有多久时间没有收到数据了,如果超时的话就退出线程。
在关闭程序时候,应该停止所有的线程。