最近接触了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
{
//创建监听的socket
Socket 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人 //开启新线程解决卡顿
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)
{
//负责跟客户端通信的Socket
socketsend = 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[ * * ];
//实际接收到的有效字节
int r = socketsend.Receive(b);
if (r == )
{
break;
}
string str = Encoding.UTF8.GetString(b, , 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();
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);//加this
textBox5.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[ * * ];//最大5m的文件
int r = fsread.Read(b, , b.Length);
List<byte> nb = new List<byte>();
nb.Add();//在第一位加上数字,让客户端可以识别服务端的指令
nb.AddRange(b);//往集合中添加集合的方法。
byte[] newb = nb.ToArray();
dicsocket[comboBox1.SelectedItem.ToString()].Send(newb, , r + , 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[];
b[] = ;
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);//设置一个socket IPAddress ip = IPAddress.Parse(textBox1.Text);//将文本框中的字符串转换成IP地址。
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(textBox2.Text));//创建IPEndpoint对象实例。包含ip地址和端口号
socketsend.Connect(point);//连接到IPendpoint所在的监听socket
showmsg("连接成功");
//开启新线程
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[ * * ];
//实际接收到的有效字节
int r = socketsend.Receive(b);
if (r == )
{
break;
}
if (b[] == )
{
string str = Encoding.UTF8.GetString(b, , r-); //从第二个开始截取,因为第一个元素用来判断服务端发过来的指令。
showmsg(socketsend.RemoteEndPoint.ToString() + "说:" + str);
}
else if (b[] == )
{
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,,r-);
MessageBox.Show("保存成功");
} }
else if (b[] == )//如果发来的字节包首个元素的值==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 = ; i < ; i++)
{ Point a = this.Location;
a.X += ;
a.Y += ;
this.Location = a;
Thread.Sleep();
a.X -=;
a.Y -=;
this.Location = a;
}
}
}
}

知识点

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

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

//键值集合

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

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

  1. 【LINUX/UNIX网络编程】之简单多线程服务器(多人群聊系统)

    RT,Linux下使用c实现的多线程服务器.这个真是简单的不能再简单的了,有写的不好的地方,还希望大神轻拍.(>﹏<) 本学期Linux.unix网络编程的第四个作业. 先上实验要求: [ ...

  2. Android 网络编程基础之简单聊天程序

    前一篇讲了Android的网络编程基础,今天写了一个简单的聊天程序分享一下 首先是服务端代码: package com.jiao.socketdemo; import java.io.Buffered ...

  3. C# 网络编程之网页简单下载实现

    这是根据<C#网络编程实例教程>中学到的知识实现的一个C#网页简单下载器,其中涉及到的知识主要是HTTP协议编程中相关类:HttpWebRequest类.HttpWebResponse类. ...

  4. C# 网络编程之最简单浏览器实现

    最近学习C#网络编程的HTTP协议编程,HTTP即Hypertext Transfer Protocol的缩写,意为:超文本传输协议. 其中与HTTP相关的知识主要有六个类的知识,分别是 (1).Ht ...

  5. Linux网络编程:一个简单的正向代理服务器的实现

    Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到, Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该 ...

  6. Python进阶(1)_Socket网络编程(基于tcp的socket)

    网络协议参考:http://www.cnblogs.com/hedeyong/p/6889774.html 一.TCP/IP五层模型 学习socket一定要先学习互联网协议: 1.首先:本节课程的目标 ...

  7. java网络编程——socket实现简单的CS会话

    还记得当年学计网课时用python实现一个简单的CS会话功能,这也是学习socket网络编程的第一步,现改用java重新实现,以此记录. 客户端 import java.io.*; import ja ...

  8. java oop第15章_Socket网络编程

    一.   TCP/IP协议(Transmission Control Protocol/Internet Protocol)传输控制协议/Internet协议,是通信领域的基础.核心协议, 其他的协议 ...

  9. 网络编程TCP/IP实现客户端与客户端聊天

    一.TCP/IP协议 既然是网络编程,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. TCP/I ...

随机推荐

  1. Class类相关

    Class类是java.lang包中的类,该类的实例可以帮助程序创建其他类的实例或者取得其他类的对象的内部信息 使用class类获得一个类相关的class类(注意得到的是class类,不是相关的类) ...

  2. void *memmove( void* dest, const void* src, size_t count );数据拷贝,不需要CPU帮助

    分享到 腾讯微博 QQ空间 新浪微博 人人网 朋友网 memmove 编辑词条 编辑词条 -->   memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,m ...

  3. rtmpdump代码分析 转

    RTMPdump 源代码分析 1: main()函数 rtmpdump 是一个用来处理 RTMP 流媒体的工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, ...

  4. Spring4.0学习笔记(5) —— 管理bean的生命周期

    Spring IOC 容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务 Spring IOC 容器对Bean的生命周期进行管理的过程: 1.通过构造器或工厂方法 ...

  5. 关于@font-face的一些问题

    @font-face 能够加载服务器端的字体文件,让客户端显示客户端所没有安装的字体.[微软的IE 5已经是开始支持这个属性,但是只支持微软自有的.eot (Embedded Open Type) 格 ...

  6. php中JPGraph入门配置与应用

    什么是PHP JPGraph? 专门提供图表的类库.它使得作图变成了一件非常简单的事情.生成非美工人士生成的图表.二维码算法. 到官方网站下载. docportal 帮助手册 src 包含主要代码. ...

  7. smarty 中时间格式化的用法

    大家都知道PHP中输出时间和日期可以用 date("Y-m-d H:i:s",时间戳)  , 但是在smarty模板中,$time|date_format:'%Y-%m-%d %H ...

  8. Python3 如何优雅地使用正则表达式(详解四)

    更多强大的功能 到目前为止,我们只是介绍了正则表达式的一部分功能.在这一篇中,我们会学习到一些新的元字符,然后再教大家如何使用组来获得被匹配的部分文本. 更多元字符 还有一些元字符我们没有讲到,接下来 ...

  9. 深度围观block:第三集

    深度围观block:第三集 发布于:2013-07-12 10:09阅读数:7804 本文是深度围观block的第三篇文章,也是最后一篇.希望读者阅读了之后,对block有更加深入的理解,同时也希望之 ...

  10. eclipse:运行 Android 项目时出现 “Unable to execute dex: Multiple dex files define” 解决方法

    android 项目在eclipse 出现Unable to execute dex: Multiple dex files define Conversion to Dalvik format fa ...