C# c线程继续使用套接字运行
我有一个程序,在这个程序中,我需要监听多个客户端,这些客户端在特定的时间间隔后从网络发送数据,然后将数据插入数据库。我已经编写了一个多线程程序,但在侦听时,线程随机运行到无限循环中,而没有实际从客户端读取数据。 这是我的密码:C# c线程继续使用套接字运行,c#,multithreading,sockets,C#,Multithreading,Sockets,我有一个程序,在这个程序中,我需要监听多个客户端,这些客户端在特定的时间间隔后从网络发送数据,然后将数据插入数据库。我已经编写了一个多线程程序,但在侦听时,线程随机运行到无限循环中,而没有实际从客户端读取数据。 这是我的密码: namespace ConsoleApplication1 { class Program { static void Main(string[] args) { TcpListener server
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
TcpListener serverSocket = new TcpListener(IPAddress.Parse("my.ip.add.ress"),myport);
TcpClient clientSocket = default(TcpClient);
int counter = 0;
serverSocket.Start();
Console.WriteLine(" >> " + "Server Started");
counter = 0;
while (true)
{
counter += 1;
clientSocket = serverSocket.AcceptTcpClient();
Console.WriteLine(" >> " + "Client No:" + Convert.ToString(counter) + " started!");
handleClinet client = new handleClinet();
client.startClient(clientSocket, Convert.ToString(counter));
}
clientSocket.Close();
serverSocket.Stop();
Console.WriteLine(" >> " + "exit");
Console.ReadLine();
}
}
//Class to handle each client request separatly
public class handleClinet
{
TcpClient clientSocket;
string clNo;
public void startClient(TcpClient inClientSocket, string clineNo)
{
Console.WriteLine("In start client");
this.clientSocket = inClientSocket;
this.clNo = clineNo;
Thread ctThread = new Thread(doChat);
ctThread.Start();
}
private void doChat()
{
Console.WriteLine("In doChat");
byte[] bytesFrom = new byte[251];
string data = null;
string connectionString = null;
SqlConnection cnn ;
connectionString = "some connection string";
while ((true))
{
try
{
NetworkStream networkStream = clientSocket.GetStream();
networkStream.Read(bytesFrom, 0, bytesFrom.Length);
data = System.Text.Encoding.ASCII.GetString(bytesFrom);
//networkStream.Flush();
//Console.WriteLine(" >> " + "From client-" + clNo + data.Trim());
//get message type from device
String gMsgType = data.Slice(13,17);
Console.WriteLine("{0}",gMsgType);
//if the msg BP05 use it else continue
if(String.Compare("BP05",gMsgType) !=0 )
throw new Exception();
//we got bp05 message parse the inputs
String gId = data.Slice(18,32);
String gDate = data.Slice(32,38);
String gStatus = data.Slice(38,39);
String gLat = data.Slice(39,48);
String gLon = data.Slice(49,59);
String gSpeed = data.Slice(60,65);
String gTime = data.Slice(65,71);
String gInputs = data.Slice(77,85);
String gMileData = data.Slice(86,92);
if(String.Compare("A", gStatus)==0)
{
//sanitize inputs before insertion
//some operations
Console.WriteLine("{0}",data);
//connect to database
cnn = new SqlConnection(connectionString);
cnn.Open();
SqlCommand com = new SqlCommand();
com.Connection = cnn;
com.CommandText = "some insert query"
com.ExecuteNonQuery();
cnn.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(" >> " + ex.ToString());
break;
}
}
}
}
}
首先,删除whiletrue循环并使用某种条件。可能是一个正在运行的布尔值,如果需要,您可以更改它以结束程序。第二,
networkStream.Read(bytesFrom, 0, bytesFrom.Length);
如果我没记错的话,应该返回从套接字读取的字节数。如果客户端已断开连接,则可以从套接字读取0字节。如果从套接字读取0个字节,我将从那里开始并中断。可能是networkStream。读取是一个阻塞函数,为什么不尝试为读取函数设置超时