好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C# Winform 实现TCP发消息

服务端:

窗体

代码:

using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms;   namespace SocketStudy {     public partial class Form1 : Form     {         public Form1()         {             InitializeComponent();         }         /// <summary>         /// 负责通信的socket         /// </summary>         Socket socketSend;           /// <summary>         /// 负责监听Socket         /// </summary>         Socket socket;           /// <summary>         /// 存放连接的socket         /// </summary>         Dictionary<string, Socket> dictionary = new Dictionary<string, Socket>();           /// <summary>         /// 开始监听         /// </summary>         /// <param name="sender"></param>         /// <param name="e"></param>         private void button1_Click(object sender, EventArgs e)         {             //创建监听的socket,             //SocketType.Stream 流式对应tcp协议             //Dgram,数据报对应UDP协议             socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);             //创建IP地址和端口号             IPAddress ip = IPAddress.Any;//IPAddress.Parse(textServerIP.Text);             int port = Convert.ToInt32(textServerPort.Text);             IPEndPoint iPEndPoint = new IPEndPoint(ip, port);               //让负责监听的Socket绑定ip和端口号             socket.Bind(iPEndPoint);               ShowLog("监听成功!" + ip + "\t" + port);//打印日志               //设置监听队列             socket.Listen(10);//一段时间内可以连接到的服务器的最大数量             Thread thread = new Thread(Listen);             thread.IsBackground = true;             thread.Start(socket);         }           /// <summary>         /// 使用线程来接收数据         /// </summary>         /// <param name="o"></param>         private void Listen(object o)         {             Socket socket = o as Socket;             while(true){                 //负责监听的socket是用来接收客户端连接                 //创建负责通信的socket                 socketSend = socket.Accept();                 dictionary.Add(socketSend.RemoteEndPoint.ToString(), socketSend);                 clientCombo.Items.Add(socketSend.RemoteEndPoint.ToString());                   ShowLog(socketSend.RemoteEndPoint.ToString() + "已连接");                   //开启新线程,接收客户端发来的信息                 Thread th = new Thread(receive);                 th.IsBackground = true;                 th.Start(socketSend);             }         }           //服务器接收客户端传来的消息         private void receive(object o)         {             Socket socketSend = o as Socket;             while (true)             {                 try                 {                     //客户端连接成功后,服务器接收客户端发来的消息                     byte[] buffer = new byte[1024 * 1024 * 2];//2M大小                                                               //接收到的有效字节数                     int length = socketSend.Receive(buffer);                     if (length == 0)                     {                         ShowLog(socketSend.RemoteEndPoint.ToString() + "下线了。");                         dictionary[socketSend.RemoteEndPoint.ToString()].Shutdown(SocketShutdown.Both);                         dictionary[socketSend.RemoteEndPoint.ToString()].Disconnect(false);                         dictionary[socketSend.RemoteEndPoint.ToString()].Close();                         break;                     }                     string str = Encoding.ASCII.GetString(buffer, 0, length);                     ShowLog(socketSend.RemoteEndPoint.ToString() + "\n\t" + str);                 }                 catch (Exception ex)                 {                     Console.WriteLine(ex.Message);                 }             }         }           /// <summary>         /// 日志打印         /// </summary>         /// <param name="str"></param>         private void ShowLog(string str)         {             textLog.AppendText(str + "\r\n");         }           private void Form1_Load(object sender, EventArgs e)         {             //取消对跨线程调用而产生的错误             Control.CheckForIllegalCrossThreadCalls = false;         }           private void sendMsgBtn_Click(object sender, EventArgs e)         {             string txt = textMsg.Text;             byte[] buffer = Encoding.UTF8.GetBytes(txt);             List<byte> list = new List<byte>();             list.Add(0); // 0 为 发消息             list.AddRange(buffer);             byte[] newBuffer = list.ToArray();             //socketSend.Send(buffer);             string ip = clientCombo.SelectedItem.ToString();//获取选中的ip地址             Socket socketsend=dictionary[ip];             socketsend.Send(newBuffer);         }           private void selectBtn_Click(object sender, EventArgs e)         {             OpenFileDialog fileDialog = new OpenFileDialog();             fileDialog.InitialDirectory=@"D:";             fileDialog.Title="选择文件";             fileDialog.Filter = "所有文件|*.*";             fileDialog.ShowDialog();               pathTxt.Text = fileDialog.FileName;           }           /// <summary>         /// 发文件,         /// </summary>         /// <param name="sender"></param>         /// <param name="e"></param>         private void sendFileBtn_Click(object sender, EventArgs e)         {             string path = pathTxt.Text;             FileStream fileStream = new FileStream(path,FileMode.Open,FileAccess.Read);               byte[] buffer = new byte[1024*1024*3];             buffer[0] = 1;// 1 为发文件的标志位             int length = fileStream.Read(buffer, 1, buffer.Length-1);             fileStream.Close();             string ip = clientCombo.SelectedItem.ToString();//获取选中的ip地址             Socket socketsend = dictionary[ip];             socketsend.Send(buffer,0, length+1, SocketFlags.None);         }           /// <summary>         /// 抖一抖         /// </summary>         /// <param name="sender"></param>         /// <param name="e"></param>         private void shockBtn_Click(object sender, EventArgs e)         {             byte[] buffer = new byte[1];             buffer[0] = 2;// 2 为抖一抖             string ip = clientCombo.SelectedItem.ToString();//获取选中的ip地址             Socket socketsend = dictionary[ip];             socketsend.Send(buffer);         }           /// <summary>         /// 关闭前关闭socket         /// </summary>         /// <param name="sender"></param>         /// <param name="e"></param>         private void Form1_FormClosing(object sender, FormClosingEventArgs e)         {             try             {                 socket.Shutdown(SocketShutdown.Both);                 socket.Disconnect(false);                 socket.Close();             }             catch             {                 socket.Close();             }         }     } }

客户端: 窗体

代码

using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms; namespace Client {     public partial class Form1 : Form     {         public Form1()         {             InitializeComponent();         }         Socket socket;<br>      //连接         private void connectBtn_Click(object sender, EventArgs e)         {             try             {                 //创建负责通信的socket                 socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                 //地址、端口                 IPAddress ip = IPAddress.Parse(ipText.Text);                 int serverPort = Convert.ToInt32(portText.Text);                 IPEndPoint port = new IPEndPoint(ip, serverPort);                 //连接到服务器                 socket.Connect(port);                 ShowLog("已连接");                   //启动接收数据线程                 Thread th = new Thread(receive);                 th.IsBackground = true;                 th.Start();             }             catch { }         }<br>    //日志         private void ShowLog(string str)         {             textLog.AppendText(str + "\r\n");         }           /// <summary>         /// 发消息         /// </summary>         /// <param name="sender"></param>         /// <param name="e"></param>         private void sendMsgBtn_Click(object sender, EventArgs e)         {             try             {                 string txt = sendMsg.Text;                 byte[] buffer = Encoding.ASCII.GetBytes(txt);//ascii编码                 socket.Send(buffer);             }             catch { }         }     <br>    //接收消息<br>         private void receive()         {             while (true)             {                 try                 {                     byte[] buffer = new byte[1024 * 1024 * 2];                     int length = socket.Receive(buffer);                     if (length == 0)                     {                         break;                     }                     if (buffer[0] == 0)                     {                         string txt = Encoding.UTF8.GetString(buffer, 1, length-1);                         ShowLog(socket.RemoteEndPoint + ":\r\t" + txt);                     }else if (buffer[0] == 1)                     {                         SaveFileDialog saveFileDialog = new SaveFileDialog();                         saveFileDialog.InitialDirectory = @"E:\";                         saveFileDialog.Title = "饿了吃什么";                         saveFileDialog.Filter = "所有文件 | *.*";                         saveFileDialog.ShowDialog(this);                           string path = saveFileDialog.FileName;                         FileStream fileStreamWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);                         fileStreamWrite.Write(buffer,1,length-1);                         fileStreamWrite.Close();                         MessageBox.Show("保存成功");                     }else if (buffer[0] == 2)                     {                         ZD();                     }                 }                 catch { }             }         }       //震动         private void ZD()         {             for(int i=0;i<20;i++){                 if (i%2==0)                 {                     this.Location = new System.Drawing.Point(500, 500);                 }                 else                 {                     this.Location = new System.Drawing.Point(530, 530);                 }                 Thread.Sleep(20);             }         }     //取消跨线程检查         private void Form1_Load(object sender, EventArgs e)         {             Control.CheckForIllegalCrossThreadCalls = false;         }     //关闭前关掉socket         private void Form1_FormClosing(object sender, FormClosingEventArgs e)         {             socket.Disconnect(false);             socket.Close();         }       //断开连接         private void button1_Click(object sender, EventArgs e)         {             if (socket !=null)             {                 socket.Disconnect(false);             }         }     } }

运行结果:

以上就是C# Winform 实现TCP发消息的详细内容,更多关于c# 实现TCP发消息的资料请关注其它相关文章!

查看更多关于C# Winform 实现TCP发消息的详细内容...

  阅读:42次