先看实现效果:
简单说一下实现的思路,
一.服务器开发思路
1.先实例化一个主机,当服务器。
2.创建套接字通信
3.绑定主机
4.启动监听
5. accsock = sock.Accept(); 等待客户端连接。同步模式下 如果客户端未连接将不会执行后面代码。
6. 如果客户端连接,那么就可以进行通信
7. 通信分为发送消息和接收消息
8. 断开连接
1-6的代码如下:
private void accp()
{
//创建一个主机
myserver = new IPEndPoint(myip, Int32.Parse(textBox2.Text));
//创建套接字
sock = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//绑定主机
sock.Bind(myserver);
//监听
sock.Listen(50);
listBox1.Items.Add("主机" + textBox1.Text + "端口" + textBox2.Text + "开始监听.......\r\n");
while (true)
{
try
{
//接收连接请求 同步模式下会一只等待客户端链接。只到有用户链接才会执行后面的代码。
accsock = sock.Accept();
}
catch (Exception)
{
this.listBox1.Items.Add("服务器已关闭!!\r\n");
break;
}
if (accsock.Connected)
{
listBox1.Items.Add("与客户建立连接。");
theeadround = new Thread(new ThreadStart(round));
theeadround.Start();
}
}
}
7的代码如下:
7.1接收消息的代码(接收消息为了方便 另外开启了子线程可以一直接用来收消息)
private void round()
{
while (check)
{
try
{
if (accsock.Available <= 0) continue;
Byte[] rec = new Byte[64];
//用网络流的形式读取
NetworkStream netsream = new NetworkStream(accsock);
netsream.Read(rec, 0, rec.Length);
string recmessage = Encoding.BigEndianUnicode.GetString(rec);
this.textBox3.AppendText(recmessage + "\r\n") ;
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
}
}
7.2发送消息的代码如下(和接收消息代码同理)
try
{
Byte[] sendByte = new Byte[64];
string send = this.textBox4.Text+"\r\n";
//用网络流的形式发送
NetworkStream netstream = new NetworkStream(accsock);
sendByte = Encoding.BigEndianUnicode.GetBytes(send.ToCharArray());
netstream.Write(sendByte, 0, sendByte.Length);
//刷新缓存
netstream.Flush();
}
catch (Exception)
{
MessageBox.Show("链接未建立,无法发送!");
}
8.的代码如下:
try
{
//关闭主机
sock.Close();
//中止子线程
threadaccp.Abort();
theeadround.Abort();
this.listBox1.Items.Add("主机"+this.textBox1.Text+"端口"+textBox2.Text+"停止监听!\r\n");
}
catch (Exception)
{
MessageBox.Show("监听未开始,关闭无效!");
}
其中遇到的线程问题,因为子线程不能调用主线程中的控件,在Load的时候加入一下代码就解决了跨线程问题:
//取消对跨线程的检查
Control.CheckForIllegalCrossThreadCalls = false;
如果子线程开启太多,关闭主线程后有可能关不干净,可以在关闭窗体事件里面加如下代码:
//不管什么线程全部退出
System.Environment.Exit(0);
接着说一下客户端的思路,思路大致和服务端一样。
主要用到了Socket的Connect()方法,此方法是和服务器建立连接的方法。
客户端实现具体核心代码如下:
建立连接的代码:
try
{
//实例化主机
myserver = new IPEndPoint(myip, Int32.Parse(this.textBox2.Text));
//创建套接字
conncctsock = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//和指定的服务器连接
conncctsock.Connect(myserver);
this.listBox1.Items.Add("与主机"+this.textBox1.Text+"端口"+this.textBox2.Text+"连接成功!\r\n");
threadreceive = new Thread(new ThreadStart(receive));
threadreceive.Start();
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
接收消息和发送消息还有关闭连接实现思路和服务器开发一样。