用C#写了个Windows服务程序,监听某个端口是否有数据传来。但是为什么只能监听到第一次数据流?
程序只能监听到第一次上传的数据流,以后就监听不到了,下面是主要代码。//构造函数publicService1(){InitializeComponent();//测试代码...
程序只能监听到第一次上传的数据流,以后就监听不到了,下面是主要代码。
// 构造函数
public Service1()
{
InitializeComponent();
// 测试代码
StreamWriter sw = new StreamWriter("D:/aaa.txt", true);
sw.WriteLine("aaaa");
sw.Close();
// 创建目录
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
if (!Directory.Exists(logPath))
{
Directory.CreateDirectory(logPath);
}
// 得到IP地址和端口号
GetIPAndPort();
}
protected override void OnStart(string[] args)
{
// 开始监听
sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(IP);
IPEndPoint point = new IPEndPoint(ip, port);
sck.Bind(point);
sck.Listen(10);
// 起一个线程,指向要处理的函数
MainThread = new Thread(new ThreadStart(GetByteToRAR));
// 开启监听
if (!string.IsNullOrEmpty(IP) && port != 0)
{
MainThread.Start();
}
}
private void GetByteToRAR()
{
// 一直监听,直到有数据过来
while (true)
{
try
{
// 测试代码
StreamWriter sw = new StreamWriter("D:/aaa.txt", true);
sw.WriteLine("bbb");
sw.Close();
accSck = sck.Accept();
// 字符流暂时限制在10M
byte[] buffer = new byte[1024 * 1024 * 10];
accSck.Receive(buffer);
// 将字符流转换成文件
// someCode
// 解压文件
UnRAR(fileName);
accSck.Close();
}
catch (Exception ex)
{
throw ex;
}
} 展开
// 构造函数
public Service1()
{
InitializeComponent();
// 测试代码
StreamWriter sw = new StreamWriter("D:/aaa.txt", true);
sw.WriteLine("aaaa");
sw.Close();
// 创建目录
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
if (!Directory.Exists(logPath))
{
Directory.CreateDirectory(logPath);
}
// 得到IP地址和端口号
GetIPAndPort();
}
protected override void OnStart(string[] args)
{
// 开始监听
sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(IP);
IPEndPoint point = new IPEndPoint(ip, port);
sck.Bind(point);
sck.Listen(10);
// 起一个线程,指向要处理的函数
MainThread = new Thread(new ThreadStart(GetByteToRAR));
// 开启监听
if (!string.IsNullOrEmpty(IP) && port != 0)
{
MainThread.Start();
}
}
private void GetByteToRAR()
{
// 一直监听,直到有数据过来
while (true)
{
try
{
// 测试代码
StreamWriter sw = new StreamWriter("D:/aaa.txt", true);
sw.WriteLine("bbb");
sw.Close();
accSck = sck.Accept();
// 字符流暂时限制在10M
byte[] buffer = new byte[1024 * 1024 * 10];
accSck.Receive(buffer);
// 将字符流转换成文件
// someCode
// 解压文件
UnRAR(fileName);
accSck.Close();
}
catch (Exception ex)
{
throw ex;
}
} 展开
1个回答
展开全部
逻辑不正确
accSck = sck.Accept();//是一个阻塞。当处理完一次后一直处于等待下一个连接。
正确流程写法:
// 开始监听
sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(IP);
IPEndPoint point = new IPEndPoint(ip, port);
sck.Bind(point);
sck.Listen(10);
while(true)
{
accSck = sck.Accept();
thread th=new Thread(word);
th.isbackground=true;
th.start(accsck);
}
private void work(object socket)
{
Socket accSck=(Socket)socket;
byte[] buffer = new byte[1024 * 1024 * 10];
whil(true)
{
try{
accSck.Receive(buffer); // 将字符流转换成文件 nRAR(fileName);
}catch
{
accSck.Close();
}
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |