当前位置: 首页 > 编程日记 > 正文

C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口。

C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口。

最近接触了C#Socket网络编程,试着做了试试(*^__^*)

实现多个客户端和服务端互相发送消息

发送文件
抖动窗口功能  

服务端:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace kehuduan
{public partial class Form1 : Form{public Form1(){InitializeComponent();}Dictionary<string,Socket> dicsocket = new Dictionary<string, Socket>();//键值集合,通过键能找到值private void button1_Click(object sender, EventArgs e){try{//创建监听的socketSocket socketwatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//获得ip地址IPAddress ip = IPAddress.Any;//Parse(textBox1.Text);//创建端口号对象IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(textBox2.Text));socketwatch.Bind(point);showmsg(DateTime.Now.ToString() + "监听成功");//192.168.1.103:监听成功socketwatch.Listen(10);//开始监听。监听队列10人//开启新线程解决卡顿Thread lis = new Thread(Listen);lis.IsBackground = true;lis.Start(socketwatch);}catch{}}Socket socketsend;/// <summary>/// 循环等待接入的客户端/// </summary>/// <param name="o"></param>void Listen(object o){try{Socket socketwatch = o as Socket;while (true){//负责跟客户端通信的Socketsocketsend = socketwatch.Accept();//把连进来的socket存到建值集合和下拉菜单中,实现给指定的客户端发消息
                    dicsocket.Add(socketsend.RemoteEndPoint.ToString(),socketsend);comboBox1.Items.Add(socketsend.RemoteEndPoint.ToString());//socket.remoteendpoint可以显示socket的ip地址和端口号//192.168.1.103:连接成功showmsg(socketsend.RemoteEndPoint.ToString() + ":" + "连接成功");//连接成功后开启新线程接受消息Thread th = new Thread(Recive);th.IsBackground = true;th.Start(socketsend);}}catch { }}/// <summary>/// 服务器端循环接收客户端发来的信息/// </summary>/// <param name="o"></param>void Recive(object o){while (true){try{Socket socketsend = o as Socket;byte[] b = new byte[1024 * 1024 * 2];//实际接收到的有效字节int r = socketsend.Receive(b);if (r == 0){break;}string str = Encoding.UTF8.GetString(b, 0, r);showmsg(socketsend.RemoteEndPoint.ToString() + "说:" + str);}catch {}}}/// <summary>/// 往文本框里添加文字的方法/// </summary>/// <param name="a"></param>void showmsg(string a){textBox3.AppendText(a+"\r\n"); }private void textBox1_TextChanged(object sender, EventArgs e){}private void Form1_Load(object sender, EventArgs e){Control.CheckForIllegalCrossThreadCalls = false;}/// <summary>/// 服务器给客户端发文字消息/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button4_Click(object sender, EventArgs e){try{List<byte> nb = new List<byte>();string str = textBox4.Text.Trim();byte[] b = System.Text.Encoding.UTF8.GetBytes(str);nb.Add(0);nb.AddRange(b);byte[] newb = nb.ToArray();string ip = comboBox1.SelectedItem.ToString();dicsocket[ip].Send(newb);//socketsend.Send(b);showmsg("我说 :" + str);}catch { }}/// <summary>/// 选择要发送的文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button2_Click(object sender, EventArgs e){OpenFileDialog ofd  = new OpenFileDialog();ofd.InitialDirectory = @"C:\Documents and Settings\Administrator\桌面";ofd.Title = "请选择要发送的文件";ofd.Filter = "所有文件|*.*";ofd.ShowDialog(this);//加thistextBox5.Text = ofd.FileName;}/// <summary>/// 向客户端发送文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button3_Click(object sender, EventArgs e){try{string path = textBox5.Text;using (FileStream fsread = new FileStream(path, FileMode.Open, FileAccess.Read)) //把文件转换为文件流
                {byte[] b = new byte[1024 * 1024 * 5];//最大5m的文件int r = fsread.Read(b, 0, b.Length);List<byte> nb = new List<byte>();nb.Add(1);//在第一位加上数字,让客户端可以识别服务端的指令nb.AddRange(b);//往集合中添加集合的方法。byte[] newb = nb.ToArray();dicsocket[comboBox1.SelectedItem.ToString()].Send(newb, 0, r + 1, SocketFlags.None);}}catch { }}/// <summary>/// 抖动窗口/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button5_Click(object sender, EventArgs e)//发送消息{try{byte[] b = new byte[1];b[0] = 2;dicsocket[comboBox1.SelectedItem.ToString()].Send(b);}catch { }}}
}

客户端:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace kehuduan
{public partial class Form1 : Form{public Form1(){InitializeComponent();}Socket socketsend;private void button1_Click(object sender, EventArgs e){try{socketsend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//设置一个socketIPAddress ip = IPAddress.Parse(textBox1.Text);//将文本框中的字符串转换成IP地址。IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(textBox2.Text));//创建IPEndpoint对象实例。包含ip地址和端口号socketsend.Connect(point);//连接到IPendpoint所在的监听socketshowmsg("连接成功");
//开启新线程Thread th = new Thread(Recive);th.IsBackground = true;th.Start();}catch { }}void showmsg(string str)  //在文本框中添加内容{textBox3.AppendText(str+"\r\n");}private void Form1_Load(object sender, EventArgs e){Control.CheckForIllegalCrossThreadCalls = false;//取消跨线程使用控件检查。}void Recive()//接收{while (true){try{byte[] b = new byte[1024 * 1024 * 2];//实际接收到的有效字节int r = socketsend.Receive(b);if (r == 0){break;}if (b[0] == 0){string str = Encoding.UTF8.GetString(b, 1, r-1);  //从第二个开始截取,因为第一个元素用来判断服务端发过来的指令。showmsg(socketsend.RemoteEndPoint.ToString() + "说:" + str);}else if (b[0] == 1){SaveFileDialog sfd = new SaveFileDialog();//保存文件对话框sfd.InitialDirectory = @"C:\Documents and Settings\Administrator\桌面";sfd.Title = "对方发送了一个文件,请选择保存的位置";sfd.ShowDialog();string path = sfd.FileName;using (FileStream fswrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite))//数据流控制,用来保存文件。
                        {fswrite.Write(b,1,r-1);MessageBox.Show("保存成功");}}else if (b[0] == 2)//如果发来的字节包首个元素的值==2,就振动{ZD();}}catch{}}}private void button2_Click(object sender, EventArgs e)//发送消息{try{string str = textBox4.Text.Trim();//存下文本框中的内容byte[] b = System.Text.Encoding.UTF8.GetBytes(str);//将内容转换成二进制流(utf8编码)socketsend.Send(b);//发送给服务端showmsg("我说 :" + str);//将我说的话放到文本框中}catch { }}/// <summary>/// 震动窗体/// </summary>void ZD()//连续修改窗口的Location,模拟抖动窗口效果{for (int i = 0; i < 50; i++){Point a = this.Location;a.X += 5;a.Y += 5;this.Location = a;Thread.Sleep(2);a.X -=5;a.Y -=5;this.Location = a;}}}
}

知识点

//跨线程使用控件应在窗口加载时取消检查。

//跨线程方法传值只能传Object类型的值,可以在方法中强制转换成需要的类型,如 socketwatch = Object AS socket(将AS前的对象转换成后边的对象,如果成功返回转换成功后的对象,否则返回null)

//键值集合

  Dictionary<键,值> 集合名 = new Dictionary<键, 值>();
集合名.add(键,值)//往集合里添加
使用 集合名[键] 可以访问键对应的值。


posted on 2015-07-28 18:00 欧欧吉 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/oogcn/p/4683674.html

相关文章:

移动端大图缩放模糊_关于移动端小图标模糊问题的解决方法

前言之前给大家讲到图片和文字垂直方向不对齐的问题&#xff0c;其中举的小例子中用到了一个小图标&#xff0c;这个小图标我用的是背景图来显示&#xff1a;.del .icon{ display: inline-block; width: 20px; height: 25px; margin-right: 5px;vertical-align: middle; backgr…

T-SQL WITH 分号问题

使用with 前面有sql语句时候 运行 with tempTbale(id) as ( select ..... )select * from tempTbale 运行上面语句 提示下面错误 Incorrect syntax near the keyword with. If this statement is a common table expression, an xmlnamespaces clause or a change tracking con…

SVN 撤回(回滚)提交的代码

转&#xff1a; SVN 撤回&#xff08;回滚&#xff09;提交的代码 2016年12月20日 17:20:58 怀色 阅读数 68614 标签&#xff1a; svn svn回滚 版本回滚 更多 个人分类&#xff1a; svn 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://…

LTE-怎么获取上行资源

LTE中&#xff0c;UE如果要发送上行数据(Control sig or Data)&#xff0c;需要上行pusch资源&#xff0c;如果没有被分配pusch的话&#xff0c;则需要申请。 有3种方法进行申请&#xff1a; 这3中方法对应不同的场景&#xff0c;详细逻辑如下&#xff1a;

mysql中sql语句

<数据定义语言DDL> 一. create TABLE tableName 创建表 二. alter TABLE tableName 修改表 三. drop TBALE tableName 删除表 <数据控制语言DCL> GRANT/REVOKE <数据操纵语言DML> 一. insert INTO tableName(,,,) values(,,,); 插入数据(增) 二. update tabl…

wxpython有没有可视化设计_wxPython - GUI Builder工具( GUI Builder Tools)

wxPython - GUI Builder工具( GUI Builder Tools)通过手动编码创建美观的GUI可能很乏味。 可视化GUI设计器工具总是很方便。 许多针对wxPython的GUI开发IDE都可用。 以下是其中一些 -wxFormBuilderwxDesignerwxGladeBoaConstructorgui2pywxFormBuilder是一个开源的&#xff0c;…

微信网页JSDK接口-wx.chooseImage问题

wx.chooseImage({count: 1, // 默认9sizeType: [original, compressed], // 可以指定是原图还是压缩图&#xff0c;默认二者都有sourceType: [album, camera], // 可以指定来源是相册还是相机&#xff0c;默认二者都有success: function (res) {var localIds res.localIds; //…

ARM 的几个重要特点

ARM 采用RISC指令集 ARM: Acorn RISC Machine; //Acorn: 公司的名字 它支持的指令比较简单&#xff0c;所以功耗小、价格便宜&#xff0c;特别合适移动设备。 RISC 和CISC的区别&#xff1a; 举例子&#xff0c;乘加运算&#xff0c;比如&#xff1a; ya*b c; 在CISC里面…

html文字中横线_谈PPT课件中自定义动画应用之内容控制

本案例来源于一位资深政治教师的课件应用经验。在她的朋友圈看到&#xff1a;讲解高考政治主观题课件要这样做才好&#xff0c;材料全部显示完后&#xff0c;再把一些关键字词句用彩色字标注或横线或圆圈标注&#xff0c;然后再分析归纳&#xff0c;哪些字词句是设问范围内应该…

PowerShell过滤文件中的重复内容

Get-Content -Path E:\test11\data.txt | Sort-Object | Get-Unique 源文件&#xff1a; AA0001 2014-06-30 15:27:13.073 AA0001 2014-06-30 15:27:13.073 AA0001 2014-06-30 15:27:13.073 AA0002 2014-06-30 15:27:30.607 AA0002 2014-06-30 15:28:00.467 AA0003 2014-06-30 …

pstree进程管理

功能&#xff1a;pstree命令列出当前的进程&#xff0c;以及它们的树状结构。 格式&#xff1a;pstree [选项] [pid|user] 主要选项如下&#xff1a; -a&#xff1a;显示执行程序的命令与完整参数。 -c&#xff1a;取消同名程序&#xff0c;合并显示。 -h&#xff1a;对输出结果…

LTE MIB 的发送周期

MIB在PBCH上发送&#xff0c;PBCH 采用QPSK调制。 PBCH的时频资源位置固定&#xff0c;可以参考我的博文” LTE FDD PSS/SSS/MIB时频资源位置”. 一个SFN发送一次MIB&#xff0c;接下来3个SFN重复发送同样的信息(但是以不同的扰码加扰)&#xff0c;也就是说MIB的发送周期为4…

吸顶wifi_分享 | 酒店WiFi网络的三种部署模式

酒店的无线网络&#xff0c;在酒店部署移动网络业务的时候&#xff0c;很多酒店会发现实际效果远达不到预期。酒店员工和入住用户经常会抱怨无线网络不稳定、视频无限缓冲中、经常掉线……&#xff0c;那么今天我们来了解酒店无线网络的部署。一、影响WiFI漫游的因素导致出现以…

最后一片蓝海的终极狂欢-写在Win10发布前夕

作为一名Windows8.x系统平台从业者&#xff0c;从工作伊始&#xff0c;耳边不断充斥着Windows将走向没落的言论&#xff0c;Win10今日晚些时候即将发布&#xff0c;笔者借此机会&#xff0c;说说自己的看法。 早在2012年的时候&#xff0c;IDC曾预测&#xff0c;WP系统将在2016…

错误信息输出,重定向到文件

将错误重定向到文件remove-item none 2> d:\ee.txt 将错误追加到已有文件remove-item none 2>> d:\ee.txt 将错误发送到成功输出流。如果报错后&#xff0c;代码依然继续执行&#xff0c;则Exception不会被捕获到$myerror Remove-Item "NoSuchDirectory" 2…

spark-submit --files 动态加载外部资源文件

在做spark时&#xff0c;有些时候需要加载资源文件&#xff0c;需要在driver或者worker端访问。在client模式下可以使用IO流直接读取,但是在cluster模式下却不能直接读取&#xff0c;需要如下代码&#xff1a; val is: InputStream this.getClass.getResourceAsStream(“./xxx…

LTE SIB1时频资源

1.时域资源 参考3GPP 36.331 – 5.2.1.2Scheduling The SystemInformationBlockType1 uses a fixed schedule with a periodicity of 80 msand repetitions made within80 ms. Thefirst transmission of SystemInformationBlockType1 is scheduled insubframe #5 of radio fram…

ssm框架mysql配置_ssm框架使用详解配置两个数据源

学习ssm框架已经快一年了&#xff0c;今天把这个框架总结一下。SSM 就是指 spring、SpringMVC和Mybatis。先说一下基本概念(百度上搜的)1、基本概念1.1、SpringSpring是一个开源框架&#xff0c;Spring是于2003 年兴起的一个轻量级的Java 开发框架&#xff0c;由Rod Johnson 在…

Linux下JDK环境的配置

whereis javawhich java &#xff08;java执行路径&#xff09;echo $JAVA_HOME rpm -ivh jdk-7u79-linux-x64.rpm 配置profile 转载于:https://www.cnblogs.com/xubc/p/4686748.html

org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar

通过Spring的jdbcTemplate调用Mysql的存储过程&#xff0c;出现下面的问题&#xff08;以前也使用过&#xff0c;并没有出现下面的问题&#xff0c;折腾大半天&#xff0c;郁闷&#xff09;&#xff1a;开始报下面的错误&#xff1a;[INFO ]2014-07-01 10:49:15,297 MESSAGE : …

Aras学习笔记(1)学习Aras已半年有余,也积攒一些学习笔记,今天起会陆续分享出来,有兴趣的朋友一起交流...

Aras Innovator PLM简介 美国Aras公司的产品生命周期&#xff08;PLM&#xff09;软件。Aras Innovator是微软在PLM领域唯一的一家金牌合作伙伴。是全球首款达到CMII 4星级的开放许可的企业级PLM(OPEN PLM)产品。通过软件许可&#xff08;节点&#xff09;免费&#xff0c;服务…

LTE CRS 时频资源

1. 参考 Spec 3GPP-36.211-6.10 Cell-specificReference Signal (CRS) Cell-specificreference signals are transmitted on one or several of antenna ports 0 to 3. Cell-specific reference signals are defined for Δf 15 kHzonly 2. 时频位置公式 在36.211-6.10.1.…

wcf客户端捕获异常

直接使用Exception进行捕获&#xff0c;然后在监视器中查看具体是哪一个异常 System.Exception {System.ServiceModel.Security.MessageSecurityException} 查看StackTrace Server stack trace: 在 System.ServiceModel.Channels.SecurityChannelFactory1.SecurityRequestChan…

java监听mysql_java实时监控mysql数据库变化

对于二次开发来说&#xff0c;很大一部分就找找文件和找数据库的变化情况对于数据库变化。还没有发现比较好用的监控数据库变化监控软件。今天&#xff0c;我就给大家介绍一个如何使用mysql自带的功能监控数据库变化1、打开数据库配置文件my.ini (一般在数据库安装目录)(D:MYSQ…

SAS、R以及SPSS的比较__统计语言大战

转载于:https://www.cnblogs.com/bicoffee/p/3818626.html

第九章实验报告

C程序设计实验报告 实验项目&#xff1a;构造数据类型实验 姓名&#xff1a;罗子健 实验地点&#xff1a;物联网实验室 实验时间&#xff1a;2019年6月26日 一、实验目的与要求 &#xff08;1&#xff09;掌握结构体类型说明和结构体类型变量、数组、指针的定义方法及使用。 …

LTE Paging时频资源

介绍PAGING的文章有很多&#xff0c;本文主要介绍Paging的时频资源。 为了达到省电的目的&#xff0c;UE在idle下使用DRX。UE在什么时刻(SFN/subframe)wakeup起来接受Paging 呢? 先介绍2个概念&#xff0c;如下&#xff1a; PO: Paging Occasion, 它是一个子帧&#xff0c;这…

mysql处理上百万条的数据库如何优化语句来提高处理查询效率

1.对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中对字段进行 null 值判断&#xff0c;否则将导致引擎放弃使用索引而进行全表扫描&#xff0c;如&#xff1a;select id from t whe…

smarty mysql_Smarty处理mysql查询数组

Smarty处理mysql查询数组MySQL的查询结果一般是一个数组&#xff0c;而不是所有结果集。因此我们需要将结果全部存到数组中进行处理&#xff0c;然后就可以很轻松的再Smarty中使用了。PHP Mysql 代码$sql"select article_id,article_title from tbl_article order by arti…

Linux文件压缩与解压缩

什么是压缩文件&#xff1f;原理是什么?简单的说&#xff0c;就是经过压缩软件压缩文件叫压缩文件&#xff0c;压缩的原理是把文件的二进制代码压缩&#xff0c;把相邻的0,1代码减少&#xff0c;例如有000000&#xff0c;可以把它变成6个0的写法60来减少该文件的空间&#xff…