winform学习日志(二十三)---------------socket(TCP)发送文件
2020-11-16 00:18
标签:winform blog class com code img div http java javascript string winform学习日志(二十三)---------------socket(TCP)发送文件,搜素材,soscw.com winform学习日志(二十三)---------------socket(TCP)发送文件 标签:winform blog class com code img div http java javascript string 原文地址:http://www.cnblogs.com/hongmaju/p/3694629.html一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.IO;
namespace client
{
public partial class Client : Form
{
public Client()
{
InitializeComponent();
}
//创建 1个客户端套接字 和1个负责监听服务端请求的线程
Socket socketClient = null;
Thread threadClient = null;
private delegate void SetText(string text);
///
二:服务端
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.IO;
namespace socket
{
public partial class Server : Form
{
public Server()
{
InitializeComponent();
//关闭对文本框的非法线程操作检查,不建议用
//TextBox.CheckForIllegalCrossThreadCalls = false;
}
Socket socketWatch = null;//负责监听客户端的套接字
Thread threadWatch = null;//负责监听客户端的线程
Thread threadMoveList = null;//负责去掉失败的socket的ip
//声明一个带参数委托处理文本显示
private delegate void SetText(string text);
//声明一个处理ip添加到listbox的委托
private delegate void listboxAdd(string ipsocket);
//声明一个处理在listbox去除ip的委托
private delegate void listboxmove(string ipsocket);
/// 开始服务端监听
///
///
///
private void btn_StartServer_Click(object sender, EventArgs e)
{
#region
//创建一个Socket实例
//第一个参数表示使用ipv4
//第二个参数表示发送的是数据流
//第三个参数表示使用的协议是Tcp协议
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//获取ip地址
IPAddress ip = IPAddress.Parse(tb_ip.Text.Trim());
//创建一个网络通信节点,这个通信节点包含了ip地址,跟端口号。
//这里的端口我们设置为1029,这里设置大于1024,为什么自己查一下端口号范围使用说明。
IPEndPoint endPoint = new IPEndPoint(ip, int.Parse(tb_socket.Text.Trim()));
//设置SOCKET允许多个SOCKET访问同一个本地IP地址和端口号
socketWatch.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
//Socket绑定网路通信节点
socketWatch.Bind(endPoint);
//将套接字的监听队列长度限制为10
socketWatch.Listen(10);
ShowMsg("开启监听!");
//实力化一个线程上的委托
ThreadStart threadDelegate = new ThreadStart(this.accpet);//还需要invoke
//实力化一个处理线程委托的的新线程
threadWatch = new Thread(threadDelegate);
//等同于上面两句newthread = new Thread(new ThreadStart(this.accpet));
threadWatch.IsBackground = true;
threadWatch.Start();
#endregion
}
//消息框里面数据
public void ShowMsg(string str)
{
if (this.tb_infor.InvokeRequired)
{
//实例化一个委托
SetText d = new SetText(ShowMsg);
this.Invoke(d, new object[] { str });
}
else
{
//string Ystr = "";
//if (tb_infor.Text != "")
//{
// Ystr = tb_infor.Text + "\r\n";
//}
//this.tb_infor.Text = Ystr + str + GetCurrentTime();
tb_infor.AppendText(str + GetCurrentTime() + "\r\n");
}
}
Dictionarystring, Socket> socketDir = new Dictionarystring, Socket>();//将每一个与客户端进行通信的Socket放到该集合中.
public void accpet()
{
while (true)//注意该循环,服务端要持续监听,要不然一个客户端链接过后就无法链接第二个客户端了。
{
Socket SocketConnection = null;//创建一个负责和客户端通信的套接字
//创建一个接收客户端通信的Socket
SocketConnection = socketWatch.Accept();
socketDir.Add(SocketConnection.RemoteEndPoint.ToString(), SocketConnection);//将负责与客户端进行通信的Socket实例添加到集合中。
//如果监听到客户端有链接,则运行到下一部,提示,链接成功!
listboxADD(SocketConnection.RemoteEndPoint.ToString());
ShowMsg("链接成功!");
//创建一个通信线程
ParameterizedThreadStart pts = new ParameterizedThreadStart(ServerRecMsg);
Thread thr = new Thread(pts);
//在定义窗体线程的时候,设置线程启动前状态就行了,解决异常
thr.SetApartmentState(ApartmentState.STA);
thr.IsBackground = true;
//启动线程
thr.Start(SocketConnection);
}
}
///
文章标题:winform学习日志(二十三)---------------socket(TCP)发送文件
文章链接:http://soscw.com/index.php/essay/21563.html