C# 多线程服务器
我已经实现了一个服务器,现在正试图使其多线程化,但是遇到了一个问题,即服务器在接收数据时出现故障,C# 多线程服务器,c#,multithreading,sockets,networkstream,C#,Multithreading,Sockets,Networkstream,我已经实现了一个服务器,现在正试图使其多线程化,但是遇到了一个问题,即服务器在接收数据时出现故障,StreamWriter无法从流中读取数据 代码如下: class whereisServer { static Socket connection; static object threadLock = new object(); static void Main(string[] args) { Thread t = new Thread(new
StreamWriter
无法从流中读取数据
代码如下:
class whereisServer
{
static Socket connection;
static object threadLock = new object();
static void Main(string[] args)
{
Thread t = new Thread(new ThreadStart(Run));
t.Start();
}
static void Run()
{
NetworkStream socketStream;
TcpListener listener;
const int PORT = 43;
try
{
listener = new TcpListener(IPAddress.Any, PORT);
listener.Start();
while (true)
{
connection = listener.AcceptSocket();
socketStream = new NetworkStream(connection);
try
{
connection.ReceiveTimeout = 1000;
connection.SendTimeout = 1000;
Thread t = new Thread(new ParameterizedThreadStart(DoRequest));
t.Start(socketStream);
//DoRequest(socketStream);
}
catch (IOException e)
{
Console.WriteLine(e.Message + "\nTimeOut Handled");
}
finally
{
socketStream.Close();
connection.Close();
}
}
}
catch (SocketException e)
{
Console.WriteLine(e.Message);
}
}
static void DoRequest(object stream)
{
NetworkStream socketStream = (NetworkStream)stream;
StreamWriter writer = new StreamWriter(socketStream);
StreamReader reader = new StreamReader(socketStream);
lock (threadLock)
{
//DO SERVER STUFF HERE
}
在没有线程的情况下调用DoRequest
方法时,程序运行正常,但是在注释该方法并调用线程版本时,问题就出现了
如果有人能提出流
无法运行的原因,我将不胜感激。在多线程情况下,您调用关闭
方法的速度比DoRequest
更快
这是因为这两条线在最后一块
socketStream.Close();
connection.Close();
这两行是在Start
方法启动新线程之后,但在该线程在DoRequest
中完成其工作之前立即执行的
我建议您在DoRequest
中调用这些方法。您可以将connection
对象传递到DoRequest
,然后在DoRequest
内部创建socketStream
,完成后,在完成DoRequest
方法之前关闭这两个对象。(或者您可以使用任何其他解决方案,这只是一个选项。)如果您向我们提供了错误消息,将会有所帮助。。除此之外,我们只能猜测问题出在哪里“流不可写。此外,它还表示我的StreamWriter和StreamReader等于null,尽管我已经创建了它们。当我不使用线程时,这段代码可以很好地工作。谢谢,除了我只能通过线程上的Start方法传递一个参数外,这段代码工作正常,我目前正在传递NetworkStream。您建议如何关闭DoRequest方法内的连接。谢谢您可以在DoRequest中使用try finally。好的,谢谢您,我已经能够实现这一点,但是自从我开始使用线程版本以来,我的DoRequest方法已经停止正常工作。当从客户端输入时,它会更新一个人的位置,但现在不会了。我的DoRequest方法如下所示: