• [通信] C#多线程Socket-文件传输


    //服务端

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    using System.Net;
     using System.Net.Sockets;
     using System.Threading;
     using System.Xml;
     
     namespace Server
     {
         public partial class ServerMain : Form
         {
             public ServerMain()
             {
                 InitializeComponent();
             }
     
             private void ServerMain_Load(object sender, EventArgs e)
             {
                 this.CmdStar.Enabled = true;
                 this.CmdStop.Enabled = false;
             }
     
             private void 配置参数ToolStripMenuItem_Click(object sender, EventArgs e)
             {
                 Set TSet = new Set();
                 TSet.ShowDialog();
             }
     
             private void 关于ToolStripMenuItem_Click(object sender, EventArgs e)
             {
                 About TAbout = new About();
                 TAbout.Show();
             }
             /// <summary>
             /// 获得XML文件中的端口号
             /// </summary>
             /// <returns></returns>
             private int GetPort()
             {
                 try
                 {
                     XmlDocument TDoc = new XmlDocument();
                     TDoc.Load("Settings.xml");
                     string TPort = TDoc.GetElementsByTagName("ServerPort")[0].InnerXml;
                     return Convert.ToInt32(TPort);
     
                 }
                 catch { return 6600; }//默认是6600
             }
     
             //声明将要用到的类
             private IPEndPoint ServerInfo;//存放服务器的IP和端口信息
             private Socket ServerSocket;//服务端运行的SOCKET
             private Thread ServerThread;//服务端运行的线程
             private Socket[] ClientSocket;//为客户端建立的SOCKET连接
             private int ClientNumb;//存放客户端数量
             private byte[] MsgBuffer;//存放消息数据
     
             private void CmdStar_Click(object sender, EventArgs e)
             {
                 ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
    ProtocolType.Tcp);
                 ServerInfo=new IPEndPoint(IPAddress.Any, this.GetPort());
                 ServerSocket.Bind(ServerInfo);//将SOCKET接口和IP端口绑定
                 ServerSocket.Listen(10);//开始监听,并且挂起数为10
     
                 ClientSocket = new Socket[65535];//为客户端提供连接个数
                 MsgBuffer = new byte[65535];//消息数据大小
                 ClientNumb = 0;//数量从0开始统计
     
                 ServerThread = new Thread(RecieveAccept);//将接受客户端连接的方法委托给线程
                 ServerThread.Start();//线程开始运行
     
                 CheckForIllegalCrossThreadCalls = false;//不捕获对错误线程的调用
     
                 this.CmdStar.Enabled = false;
                 this.CmdStop.Enabled = true;
                 this.StateMsg.Text = "服务正在运行" + " 运行端口:" + this.GetPort().ToString();
                 this.ClientList.Items.Add("服务于 " + DateTime.Now.ToString() + " 开始运行.");
             }
             
             //接受客户端连接的方法
             private void RecieveAccept()
             {
                 while (true)
                 {
                     ClientSocket[ClientNumb] = ServerSocket.Accept();
                     ClientSocket[ClientNumb].BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new
    AsyncCallback(RecieveCallBack),ClientSocket[ClientNumb]);
                     this.ClientList.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToString()+"
    成功连接服务器.");
                    ClientNumb++;
                }
            }
    
            //回发数据给客户端
             private void RecieveCallBack(IAsyncResult AR)
             {
                 try
                 {
                     Socket RSocket = (Socket)AR.AsyncState;
                     int REnd = RSocket.EndReceive(AR);
                     for (int i = 0; i<ClientNumb; i++)
                     {
                         if (ClientSocket[i].Connected)
                         {
                             ClientSocket[i].Send(MsgBuffer, 0, REnd,0);
                         }
                         RSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback
    (RecieveCallBack), RSocket);
     
                     }
                 }
                 catch { }
     
             }
     
             private void CmdStop_Click(object sender, EventArgs e)
             {
                 ServerThread.Abort();//线程终止
                 ServerSocket.Close();//关闭SOCKET
     
                 this.CmdStar.Enabled = true;
                 this.CmdStop.Enabled = false;
                 this.StateMsg.Text = "等待运行";
                 this.ClientList.Items.Add("服务于 " + DateTime.Now.ToString() + " 停止运行.");
             }
         }
     }

    //客户端

    //客户端 
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    using System.Net;
     using System.Net.Sockets;
     
     namespace Client
     {
        public partial class ClientMain : Form
        {
            public ClientMain()
            {
                InitializeComponent();
            }
    
            private IPEndPoint ServerInfo;
            private Socket ClientSocket;
            private Byte[] MsgBuffer;
            private Byte[] MsgSend;
    
            private void ClientMain_Load(object sender, EventArgs e)
            {
                this.CmdSend.Enabled = false;
                this.CmdExit.Enabled = false;
    
                ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                MsgBuffer = new Byte[65535];
                MsgSend = new Byte[65535];
                CheckForIllegalCrossThreadCalls = false;
    
                Random TRand = new Random();
                this.UserName.Text = "用户" + TRand.Next(10000).ToString();
            }
    
            private void CmdEnter_Click(object sender, EventArgs e)
            {
                ServerInfo = new IPEndPoint(IPAddress.Parse(this.ServerIP.Text), Convert.ToInt32(this.ServerPort.Text));
    
                try
             {
                     ClientSocket.Connect(ServerInfo);
     
                 ClientSocket.Send(Encoding.Unicode.GetBytes("用户: " + this.UserName.Text + " 进入系统!
    "));
     
                 ClientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);
     
                 this.SysMsg.Text += "登录服务器成功!
    ";
                     this.CmdSend.Enabled = true;
                     this.CmdEnter.Enabled = false;
                     this.CmdExit.Enabled = true;
                 }
             catch
             {
                     MessageBox.Show("登录服务器失败,请确认服务器是否正常工作!");
                 }
            }
    
            private void ReceiveCallBack(IAsyncResult AR)
            {
                try
                {
                    int REnd = ClientSocket.EndReceive(AR);
                    this.RecieveMsg.AppendText(Encoding.Unicode.GetString(MsgBuffer, 0, REnd));
                    ClientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);
    
                }
                catch
                {
                    MessageBox.Show("已经与服务器断开连接!");
                    this.Close();
                }
    
            }
    
            private void CmdSend_Click(object sender, EventArgs e)
            {
                MsgSend = Encoding.Unicode.GetBytes(this.UserName.Text + "说:
    " + this.SendMsg.Text + "
    ");
                if (ClientSocket.Connected)
                {
                     ClientSocket.Send(MsgSend);
                     this.SendMsg.Text = "";
                 }
             else
             {
                     MessageBox.Show("当前与服务器断开连接,无法发送信息!");
                 }
            }
    
            private void CmdExit_Click(object sender, EventArgs e)
            {
                if (ClientSocket.Connected)
                {
                    ClientSocket.Send(Encoding.Unicode.GetBytes(this.UserName.Text + "离开了房间!
    "));
                    ClientSocket.Shutdown(SocketShutdown.Both);
                     ClientSocket.Disconnect(false);
                 }
                 ClientSocket.Close();
     
                 this.CmdSend.Enabled = false;
                 this.CmdEnter.Enabled = true;
                 this.CmdExit.Enabled = false;
             }
     
             private void RecieveMsg_TextChanged(object sender, EventArgs e)
             {
                 this.RecieveMsg.ScrollToCaret();
             }
     
             private void SendMsg_KeyDown(object sender, KeyEventArgs e)
             {
                 if (e.Control && e.KeyValue == 13)
                 {
                     e.Handled = true;
                     this.CmdSend_Click(this, null);
                 }
             }
         }
     }
  • 相关阅读:
    List<int>转化为逗号链接的字符串
    分页的总页数算法
    高性能SQLServer分页语句
    webconfig中的&符号问题解决
    检测SQLServer复制订阅进度
    jQuery自定义数组操作类(类似于List集合的增删改查)
    解决jquery绑定click事件出现点击一次执行两次问题
    IdentityServer4登陆中心
    AES加密解密通用版Object-C / C# / JAVA
    T-SQL 基本语法
  • 原文地址:https://www.cnblogs.com/Areas/p/5665841.html
Copyright © 2020-2023  润新知