效果如图:
源码下载
服务端主要通过TcpListener类的Start方法监听,通过Acceptsocket方法来接收请求信息。
下面分别给出三个按钮的代码:
服务器 开始监听代码如下:
private void button1_Click(object sender, EventArgs e)
{
try
{
//在指定端口上侦听
listenner = new TcpListener(Int32.Parse(this.textBox1.Text));
//开始侦听
listenner.Start();
this.toolStripStatusLabel1.Text = "现在处于待机状态.....";
//用线程接收是否有用户连接
Thread thread = new Thread(()=>{
while (true)
{
try
{
// 接受挂起的连接请求。 返回接收到的数据 Socket AcceptSocket()一定要写在循环里面,不然客户断开连接 就连接不上了
mysocket = listenner.AcceptSocket();
//如果接收到最近的请求 就返回true
if (mysocket.Connected)
{
this.toolStripStatusLabel1.Text = "和客户建立连接....";
//再开个线程专门用来接收消息
Thread thread1 = new Thread(()=> {
//接收客户发来的消息
while (!control)
{
try
{
//通过网络流的形式接收客户发来的数据
netstraem = new NetworkStream(mysocket);
byte[] messageByte = new byte[64];
//采用同步读取消息方式
netstraem.Read(messageByte, 0, messageByte.Length);
string ReadMessage = Encoding.BigEndianUnicode.GetString(messageByte);
this.textBox2.AppendText(ReadMessage + "\r\n");
}
catch (Exception)
{
Console.WriteLine("连接断开,套接字为空");
}
}
});
thread1.Start();
}
}
catch (Exception)
{
Console.WriteLine("SOCKET断开连接....");
}
}
});
//启动线程
thread.Start();
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
}
发送消息代码:
private void button2_Click(object sender, EventArgs e)
{
try
{
netstraem = new NetworkStream(mysocket);
string send = this.textBox4.Text + ">>>>" + this.textBox3.Text+"\r\n";
byte[] bytedate = Encoding.BigEndianUnicode.GetBytes(send);
netstraem.Write(bytedate, 0, bytedate.Length);
//刷新缓存
netstraem.Flush();
}
catch (Exception)
{
MessageBox.Show("未建立连接发送失败!");
}
}
关闭代码:
private void button3_Click(object sender, EventArgs e)
{
try
{
if (mysocket==null)
{
this.toolStripStatusLabel1.Text = "监听已关闭....";
listenner.Stop();
}
else
{
mysocket.Close();
listenner.Stop();
this.toolStripStatusLabel1.Text = "监听已关闭....";
}
}
catch (Exception ee)
{
Console.WriteLine(ee.Message);
}
}
如果想监听客户端是否断开连接,可以单独开一个线程进行检查
代码如下:
private void 服务器_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
Thread t = new Thread(() => {
while (true)
{
try
{
if (mysocket == null) continue;
//检查客户端是否断开连接 第一个参数未负数 表示会一直检查。
if (mysocket.Poll(-1, SelectMode.SelectRead))
{
this.toolStripStatusLabel1.Text = "客户端断开连接....";
}
}
catch (Exception)
{
Console.WriteLine("连接已经关闭!");
}
}
});
t.Start();
}
接着是客户端:
客户端主要使用TcpClient类的TcpClient方法进行连接和Connect方法
我用的Connect
代码如下:
连接按钮
private void button1_Click(object sender, EventArgs e)
{
try
{
int port = Int32.Parse(this.textBox5.Text);
client=new TcpClient();
client.Connect(textBox1.Text,port);
this.toolStripStatusLabel1.Text = "可通话!";
Thread thread = new Thread(()=> {
//接收消息
while (!control)
{
try
{
// 返回用于发送和接收数据的
netstrcam = client.GetStream();
byte[] messageByte = new byte[64];
netstrcam.Read(messageByte, 0, messageByte.Length);
string readNessage = Encoding.BigEndianUnicode.GetString(messageByte);
this.textBox2.AppendText(readNessage + "\r\n");
}
catch (Exception)
{
Console.WriteLine("连接断开....");
}
}
});
thread.Start();
}
catch (Exception)
{
MessageBox.Show("无法连接!");
}
}
发送按钮 和 关闭按钮和上面服务端代码类似。这里就不发了
上面代码都是同步模式下的开发。
异步模式下的开发和我之前写的Socket方式是一样的,异步开发~~~~~点我=====