C#|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(); }/// /// 负责通信的socket/// Socket socketSend; /// /// 负责监听Socket/// Socket socket; /// /// 存放连接的socket/// Dictionary dictionary = new Dictionary(); /// /// 开始监听/// /// /// 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); } /// /// 使用线程来接收数据/// /// private void Listen(object o){Socket socket = o as Socket; while(true){//负责监听的socket是用来接收客户端连接//创建负责通信的socketsocketSend = 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); }}} /// /// 日志打印/// /// 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); Listlist = new List (); 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; } /// /// 发文件,/// /// /// 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); } /// /// 抖一抖/// /// /// 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); } /// /// 关闭前关闭socket/// /// /// 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;
//连接private void connectBtn_Click(object sender, EventArgs e){try{//创建负责通信的socketsocket = 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 { }}
//日志private void ShowLog(string str){textLog.AppendText(str + "\r\n"); } /// /// 发消息/// /// /// private void sendMsgBtn_Click(object sender, EventArgs e){try{string txt = sendMsg.Text; byte[] buffer = Encoding.ASCII.GetBytes(txt); //ascii编码socket.Send(buffer); }catch { }}
//接收消息
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; }//关闭前关掉socketprivate 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#|C# Winform 实现TCP发消息】以上就是C# Winform 实现TCP发消息的详细内容,更多关于c# 实现TCP发消息的资料请关注脚本之家其它相关文章!
推荐阅读
- springboot整合curator实现分布式锁过程
- 小样本利器2.文本对抗+半监督|小样本利器2.文本对抗+半监督 FGSM & VAT & FGM代码实现
- SVM实现人脸识别(超详细易懂)(一)
- 计算机|全新升级的AOP框架Dora.Interception[5]: 实现任意的拦截器注册方式
- vue|前端使用echarts实现数据可视化大屏展示
- angular实现前端导出Excel表格
- torch|pytorch入门(三)线性代数的实现
- 计算机毕业论文和程序设计|基于 SpringBoot 的个人博客系统设计与实现(含论文与程序代码).rar
- Django全栈开发|【Python+Django】一个博客网站的设计和代码实现
- Vue项目之使用EditorConfig|Vue项目之使用EditorConfig, Eslint和Prettier实现代码规范