using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SocketServerDemo
{
public partial class FrmServerDemo : Form
{
public FrmServerDemo()
{
InitializeComponent();
}
public Socket mysocket;//Socket对象
bool Stop = false;//标志位
//打开服务器监听客户端连接请求
private void txtOpenServer_Click(object sender, EventArgs e)
{
try
{
IPAddress ipadr = IPAddress.Parse("127.0.0.1");//服务器IP地址
TcpListener mylistrn = new TcpListener(ipadr, 6001);//实例化监听助手类对象
mylistrn.Start();//开始监听
lstInfo.Items.Add("服务器启动!");//提示信息
while (true)
{
if (Stop == true)//标志位
{
tmrServer.Stop();//关闭计时器
break;
}
Application.DoEvents();//防止死循环时程序未响应
if (mylistrn.Pending())//判断是否有客户端连接请求
{
mysocket = mylistrn.AcceptSocket();//接受客户端请求
mysocket.Send(Encoding.Unicode.GetBytes("服务器连接成功!"));//向客户端发送消息,收到表示连接成功
tmrServer.Start();//启动定时器,循环监听客户端发送的消息,此处也可用线程,不过timer也是多线程的而且可以跨线程共享资源
}
}
Application.Exit();//释放资源,关闭程序
}
catch (Exception ex)
{
MessageBox.Show("Listen Error" + ex.Message);//异常提示
}
}
// 为客户端开辟独立线程监听消息100毫秒执行一次
private void tmrServer_Tick(object sender, EventArgs e)
{
byte[] data = new byte[1024];
if (mysocket.Available > 0)
{
mysocket.Receive(data);//读取数据
string content = Encoding.Unicode.GetString(data);//把字节流转字符串
lstInfo.Items.Add(content);//显示字符
}
}
//用于给标志位Stop赋值
private void FrmServerDemo_FormClosing(object sender, FormClosingEventArgs e)
{
Stop = true;
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace SocketClient
{
public partial class FrmClient : Form
{
public FrmClient()
{
InitializeComponent();
}
TcpClient tcpClient = new TcpClient();//客户端助手类
NetworkStream ns;//数据流对象
bool Stop = false;//标志位,用于释放资源
//btnSend_Click时间用于客户端向服务器发送数据
private void btnSend_Click(object sender, EventArgs e)
{
ns = tcpClient.GetStream();//实例化NetworkStream
string count = txtInfo.Text.Trim();//要发送的字符串
byte[] data = Encoding.Unicode.GetBytes(count);//把字符串转化为字节数组,因为网络数据传输的是字节
ns.Write(data, 0, data.Length);//把字符串转化为字节数组,因为网络数据传输的是字节
txtInfo.Clear();
}
// btnConn_Click事件用于连接服务端并监听消息接收。
private void btnConn_Click(object sender, EventArgs e)
{
try
{
tcpClient.Connect(txtIp.Text.Trim(), 6001);//连接服务器
ns = tcpClient.GetStream();//实例化NetworkStream
byte[] bytes = Encoding.Unicode.GetBytes("客户端上线!");//把字符串转化为字节数
ns.Write(bytes, 0, bytes.Length);//向服务端发送数据,收到表示连接成功
while (true)//向服务端发送数据,收到表示连接成功
{
if (Stop == true)//标志位 跳出死循环
{
break;
}
Application.DoEvents();//防止死循环时程序未响应
if (tcpClient.Available > 0)//判断是否有数据可供读取
{
byte[] data = new byte[1024];
ns.Read(data, 0, 1024);//读取数据
string content = Encoding.Unicode.GetString(data);//把字节流转换为字符串
lstInfo.Items.Add(content);//显示字符串
}
}
Application.Exit();//释放资源,关闭程序
}
catch (Exception ex)
{
MessageBox.Show("服务未开启!" + ex.Message);//异常提示
}
}
// 用于给标志位Stop赋值
private void FrmClient_FormClosing(object sender, FormClosingEventArgs e)
{
Stop = true;
}
}
}
版权声明:本文为m0_37809070原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。