c# socket多线程问题~
一个服务器可以服务多个客户端,单个运行正常,可是第二个客户端启动后第一个客户端无法接受服务器的消息,第二个还可以正常运行~代码如下:staticvoidMain(stri...
一个服务器可以服务多个客户端,单个运行正常,可是第二个客户端启动后第一个客户端无法接受服务器的消息,第二个还可以正常运行~
代码如下:
static void Main(string[] args)
{
SerSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
SerSock.Bind(new IPEndPoint(IPAddress.Any, 55555));
SerSock.Listen(10);
Console.WriteLine("This is Server,ready to work");
while (true)
{
Accepted = SerSock.Accept();
Thread ListenThread = new Thread(new ThreadStart(Process));
ListenThread.Start();
}
}
Process是对客户端提供服务的函数,不知道错误在哪啊? 展开
代码如下:
static void Main(string[] args)
{
SerSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
SerSock.Bind(new IPEndPoint(IPAddress.Any, 55555));
SerSock.Listen(10);
Console.WriteLine("This is Server,ready to work");
while (true)
{
Accepted = SerSock.Accept();
Thread ListenThread = new Thread(new ThreadStart(Process));
ListenThread.Start();
}
}
Process是对客户端提供服务的函数,不知道错误在哪啊? 展开
5个回答
展开全部
启动了第二个客户端导致第一个客户端不能正常运行的原因是:Process方法中有对变量Accepted的操作,且每次只针对最新的Accepted变量操作。当第二个客户端成功连接后(即while循环已经执行到了第二次,这时的ListenThread线程只处理第二次循环中产生的客户端Accepted. 解决方法如下:
static void Main(string[] args){
while (true)
{
Socket accepted = SerSock.Accept();
ParameterizedThreadStart pts = new ParameterizedThreadStart(Process);
Thread th = new Thread(pts);
th.Start(accepted);
}
}
}
static void Process(object obj)
{
Socket soc=(Socket)obj;
//在这里针对soc进行操作
}
注意:需要修改Process方法,让它接受一个object类型的参数。
static void Main(string[] args){
while (true)
{
Socket accepted = SerSock.Accept();
ParameterizedThreadStart pts = new ParameterizedThreadStart(Process);
Thread th = new Thread(pts);
th.Start(accepted);
}
}
}
static void Process(object obj)
{
Socket soc=(Socket)obj;
//在这里针对soc进行操作
}
注意:需要修改Process方法,让它接受一个object类型的参数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int LastIndexSign = Context.Request.Url.AbsolutePath.LastIndexOf("/");
Context.Response.Clear();
Context.Response.ContentEncoding = Encoding.GetEncoding("gb2312");
Context.Response.StatusCode = 301;
Context.Response.Status = "301 Moved Permanently";
Context.Response.Charset = "gb2312";
Context.Response.AppendHeader("location", LastIndexSign == Context.Request.Url.AbsolutePath.Length - 1 ? Context.Request.Url.AbsolutePath.Insert(LastIndexSign, HttpUtility.UrlEncode("_轴承/", Encoding.GetEncoding("gb2312"))) : Context.Request.Url.AbsolutePath + HttpUtility.UrlEncode("_轴承/", Encoding.GetEncoding("gb2312")));
Context.Response.Flush();
Context.Response.End();
return;
}
Context.Response.Clear();
Context.Response.ContentEncoding = Encoding.GetEncoding("gb2312");
Context.Response.StatusCode = 301;
Context.Response.Status = "301 Moved Permanently";
Context.Response.Charset = "gb2312";
Context.Response.AppendHeader("location", LastIndexSign == Context.Request.Url.AbsolutePath.Length - 1 ? Context.Request.Url.AbsolutePath.Insert(LastIndexSign, HttpUtility.UrlEncode("_轴承/", Encoding.GetEncoding("gb2312"))) : Context.Request.Url.AbsolutePath + HttpUtility.UrlEncode("_轴承/", Encoding.GetEncoding("gb2312")));
Context.Response.Flush();
Context.Response.End();
return;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
很简单,Accepted 作为你与客户端连接的套接字,你是作为全局变量存在的,具有唯一性,正确的方法是,将Process作为一个新的类。
每次有客户端连接产生新的套接字时,实例化该类,将新生成的套接字传递到新的实例中。
每次有客户端连接产生新的套接字时,实例化该类,将新生成的套接字传递到新的实例中。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询