客户端开启了一个新的线程来接收服务器发过来的消息,生成的时候没有问题,但是点启动通知打开两个实例(客户端)(服务器)就会显示第二个实例正在被另一个线程占用,无法打开次文件,及时打开第二个实例,也发送不了
private void button1_Click(object sender, EventArgs e)
{
//创建一个负责监听的socket
Socket socketwatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//创建Ip地址跟端口号
IPAddress ip = IPAddress.Any;
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(textBox2.Text));
//让负责监听的socket绑定ip地址跟端口号
socketwatch.Bind(point);
ShowMsg("监听成功");
Thread th = new Thread(Listen);
th.IsBackground = true;
th.Start(socketwatch);
//设置监听队列
socketwatch.Listen(10);
//负责监听的socket来接收客户端的连接
}
//等待客户端的连接,并且创建与之通信的socket
Socket socketsend;
void Listen(object o)
{
Socket socketwatch = o as Socket;
while (true)
{
socketsend = socketwatch.Accept();
ShowMsg(socketsend.RemoteEndPoint.ToString() + ":" + "连接成功");
//客户端连接成功后,服务器应该接受客户端发来的消息
Thread th = new Thread(Recive);
th.IsBackground = true;
th.Start(socketsend);
}
}
void Recive(object o)
{
Socket socketwatch = o as Socket;
while(true)
{
byte[] buffer = new byte[1024 * 1024 * 2];
//实际接受到的有效字节数
int r = socketsend.Receive(buffer);
if (r == 0)
{
break;
}
string str = Encoding.UTF8.GetString(buffer, 0, r);
ShowMsg(socketsend.RemoteEndPoint + ":" + str);
}
}
void ShowMsg(string str)
{
textBox3.AppendText(str + "\r\n");
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
//服务器给客户端发送消息
private void button4_Click(object sender, EventArgs e)
{
string str = textBox4.Text;
byte[] buffer = Encoding.UTF8.GetBytes(str);
socketsend.Send(buffer);
}
private void button1_Click(object sender, EventArgs e)
{
//创建负责通信的socket
socketsend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(textBox1.Text);
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(textBox2.Text));
socketsend.Connect(point)
ShowMsg("连接成功");
Thread th = new Thread(Recive);
th.IsBackground = true;
th.Start(socketsend);
}
/void Recive(object o)
{
while (true)
{
byte[] buffer = new byte[1024 * 1024 * 3];
int r = socketsend.Receive(buffer);
if (r == 0)
{
break;
}
string s = Encoding.UTF8.GetString(buffer, 0, r);
ShowMsg(socketsend.RemoteEndPoint + ":" + s);
}
}
void ShowMsg(string str)
{
textBox3.AppendText(str + "\r\n");
}
private void button2_Click(object sender, EventArgs e)
{
string str = textBox4.Text.Trim();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
socketsend.Send(buffer);
}
private void Form1_Load(object sender, EventArgs e)
{
//Control.CheckForIllegalCrossThreadCalls = false;
}
在.net进行调试时,所有的类库文件都是独占模式
如果你两个程序公用了一个或多个类库,那么就只能调试1个,另一个用生成好的文件直接运行
应该有2个程序,一个客户端程序,一个服务器端程序。
启动的两个客户端程序,端口号不能一样。