应用需要,想用c#想实现一个简单的窗体,通过按钮触发事件发送数据,然后将从java客户端接收到的数据显示在窗体的richtextbox 中,能正常接受数据,一旦循环接受数据显示时,整个窗体就处于死机状态。????不知道怎么解决这个问题? public partial class Form1 : Form
{
private Socket client = null;
delegate void ThreadMethod(object obj);
ThreadMethod _tm = null; private void Form1_Load(object sender, EventArgs e)
{
} private void button1_Click(object sender, EventArgs e)
{
//程序启动时便与远程进行连接
client = Connect("192.168.1.55", 9111);
try
{
if (client.Connected)
{
byte[] sends = Encoding.Default.GetBytes(this.textBox1.Text);
byte[] byteConvet = new byte[23];
byteConvet[0] = 0;
byteConvet[1] = 0x15;
for (int i = 2; i < 23; i++) {
byteConvet[i] = sends[i - 2];
}
client.Send(byteConvet);
string recvStr=""; byte[] recvBytes=new byte[1024];
int bytes=0;
while(true) {
bytes = client.Receive(recvBytes, recvBytes.Length, 0);
//将读取的字节数转换为字符串
recvStr += Encoding.UTF8.GetString(recvBytes, 2, bytes-2);
_tm = Show;
_tm(recvStr);
}
}
}
catch {
}
}
private Socket Connect(string ip, int port)
{
IPAddress ipa = IPAddress.Parse(ip);
IPEndPoint ipe = new IPEndPoint(ipa, port);
Socket sender = new Socket(
AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
sender.Connect(ipe);
}
catch
{
return null;
}
return sender;
}
private void Show(object obj)
{
if (!this.richTextBox1.InvokeRequired)
{
this.richTextBox1.Invoke(new EventHandler(ControlDelegate),
new object[] { obj, EventArgs.Empty });
}
}
private void ControlDelegate(object sender, EventArgs e)
{
this.richTextBox1.Text = sender.ToString();
}
public Form1()
{
InitializeComponent();
} }
感觉问题的所在就在while 循环的地方,socket线程一直在占用主窗体的线程。请教解决办法。
{
private Socket client = null;
delegate void ThreadMethod(object obj);
ThreadMethod _tm = null; private void Form1_Load(object sender, EventArgs e)
{
} private void button1_Click(object sender, EventArgs e)
{
//程序启动时便与远程进行连接
client = Connect("192.168.1.55", 9111);
try
{
if (client.Connected)
{
byte[] sends = Encoding.Default.GetBytes(this.textBox1.Text);
byte[] byteConvet = new byte[23];
byteConvet[0] = 0;
byteConvet[1] = 0x15;
for (int i = 2; i < 23; i++) {
byteConvet[i] = sends[i - 2];
}
client.Send(byteConvet);
string recvStr=""; byte[] recvBytes=new byte[1024];
int bytes=0;
while(true) {
bytes = client.Receive(recvBytes, recvBytes.Length, 0);
//将读取的字节数转换为字符串
recvStr += Encoding.UTF8.GetString(recvBytes, 2, bytes-2);
_tm = Show;
_tm(recvStr);
}
}
}
catch {
}
}
private Socket Connect(string ip, int port)
{
IPAddress ipa = IPAddress.Parse(ip);
IPEndPoint ipe = new IPEndPoint(ipa, port);
Socket sender = new Socket(
AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
sender.Connect(ipe);
}
catch
{
return null;
}
return sender;
}
private void Show(object obj)
{
if (!this.richTextBox1.InvokeRequired)
{
this.richTextBox1.Invoke(new EventHandler(ControlDelegate),
new object[] { obj, EventArgs.Empty });
}
}
private void ControlDelegate(object sender, EventArgs e)
{
this.richTextBox1.Text = sender.ToString();
}
public Form1()
{
InitializeComponent();
} }
感觉问题的所在就在while 循环的地方,socket线程一直在占用主窗体的线程。请教解决办法。
我最近也在做SOCKET的东东
可以交流下
bytes = client.Receive(recvBytes, recvBytes.Length, 0);
//将读取的字节数转换为字符串
recvStr += Encoding.UTF8.GetString(recvBytes, 2, bytes-2);
_tm = Show;
_tm(recvStr);
}
要么新开一个线程把这个WHILE放进去,要么用client.BeginRecive这个方法