您的位置:首页 > 编程语言 > C#

C#Socket 案例

2015-05-31 15:57 363 查看
服务器端

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;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace wangluoqi
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
//点击监听按钮时 创建Socket对像
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket对象,如果用UDP协议,则要用SocketTyype.Dgram类型的套接字

//声明ip地址
IPAddress ip = IPAddress.Any;

//创建端口对像
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtprot.Text));

//开始监听
socketWatch.Bind(point);
ShowMsg("监听成功");
//声明一秒内可同时连接的客户端
socketWatch.Listen(10);

//创建后台进程用来监听连接
Thread td = new Thread(listen);
td.IsBackground = true;
td.Start(socketWatch);

}
Socket socketSend;
Dictionary<string, Socket> dc = new Dictionary<string, Socket>();
/// <summary>
/// 创建通信的客户端
/// </summary>
/// <param name="o"></param>
void listen(object o)
{
//把对像转成socket 如果不为socket 返回null
Socket socketwatch = o as Socket;
while (true)
{     //等待客户端连接 创建一个负责通信的Socket
socketSend = socketwatch.Accept();
dc.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
comboBox1.Items.Add(socketSend.RemoteEndPoint.ToString());
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":连接成功");

//新建一个进程,以免程序假死
Thread th = new Thread(Receive);
th.IsBackground = true;
th.Start(socketSend);

}
}

/// <summary>
/// 不停的接收传过来的数据
/// </summary>
/// <param name="o"></param>
void Receive(object o)
{
try
{
while (true)
{
Socket socketSend = o as Socket;

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);
}
}
catch { }
}

private void ShowMsg(string str)
{
txtlog.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 = txtsend.Text;
byte[] buf = Encoding.UTF8.GetBytes(str);
List<byte> blist = new List<byte>();
blist.Add(0);
blist.AddRange(buf);
//将泛型集合转为数组
byte[] nbuf = blist.ToArray();

if (comboBox1.SelectedItem == null)
{
comboBox1.SelectedIndex = 0;
}
dc[comboBox1.SelectedItem.ToString()].Send(nbuf);

//  socketSend.Send(buf);
}

private void button2_Click(object sender, EventArgs e)
{
OpenFileDialog odg = new OpenFileDialog();
odg.InitialDirectory = @"C:\Users\Administrator\Desktop";
odg.ShowDialog();

string filepath = odg.FileName;
txtfilename.Text = filepath;

}

//发送文本
private void button3_Click(object sender, EventArgs e)
{
string stpath = txtfilename.Text;
if (comboBox1.SelectedItem == null)
{
comboBox1.SelectedIndex = 0;
}
using(FileStream fsRead=new FileStream(stpath,FileMode.OpenOrCreate,FileAccess.Read))
{
byte[] buf = new byte[1024 * 1024 * 5];
int r = fsRead.Read(buf, 0, buf.Length);
List<byte> nlist= new List<byte>();
nlist.Add(1);
nlist.AddRange(buf);
//将集合转为数组;
byte[] nbuf = nlist.ToArray();
dc[comboBox1.SelectedItem.ToString()].Send(nbuf, 0, r+1, SocketFlags.None);
}
}

//发送窗口抖动
private void button5_Click(object sender, EventArgs e)
{
if (comboBox1.SelectedItem == null)
{
comboBox1.SelectedIndex = 0;
}
byte[] buf = new byte[1];
buf[0] = 2;
dc[comboBox1.SelectedItem.ToString()].Send(buf);
}
}
}


客户端

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace clent
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Socket socketsend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接服务器
private void button1_Click(object sender, EventArgs e)
{
//创建连接用的socket

//创建连接点
IPAddress ip = IPAddress.Parse(txtip.Text);
//创建要连接的网络点
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtpint.Text));

//连接
socketsend.Connect(point);
ShowMsg("连接成功");

//创建一个后台线层,用于接收服务器发来的数据
Thread td = new Thread(jssend);
td.IsBackground = true;
td.Start();

}

/// <summary>
/// 接收数据
/// </summary>
void jssend()
{
try
{
while (true)
{

byte[] buf = new byte[1024 * 1024 * 2];
//实际接收到的字符数
int r = socketsend.Receive(buf);
if (r == 0)
{
break;
}
//表示接收到的数据是文本
if (buf[0] == 0)
{
string str = Encoding.UTF8.GetString(buf, 1, r-1);
txtlog.AppendText(socketsend.RemoteEndPoint + ":" + str + "\r\n");
}
else if (buf[0] == 1)//表示接收到的数据是文件
{
SaveFileDialog sdg = new SaveFileDialog();
sdg.InitialDirectory = @"C:\Users\Administrator\Desktop";
sdg.Title = "选择保存位置";
sdg.ShowDialog(this);//此处一定要添加this

string filename = sdg.FileName;
using (FileStream fsw = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
fsw.Write(buf, 1, r - 1);
}
MessageBox.Show("保存成功");

}
else if (buf[0] == 2)//表示接收到的数据是窗口抖动
{
int x = this.Location.X;
int y = this.Location.Y;
for (int i = 0; i < 100; i++)
{
this.Location = new Point(x - 10, y - 10);
this.Location = new Point(x, y);

}
}

}
}
catch{}
}

void ShowMsg(string str)
{
txtlog.AppendText(str + "\r\n");
}

private void button2_Click(object sender, EventArgs e)
{
byte[] buf = Encoding.UTF8.GetBytes(txtsend.Text);
socketsend.Send(buf);
}

private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
}
}


实例下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: