多线程同步实现 接收数据

lw476906635 2009-09-18 05:22:13
private TcpListener _listener;
public static TcpClient _client;
private int _listenterPort = 8401;
private Thread clientservice;
private DateTime Time;
public static string str1 = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
public static string tempPath = DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString();
private delegate void AddTest(string message);
private Thread theadLisener;
private int n = 1;
private int max = 10;
private object monitor = new object();
public Form1()
{
InitializeComponent();
theadLisener = new Thread(new ThreadStart(Listen));
theadLisener.Start();

}

static public object LockShare = new object();



public void Listen()
{
AddTest add = new AddTest(AddListBox);
_listener = new TcpListener(_listenterPort);
try
{
_listener.Start();
}
catch(Exception ex)
{
SendNotice.SendBoth("监听错误", ex.Message, "启动监听");
}

this.BeginInvoke(add, new object[] { "开始侦听" });
while (true)
{


try
{

_client = _listener.AcceptTcpClient();
this.BeginInvoke(add, new object[] { _client.Client.RemoteEndPoint.ToString() + "已经建立好连接" });
clientservice = new Thread(new ThreadStart(this.ServiceClient));
clientservice.Start();

//ManualResetEvent vent = new ManualResetEvent(false);
//ThreadPool.QueueUserWorkItem(new WaitCallback(ServiceClient));

//vent.WaitOne(Timeout.Infinite, true);

}
catch (Exception ex)
{
this.BeginInvoke(add, new object[] { ex.Message });
}


}
}
private void test(object state)
{ }

private void ServiceClient()
{
AddTest add = new AddTest(AddListBox);
bool keepalive = true;
string md5 = "";


while (keepalive)
{
lock (monitor)
{
for (; n < max; n++)
{
try
{
byte[] bytes = new byte[1024];
NetworkStream stream = _client.GetStream();
int count = stream.Read(bytes, 0, bytes.Length);
Time = DateTime.Now;
if (File.Exists(tempPath))
{
}
else
{
Directory.CreateDirectory(str1 + tempPath);

}

string fileTime = Time.Year.ToString() + Time.Month.ToString() + Time.Day.ToString() + "-" +
Time.Hour.ToString() + Time.Minute.ToString() + Time.Second.ToString();
string fileName = str1 + tempPath + "\\" + fileTime + ".xml";
if (count > 0)
{
FileStream fstream = new FileStream(fileName, FileMode.Create);
fstream.Write(bytes, 0, count);
fstream.Close();
string type = this.Check(fileName).ToLower().Trim();
if (type.Equals("request"))
{
System.Random rad = new Random();
string radCode = rad.Next(10000000, 99999999).ToString();

writeSequence(radCode);
FileStream fs = new FileStream(str1 + "sequence.xml", FileMode.Open);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
stream.Write(buffer, 0, buffer.Length);

_client.Client.Send(buffer, buffer.Length, 0);
fs.Dispose();
md5 = MD5Encrypt(radCode, 32);
}
else if (type.Equals("md5"))
{
string md_5 = GetMD5(fileName);
if ((md_5 == md5) && !md5.Equals(""))
{
writeResult(true);
FileStream fs = new FileStream(str1 + "result.xml", FileMode.Open);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
stream.Write(buffer, 0, buffer.Length);
this.BeginInvoke(add, new object[] { "MD5验证通过。" });
fs.Dispose();
}

else
{
writeResult(false);
FileStream fs = new FileStream(str1 + "result.xml", FileMode.Open);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
stream.Write(buffer, 0, buffer.Length);
fs.Dispose();

// this.BeginInvoke(add, new object[] { "MD5验证失败,连接关闭。" });
_client.Close();
clientservice.Abort();
}
}
else
{

SqlTool st = new SqlTool();
st.createCon();
bool existEnergy = getEnergy(fileName);
if (existEnergy)
{
try
{
insertSql(fileName);
this.BeginInvoke(add, new object[] { DateTime.Now.ToString() + "数据入库。" });
}
catch
{ }

}
else
{
SendNotice.SendBoth("接收文件", "不是能耗文件", "接收服务");
}

}
}



}
catch (Exception ex)
{

clientservice.Abort();
this.BeginInvoke(add, new object[] { ex.Message });
SendNotice.SendBoth("接收文件", ex.Message, "接收服务");

}

}
Monitor.Wait(monitor);
}

}
}
不知道怎么改了 有两个客户端链接 第一次的时候两个都可以发送过数据 之后就只有后面开启的那个客户端能够发过来数据 急急急!!!!!!!
...全文
379 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyue4 2009-09-23
  • 打赏
  • 举报
回复
不好意思,我打错了
应该是TcpClient s = (TcpClient)ss;
之后s.Client.Send()等同于socket对象的send函数,receive函数一样
不好意思啊
lw476906635 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wangyue4 的回复:]
 
TcpClient s1 = tl.AcceptTcpClient();
Thread objthread = new Thread(new ParameterizedThreadStart(aa));
            objthread.Start(s1);

线程函数
  void aa(object ss)
        {
                TcpClient s = (Socket)ss;
                .....
        }
[/Quote]

TcpClient s = (Socket)ss;
这个不能隐式转换 能怎么变通一下
wangyue4 2009-09-21
  • 打赏
  • 举报
回复

TcpClient s1 = tl.AcceptTcpClient();
Thread objthread = new Thread(new ParameterizedThreadStart(aa));
objthread.Start(s1);

线程函数
void aa(object ss)
{
TcpClient s = (Socket)ss;
.....
}
lw476906635 2009-09-21
  • 打赏
  • 举报
回复
_client = _listener.AcceptTcpClient();
this.BeginInvoke(add, new object[] { _client.Client.RemoteEndPoint.ToString() + "已经建立好连接" });
clientservice = new Thread(new ThreadStart(this.ServiceClient));
clientservice.Start();
是一直监听状态 这个没问题 来了两个客户端就开两个线程执行 异步调用和这个不是一个概念。。。。
第一次两个客户端链接的时候正常 一会就会丢失一个客户端??????

请高手指教。。。。。。。。
wangyue4 2009-09-20
  • 打赏
  • 举报
回复
应该是服务器端监听端口,如果监听到连接则开线程处理,将接收到的socket传到线程里
wwei466 2009-09-20
  • 打赏
  • 举报
回复
多个客户端要用线程监控,或者异步调用。
listenyang 2009-09-20
  • 打赏
  • 举报
回复
代码太多.没看完。
风之影子 2009-09-20
  • 打赏
  • 举报
回复
代码太多,楼主还是设断点调试一下,给我范围大家也好帮你看
tbc168 2009-09-20
  • 打赏
  • 举报
回复
代码太多了

110,546

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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