摇奖机小程序
1 首先创建三个Label和button控件
public Form1()
{
InitializeComponent();
}
//在点击按钮事件中
private void button1_Click(object sender, EventArgs e)
{
//刚开始是不赋值
if (button1.Text=="开始")
{
//点击开始后赋值
button1.Text = "停止";
//因为会假死,所以要创建一个新线程
//创建线程对象
Thread th = new Thread(playGame);
//将该线程设为后台线程
th.IsBackground = true;
//标记该线程可以被执行
th.Start();
}
else//赋值
{
button1.Text = "开始";
}
}
//写一个方法来将随机数赋值给larbel文本
public void playGame()
{
Random rRandom = new Random();
//通过一个循环来赋值
while (button1.Text=="停止")
{
//将随机数赋值label文本,注意要ToString
label1.Text = rRandom.Next(0, 10).ToString();
label2.Text = rRandom.Next(0, 10).ToString();
label3.Text = rRandom.Next(0, 10).ToString();
}
}
//在程序加载的时候,取消跨线程的访问
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
Socket通信小程序
创建服务端项目
1 添加ip地址,端口号,以及接收信息,发送信息,文件路径五个textbox控件以及存储ip地址的下拉框(comboBox)控件和开始监听,选择 发送文件,发送信息,震动四个button控件
public Form1()
{
InitializeComponent();
}
//在监听按钮中
private void btnJT_Click(object sender, EventArgs e)
{
try
{
//创建Socket对象
Socket socketWatch = new Socket(AddressFamily.Atm, SocketType.Stream, ProtocolType.Tcp);
//创建ip地址
IPAddress ip = IPAddress.Any;
//创建端口号对象,将地址和端口号传入
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtNumber.Text));
//将Socket对象绑定端口号
socketWatch.Bind(point);
//在文本框中展示监听成功
ShowMsg("监听成功");
//设置监听队列
socketWatch.Listen(10);
//创建一个新线程调用监听方法
Thread th = new Thread(Listen);
//将该线程设为后台线程
th.IsBackground = true;
//标记该线程可以执行了
th.Start(socketWatch);
}
catch { }
}/// <summary>
/// 显示连接信息
/// </summary>
/// <param name="str"></param>
void ShowMsg(string str)
{
//因为可能不止一个连接,所以要追加到文本框,注意换行
txtLog.AppendText(str + "\r\n");
}
/// <summary>
/// 等待连接,并且创建通信的Socket
/// </summary>
void Listen(object o)
{
Socket socketWatch=o as Socket;//因为只能传入object类,所以传入后再强转为Socket类
while (true)
{
try
{
//创建通信用的Socket
Socket socketSend = socketWatch.Accept();
//将客户端IP地址和socketSend存入键值对集合中
dicSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
//将ip地址存入下拉框中
cboUser.Items.Add(socketSend.RemoteEndPoint.ToString());
//展示ip地址连接成功
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");
//开启一个新线程调用接收方法
Thread th = new Thread(Recive);
//将该线程设为后台进程
th.IsBackground = true;
//标记该线程可以执行了
th.Start(socketSend);
}
catch { }
}
}
//声明一个IP地址和Socke键值对集合
Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();
/// <summary>
/// 接收方法
/// </summary>
/// <param name="o"></param>
void Recive(object o)
{
Socket socktSend=o as Socket;//只能传入object类型,所以将object强转为Socket
while (true)
{
try
{
//创建一个3m的数组
byte[] buffer = new byte[1024 * 1024 * 3];
//实际接收的有效字节
int r = socktSend.Receive(buffer);
if (r == 0)//用户关闭后
{
break;
}
//将接收的字节数组按照指定编码格式转换成字符串
string str = Encoding.UTF8.GetString(buffer, 0, r);
//在文本框中展示ip地址和字符串
ShowMsg(socktSend.RemoteEndPoint + ":" + str);
}
catch { }
}
}
/// <summary>
/// 当窗体加载时,取消跨线程的访问
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
/// <summary>
/// 发送信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnFSXX_Click(object sender, EventArgs e)
{
//将文本框中的文本用字符串接收
string str=txtMsg.Text;
//将字符串按照指定编码格式解码成字节数组
byte[]buffer=Encoding.UTF8.GetBytes(str);
//创建字节数组集合
List<byte> list = new List<byte>();
//将0和字节数组添加到集合中
list.Add(0);
list.AddRange(buffer);
//在转换成字节数组,是为了区分发送的是信息还是文件还是震动
byte[]newbuffer=list.ToArray();
//获得下拉框中选择的ip地址
string ip=cboUser.SelectedItem.ToString();
//通过键值对集合中的键来拿Scoket用来发送
dicSocket[ip].Send(newbuffer);
}
//在选择按钮中
private void btnXZ_Click(object sender, EventArgs e)
{
//创建选择文件对话框对象
OpenFileDialog ofd = new OpenFileDialog();
//设置对话框的标题
ofd.Title = "选择你要发送的文件";
//设置对话框的初始目录
ofd.InitialDirectory = @"C:\Users\Administrator\Desktop";
//设置对话框的文本类型
ofd.Filter = ("文本类型|*.txt|图片文件|*.Jpg|媒体类型|*.mav|所有文件类型|*.*");
//展示对话框
ofd.ShowDialog();
//获得对话框中选择的文件路径赋值给文本框
txtPath.Text=ofd.FileName;
//显示选择成功
MessageBox.Show("选择成功");
}
/// <summary>
/// 发送文件中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnFSWJ_Click(object sender, EventArgs e)
{
//获得发送路径
string path=txtPath.Text;
//在using中创建文件流并且读取
using(FileStream fsRead=new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read))
{
byte[] buffer = new byte[1024 * 1024 * 3];
int r=fsRead.Read(buffer,0,buffer.Length);
//创建一个字节数组集合,里面添加第一个元素为1
List<byte> list = new List<byte>();
//添加元素1和字节数组
list.Add(1);
list.AddRange(list);
//再将字节数组转换成字节数组
byte[]newbuffer=list.ToArray();
//通过下拉框中选择的ip地址来获得Socket用来发送
dicSocket[cboUser.SelectedItem.ToString()].Send(newbuffer,0,r+1,SocketFlags.None);
MessageBox.Show("发送成功");
}
}
//震动按钮中
private void btnZD_Click(object sender, EventArgs e)
{
//创建一个长度为1,元素为2的数组
byte[] buffer = new byte[1];
buffer[0] = 2;
//通过下拉框中选择的ip地址来获取Socket用来发送
dicSocket[cboUser.SelectedItem.ToString()].Send(buffer);
}
创建客服端(client)
1 添加ip地址,端口号,接收信息 发送信息的textbox,以及连接和发送信息button几个控件
Socket sockeSend;
//在连接按钮中
private void btnLJ_Click(object sender, EventArgs e)
{
try
{
//创建Socket
sockeSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//从两个文本框拿到IP地址和端口号
IPAddress IP = IPAddress.Parse(txtIP.Text);
IPEndPoint point = new IPEndPoint(IP, Convert.ToInt32(txtNumber.Text));
//用创建的Socket来连接服务器
sockeSend.Connect(point);
//显示连接成功
ShowMsg("连接成功");
//开启一个新线程来调用接收方法
Thread th = new Thread(Recive);
//将该线程设为后台线程
th.IsBackground = true;
//标记该线程可以执行了
th.Start();
}
catch { }
}
void ShowMsg(string str)
{
//因为不止一个连接所以追加到文本框,并且换行
txtLog.AppendText(str + "\r\n");
}
/// <summary>
/// 循环接收服务端发来的信息
/// </summary>
void Recive()
{
while (true)
{
try
{
//创建字节数组来接收
byte[] buffer = new byte[1024 * 1024 * 3];
//实际接收的有效字节
int r = sockeSend.Receive(buffer);
if (r == 0)//停止发送
{
break;
}
//判断发送的类型
if (buffer[0] == 0)
{
//将数组按照指定的编码格式解码成字符串
string str = Encoding.UTF8.GetString(buffer, 1, r - 1);
//将服务端的ip地址和字符串显示在文本框中
ShowMsg(sockeSend.RemoteEndPoint.ToString() + ":" + str);
}
else if (buffer[0] == 1)
{
//创建保存文件对话框对象
SaveFileDialog sfd = new SaveFileDialog();
//设置对话框标题
sfd.Title = "请保存发送过来的文件";
//设置对话框的初始目录
sfd.InitialDirectory = @"C:\Users\Administrator\Desktop";
//设置对话框的文本类型
sfd.Filter = ("所有文件类型|*.*");
//展示对话框
sfd.ShowDialog();
//获得对话框中选择的文件路径
string path = sfd.FileName;
//在using中创建文件流对象并且写入
using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
{
//调用写入方法
fsWrite.Write(buffer, 1, r - 1);
}
MessageBox.Show("保存成功");
}
else if (buffer[0] == 2)
{
ZD();
}
}
catch { }
}
}
/// <summary>
/// 震动方法
/// </summary>
void ZD()
{
//通过循环改变窗体坐标来实现
for(int i = 0; i < 10; i++)
{
this.Location = new Point(200, 300);
this.Location = new Point(300, 400);
}
}
//发送信息按钮中
private void btnFSXX_Click(object sender, EventArgs e)
{
//将文本框中的要发送文本用字符串接收
string str=txtMsg.Text;
//将字符串按照指定编码格式解码成字节数组
byte[]buffer=Encoding.UTF8.GetBytes(str);
//用Soket来发送
sockeSend.Send(buffer);
}
/// <summary>
/// 在窗体加载时,取消跨线程访问
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
}