C# Winform TCP发消息
服务端:
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 | 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;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | <em id= "__mceDel" > 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 ); } } } } </em> |
结果:
注:
这部分是本人根据bilibili中一个up学的,代码和他的几乎不差,现在找不到up了,侵删
__EOF__

本文作者:echo_lovely
本文链接:https://www.cnblogs.com/echo-lovely/p/14068311.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/echo-lovely/p/14068311.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器