C#Socket运行老是死掉——高分求助
电脑CPU是双核,1G内存代码如下:usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Threading;names...
电脑CPU是双核,1G内存
代码如下:
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Base_Server
{
public partial class Form1 : Form
{
private IPAddress _ip = IPAddress.Parse("192.168.1.33");
private IPEndPoint _myServer;
private Socket _socket;
private Socket acceSocket;
private bool check = true;
public Form1()
{ InitializeComponent(); }
private void button1_Click(object sender, EventArgs e)
{
try
{
if (this.textBox1.Text != null)
{
_ip = IPAddress.Parse(this.textBox1.Text.ToString());
}
}
catch{MessageBox.Show("你输入的格式不正确!");}
try
{ Listener(); }
catch (Exception ex)
{ this.textBox3.AppendText(ex.Message); }
}
private void Listener()
{
int port = Convert.ToInt32(this.textBox2.Text.Trim().ToString());
_myServer = new IPEndPoint(_ip,port);
_socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
_socket.Bind(_myServer);
_socket.Listen(3);
this.textBox3.AppendText("主机"+_ip+" 端口"+port+"开始监听...");
while (true)
{
acceSocket = _socket.Accept();
if (acceSocket.Connected)
{ Thread myThread = new Thread(new ThreadStart(roand));
myThread.Start(); }
}
}
private void roand()
{
while (true)
{
while (check)
{
Byte[] res = new Byte[64];
NetworkStream nws = new NetworkStream(acceSocket);
nws.Read(res, res.Length, 0);
string message = System.Text.Encoding.UTF8.GetString(res);
this.richTextBox1.AppendText(res + "\r\n");
}
}
}
private void button2_Click(object sender, EventArgs e)
{
if (acceSocket != null)
{
try
{
string message = this.textBox2.Text.ToString() + "\r\n";
byte[] res = new byte[64];
NetworkStream nws = new NetworkStream(acceSocket);
res = System.Text.Encoding.UTF8.GetBytes(message.ToCharArray());
nws.Write(res, res.Length, 0);
}
catch
{
this.textBox3.AppendText("连接尚未建立,无法发送!!!" + "\r\n");
}
}
}
}
}
回1楼:Accept放到while(true)外还是一样
回3楼:把while所有while去掉还是死 展开
代码如下:
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Base_Server
{
public partial class Form1 : Form
{
private IPAddress _ip = IPAddress.Parse("192.168.1.33");
private IPEndPoint _myServer;
private Socket _socket;
private Socket acceSocket;
private bool check = true;
public Form1()
{ InitializeComponent(); }
private void button1_Click(object sender, EventArgs e)
{
try
{
if (this.textBox1.Text != null)
{
_ip = IPAddress.Parse(this.textBox1.Text.ToString());
}
}
catch{MessageBox.Show("你输入的格式不正确!");}
try
{ Listener(); }
catch (Exception ex)
{ this.textBox3.AppendText(ex.Message); }
}
private void Listener()
{
int port = Convert.ToInt32(this.textBox2.Text.Trim().ToString());
_myServer = new IPEndPoint(_ip,port);
_socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
_socket.Bind(_myServer);
_socket.Listen(3);
this.textBox3.AppendText("主机"+_ip+" 端口"+port+"开始监听...");
while (true)
{
acceSocket = _socket.Accept();
if (acceSocket.Connected)
{ Thread myThread = new Thread(new ThreadStart(roand));
myThread.Start(); }
}
}
private void roand()
{
while (true)
{
while (check)
{
Byte[] res = new Byte[64];
NetworkStream nws = new NetworkStream(acceSocket);
nws.Read(res, res.Length, 0);
string message = System.Text.Encoding.UTF8.GetString(res);
this.richTextBox1.AppendText(res + "\r\n");
}
}
}
private void button2_Click(object sender, EventArgs e)
{
if (acceSocket != null)
{
try
{
string message = this.textBox2.Text.ToString() + "\r\n";
byte[] res = new byte[64];
NetworkStream nws = new NetworkStream(acceSocket);
res = System.Text.Encoding.UTF8.GetBytes(message.ToCharArray());
nws.Write(res, res.Length, 0);
}
catch
{
this.textBox3.AppendText("连接尚未建立,无法发送!!!" + "\r\n");
}
}
}
}
}
回1楼:Accept放到while(true)外还是一样
回3楼:把while所有while去掉还是死 展开
4个回答
展开全部
socket侦听的过程是阻塞模式的,虽然你把侦听过来的套接字都放在一个独立的进程中,但是有一点没有注意到:你也应该把侦听套接字的while 函数放在一个独立于主线程的子线程当中。
不然的话主线程一直没有走出while函数,在套接字阻塞式下等待下一个套接字的连接, 窗口就会出现假死的现象。
还有一点就是你在线程体函数roand()里有修改主线程口里某个控件的值的行为,违反了线程安全,这属于夸线程访问哦,在这里我不多说了你可以到百度上搜一下多得是!
不然的话主线程一直没有走出while函数,在套接字阻塞式下等待下一个套接字的连接, 窗口就会出现假死的现象。
还有一点就是你在线程体函数roand()里有修改主线程口里某个控件的值的行为,违反了线程安全,这属于夸线程访问哦,在这里我不多说了你可以到百度上搜一下多得是!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你真牛!!
别说1G内存了,就算是4核+4G也得死!
Listener中不可使用while(true),也没必要开辟线程来实现异步。
另外线程内别在while(true)了。
1个cpu时间会执行多少次这个while(true)吗?
计算int.MaxValue的累加也用不了一个CPU时间。
CPU迅速达到99%,内存也很快达到2/3。
_socket.Accept()返回的socket保存到list或dictionary中,这样服务端可以控制客户端的连接(T人,指定某人回复);
至于异步,别使用线程,因为你这里没有使用线程池,如果使用socket自带的异步方法(或自定义委托)这样会更好。
private void button1_Click(object sender, EventArgs e)
{
Socket server = new TcpClient().Client;
server.BeginAccept(new AsyncCallback(this.callback),server);
}
private void callback(IAsyncResult result)
{
if (result.IsCompleted)
{
Socket server = result.AsyncState as Socket;
var client = server.EndAccept(result);
}
}
就是大量使用begin** 和end**
别说1G内存了,就算是4核+4G也得死!
Listener中不可使用while(true),也没必要开辟线程来实现异步。
另外线程内别在while(true)了。
1个cpu时间会执行多少次这个while(true)吗?
计算int.MaxValue的累加也用不了一个CPU时间。
CPU迅速达到99%,内存也很快达到2/3。
_socket.Accept()返回的socket保存到list或dictionary中,这样服务端可以控制客户端的连接(T人,指定某人回复);
至于异步,别使用线程,因为你这里没有使用线程池,如果使用socket自带的异步方法(或自定义委托)这样会更好。
private void button1_Click(object sender, EventArgs e)
{
Socket server = new TcpClient().Client;
server.BeginAccept(new AsyncCallback(this.callback),server);
}
private void callback(IAsyncResult result)
{
if (result.IsCompleted)
{
Socket server = result.AsyncState as Socket;
var client = server.EndAccept(result);
}
}
就是大量使用begin** 和end**
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、你在窗口主线程里,执行while(true)循环Accept,窗口会死掉。
2、你在非窗口主线程里,直接对窗口控件进行修改,这个也会死掉。
2、你在非窗口主线程里,直接对窗口控件进行修改,这个也会死掉。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
最好 把 死循环 写入线程中去, 这样就避免了窗口死掉的情况
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询