不管是Client还Server,如果Server的button2_Click按下监听了,Client按下发送了,Server能正常收到Client发送的内容,当再按button2_Click或者Client发送的按钮就无法响应了。当Server按下发送,Client按下监听时,Client也能收到Server发来的内容,但是第二次也无法响应了。这如何解决?button2_Click每按下监听才监听一次,能否始终监听?如何实现?Client也希望始终监听,并且监听的同时都希望能不妨碍Server和Client相互发送信息。
服务器:
delegate void setText();//定义一个线程委托 private void button2_Click(object sender, EventArgs e)
{
Thread demoThread = new Thread(new ThreadStart(this.ThreadProcSafe));
demoThread.Start();
}
private void ThreadProcSafe()
{
setText d = new setText(Threading); //实例化一个委托
this.Invoke(d); //在拥用此控件的基础窗体句柄的线程上执行指定的委托
}
public void Threading()
{
try
{
int server_port = 12345;
string server_ip = GetLocalIp();
IPAddress localhost_ip = IPAddress.Parse(GetLocalIp());//将 IP 地址字符串转换为 IPAddress 实例
IPEndPoint server_ipe = new IPEndPoint(localhost_ip, server_port);//将网络端点表示为 IP 地址和端口号。
Socket server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server_socket.Bind(server_ipe);//绑定
server_socket.Listen(50);//参数指定队列中最多可容纳的等待接受的传入连接
Socket temp = server_socket.Accept();
clientip = (IPEndPoint)temp.RemoteEndPoint;
//}
string recvStr = "";
byte[] recvBytes = new byte[1024*8];
int bytes;
bytes = temp.Receive(recvBytes);// 接收指定字节数的数据,并将数据存入接收缓冲区。
MessageBox.Show("hello"+ bytes); Encoding.UTF8.GetString(recvBytes);
textBox1.Text += recvStr;
textBox1.Text += System.Environment.NewLine;
textBox1.Update();
BeepUp.Beep(500, 700);
this.BringToFront();
this.Focus();
}
catch (ArgumentNullException es)
{
Console.WriteLine("ArgumentNullException: {0}", es);
}
catch (SocketException es)
{
Console.WriteLine("SocketException: {0}", es);
}
Console.ReadLine();
}
private void button1_Click(object sender, EventArgs e)
{
try
{
IPEndPoint client_ipe = (IPEndPoint)this.clientip;
Socket server_send = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server_send.Connect(client_ipe);
string client_sendStr = this.textBox2.Text;
byte[] client_sendbytes = Encoding.UTF8.GetBytes(client_sendStr);
server_send.Send(client_sendbytes); server_send.Close();
}
catch (ArgumentNullException es)
{
Console.WriteLine("ArgumentNullException: {0}", es);
}
catch (SocketException es)
{
Console.WriteLine("SocketException: {0}", es);
}
Console.ReadLine();
}客户端:
private void pictureBox1_Click(object sender, EventArgs e)
{
try
{
int serverhost_port = Convert.ToInt32(Settings.setting_textBox3);
string serverhost_ip = Settings.setting_textBox2;
IPAddress client_ip = IPAddress.Parse(serverhost_ip);
IPEndPoint client_ipe = new IPEndPoint(client_ip, serverhost_port);
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(client_ipe);
string client_sendStr = Settings.setting_textBox4+",请求人工服务!!!";
byte[] client_sendbytes = Encoding.UTF8.GetBytes(client_sendStr);
client.Send(client_sendbytes);
string recvStr = "";
byte[] recvBytes = new byte[1024*8];
int bytes;
bytes = client.Receive(recvBytes);//接收数据,并将数据存入接收缓冲区。
recvStr += Encoding.UTF8.GetString(recvBytes);
MessageBox.Show(recvStr);//服务器发过来的数据直接弹出
client.Close();
}
catch (ArgumentNullException es)
{
Console.WriteLine("ArgumentNullException: {0}", es);
}
catch (SocketException es)
{
Console.WriteLine("SocketException: {0}", es);
}
Console.ReadLine();
} private void pictureBox3_Click(object sender, EventArgs e)
{
try
{
int serverhost_port = Convert.ToInt32(Settings.setting_textBox3);
string serverhost_ip = Settings.setting_textBox2;
IPAddress client_ip = IPAddress.Parse(serverhost_ip);
IPEndPoint client_ipe = new IPEndPoint(client_ip, serverhost_port);
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(client_ipe);
string client_sendStr = "";
if (BuytextBox.Text.Length == 0)
{ }
else
{
client_sendStr = Settings.setting_textBox4 + BuytextBox.Text;// +"ENDENDENDENDENDENDENDENDENDENDEND";
}
byte[] client_sendbytes = Encoding.UTF8.GetBytes(client_sendStr);
client.Send(client_sendbytes);
string client_recvStr = "";
byte[] client_recvBytes = new byte[1024];
int bytes;
bytes = client.Receive(client_recvBytes);//接收数据,并将数据存入接收缓冲区。
client_recvStr += Encoding.UTF8.GetString(client_recvBytes);
MessageBox.Show(client_recvStr);
}
catch (ArgumentNullException es)
{
Console.WriteLine("ArgumentNullException: {0}", es);
}
catch (SocketException es)
{
Console.WriteLine("SocketException: {0}", es);
}
Console.ReadLine();
}
服务器:
delegate void setText();//定义一个线程委托 private void button2_Click(object sender, EventArgs e)
{
Thread demoThread = new Thread(new ThreadStart(this.ThreadProcSafe));
demoThread.Start();
}
private void ThreadProcSafe()
{
setText d = new setText(Threading); //实例化一个委托
this.Invoke(d); //在拥用此控件的基础窗体句柄的线程上执行指定的委托
}
public void Threading()
{
try
{
int server_port = 12345;
string server_ip = GetLocalIp();
IPAddress localhost_ip = IPAddress.Parse(GetLocalIp());//将 IP 地址字符串转换为 IPAddress 实例
IPEndPoint server_ipe = new IPEndPoint(localhost_ip, server_port);//将网络端点表示为 IP 地址和端口号。
Socket server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server_socket.Bind(server_ipe);//绑定
server_socket.Listen(50);//参数指定队列中最多可容纳的等待接受的传入连接
Socket temp = server_socket.Accept();
clientip = (IPEndPoint)temp.RemoteEndPoint;
//}
string recvStr = "";
byte[] recvBytes = new byte[1024*8];
int bytes;
bytes = temp.Receive(recvBytes);// 接收指定字节数的数据,并将数据存入接收缓冲区。
MessageBox.Show("hello"+ bytes); Encoding.UTF8.GetString(recvBytes);
textBox1.Text += recvStr;
textBox1.Text += System.Environment.NewLine;
textBox1.Update();
BeepUp.Beep(500, 700);
this.BringToFront();
this.Focus();
}
catch (ArgumentNullException es)
{
Console.WriteLine("ArgumentNullException: {0}", es);
}
catch (SocketException es)
{
Console.WriteLine("SocketException: {0}", es);
}
Console.ReadLine();
}
private void button1_Click(object sender, EventArgs e)
{
try
{
IPEndPoint client_ipe = (IPEndPoint)this.clientip;
Socket server_send = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server_send.Connect(client_ipe);
string client_sendStr = this.textBox2.Text;
byte[] client_sendbytes = Encoding.UTF8.GetBytes(client_sendStr);
server_send.Send(client_sendbytes); server_send.Close();
}
catch (ArgumentNullException es)
{
Console.WriteLine("ArgumentNullException: {0}", es);
}
catch (SocketException es)
{
Console.WriteLine("SocketException: {0}", es);
}
Console.ReadLine();
}客户端:
private void pictureBox1_Click(object sender, EventArgs e)
{
try
{
int serverhost_port = Convert.ToInt32(Settings.setting_textBox3);
string serverhost_ip = Settings.setting_textBox2;
IPAddress client_ip = IPAddress.Parse(serverhost_ip);
IPEndPoint client_ipe = new IPEndPoint(client_ip, serverhost_port);
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(client_ipe);
string client_sendStr = Settings.setting_textBox4+",请求人工服务!!!";
byte[] client_sendbytes = Encoding.UTF8.GetBytes(client_sendStr);
client.Send(client_sendbytes);
string recvStr = "";
byte[] recvBytes = new byte[1024*8];
int bytes;
bytes = client.Receive(recvBytes);//接收数据,并将数据存入接收缓冲区。
recvStr += Encoding.UTF8.GetString(recvBytes);
MessageBox.Show(recvStr);//服务器发过来的数据直接弹出
client.Close();
}
catch (ArgumentNullException es)
{
Console.WriteLine("ArgumentNullException: {0}", es);
}
catch (SocketException es)
{
Console.WriteLine("SocketException: {0}", es);
}
Console.ReadLine();
} private void pictureBox3_Click(object sender, EventArgs e)
{
try
{
int serverhost_port = Convert.ToInt32(Settings.setting_textBox3);
string serverhost_ip = Settings.setting_textBox2;
IPAddress client_ip = IPAddress.Parse(serverhost_ip);
IPEndPoint client_ipe = new IPEndPoint(client_ip, serverhost_port);
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(client_ipe);
string client_sendStr = "";
if (BuytextBox.Text.Length == 0)
{ }
else
{
client_sendStr = Settings.setting_textBox4 + BuytextBox.Text;// +"ENDENDENDENDENDENDENDENDENDENDEND";
}
byte[] client_sendbytes = Encoding.UTF8.GetBytes(client_sendStr);
client.Send(client_sendbytes);
string client_recvStr = "";
byte[] client_recvBytes = new byte[1024];
int bytes;
bytes = client.Receive(client_recvBytes);//接收数据,并将数据存入接收缓冲区。
client_recvStr += Encoding.UTF8.GetString(client_recvBytes);
MessageBox.Show(client_recvStr);
}
catch (ArgumentNullException es)
{
Console.WriteLine("ArgumentNullException: {0}", es);
}
catch (SocketException es)
{
Console.WriteLine("SocketException: {0}", es);
}
Console.ReadLine();
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货