c#Socket通信基本使用
基本流程

Server

private void btnStart_Click(object sender, EventArgs e)
{
try
{
//当点击开始监听时在服务器端创建一个负责监视IP地址和端口号的socket
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;
//创建端口号对象
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
//监听
socketWatch.Bind(point);
ShowMsg("监听成功");
socketWatch.Listen();
Thread th = new Thread(Listen);
th.IsBackground = true;
th.Start(socketWatch);
}
catch
{ }
} void ShowMsg(string str)
{
txtLog.AppendText(str + "\r\n");
} Socket socketSend; void Listen(object o)
{
Socket socketWatch = o as Socket;
//等待客户端连接且创建一个负责通讯的socket
while (true)
{
try
{
//负责跟客户端通讯的socket 怎么存它?--下拉框
socketSend = socketWatch.Accept();
//将远程连接的客户端的(ip地址+端口号)和socket存入集合
disSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
//将远程连接的客户端的(ip地址+端口号)和socket存入下拉框中
cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString());
//例192.168.1.1:连接成功
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");
//开启一个新线程不停的接收客户端法发来的消息
Thread th = new Thread(Receive);
th.IsBackground = true;
th.Start(socketSend);
}
catch
{ }
}
} //将远程连接的客户端的(ip地址+端口号)和socket存入集合
Dictionary<string, Socket> disSocket = new Dictionary<string, Socket>(); void Receive(object o)//服务器不停的接收客户端发来的消息
{
Socket socketSend = o as Socket;
while (true)
{
try
{
//客户端连接成功后 服务器接收客户端发送的消息
byte[] buffer = new byte[ * * ];
//实际接收到的有效字节数
int r = socketSend.Receive(buffer);
if (r == )
{
break;
}
string str = Encoding.UTF8.GetString(buffer, , r);
ShowMsg(socketSend.RemoteEndPoint + ":" + str);
}
catch
{ }
}
} private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
} //服务器给客户端发送消息
private void btnSend_Click(object sender, EventArgs e)
{
try
{
string str = txtMsg.Text;
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
List<byte> list = new List<byte>();
list.Add();
list.AddRange(buffer);
//将泛型集合转换为数组
byte[] newBuffer = list.ToArray();
//socketSend.Send(buffer);
//获得用户在下拉框中选中的IP地址
string ip = cboUsers.SelectedItem.ToString();
disSocket[ip].Send(newBuffer);
}
catch
{ }
} //选择要发送的文件
private void btnSelect_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.InitialDirectory = @"C:\Users\xu.huang\Desktop";
ofd.Title = "请选择要发送的文件";
ofd.Filter = "所有文件|*.*";
ofd.ShowDialog();
txtPath.Text = ofd.FileName;
} private void btnSendFile_Click(object sender, EventArgs e)
{
//获得要发送的文件的路径
string path = txtPath.Text;
using (FileStream fsRead = new FileStream(path, FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[ * * ];
int r = fsRead.Read(buffer, , buffer.Length);
List<byte> list = new List<byte>();
list.Add();
list.AddRange(buffer);
byte[] newBuffer = list.ToArray();
disSocket[cboUsers.SelectedItem.ToString()].Send(newBuffer, , r + , SocketFlags.None);
}
} private void btnZd_Click(object sender, EventArgs e)
{
try
{
byte[] buffer = new byte[];
buffer[] = ;
disSocket[cboUsers.SelectedItem.ToString()].Send(buffer);
}
catch
{ }
}
Client

Socket socketSend;
private void btnStart_Click(object sender, EventArgs e)
{
try
{
//创建负责通信的Socket
socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//拿到本机ip地址及端口号
IPAddress ip = IPAddress.Parse(txtServer.Text);
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
//获得要连接的服务器的ip地址及端口号
socketSend.Connect(point);
ShowMsg("连接成功");
//开启一个新线程不停的接收服务器发来的消息
Thread th = new Thread(Receive);
th.IsBackground = true;
th.Start();
}
catch
{
}
}
void ShowMsg(string str)
{
txtLog.AppendText(str + "\r\n");
}
//不停的接收服务器发来的消息
void Receive()
{
while (true)
{
try
{
byte[] buffer = new byte[ * * ];
//实际接收到的字节数
int r = socketSend.Receive(buffer);//--拿出来的哦~
if (r == )//--拿出来的哦~
{
break;
}
if (buffer[] == )
{
string s = Encoding.UTF8.GetString(buffer, , r - );
ShowMsg(socketSend.RemoteEndPoint + ":" + s);
}
else if (buffer[] == )
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.InitialDirectory = @"C:\Users\xu.huang\Desktop";
sfd.Title = "请选择要保存的文件";
sfd.Filter = "所有文件|*.*";
sfd.ShowDialog(this);
string path = sfd.FileName;
using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
{
fsWrite.Write(buffer, , r - );
}
MessageBox.Show("保存成功");
}
else if (buffer[] == )
{
Zd();
}
}
catch
{
}
}
}
//客户端给服务器发送消息
private void btnSend_Click(object sender, EventArgs e)
{
string str = txtMsg.Text;
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
socketSend.Send(buffer);
}
//取消跨线程检查
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
//震动
void Zd()
{
for (int i = ; i < ; i++)
{
this.Location = new Point(, );
this.Location = new Point(, );
}
}
c#Socket通信基本使用的更多相关文章
- 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?
这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...
- php简单实现socket通信
socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...
- Socket通信类
package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- socket通信
socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...
- Android之Socket通信、List加载更多、Spinner下拉列表
Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...
- .NET开源高性能Socket通信中间件Helios介绍及演示
一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
随机推荐
- 使用Intellij编写Spring Hello World
编写基于Intellij2016.3与Java SDK1.8 下载Spring最新jar包: http://repo.spring.io/release/org/springframework/spr ...
- VC运行时库/MD、/MDd、/MT、/MTd说明
http://blog.csdn.net/holybin/article/details/26134153 VC运行时库设置:VC项目属性->配置属性->C/C++->代码生成-&g ...
- VS下解决_CRT_SECURE_NO_WARNINGS 警告
1.带有警告的文件加 #define _CRT_SECURE_NO_WARNINGS 2.右击工程 - 属性 - 配置属性 - C/C++ - 命令行 命令行增加 /D _CRT_SECURE_NO ...
- DOCKER 学习笔记9 Kubernetes (K8s) 生产级容器编排 上
前言 在上一节的学习中.我们已经可以通过最基本的 Docker Swarm 创建集群,然后在集群里面加入我们需要运行的任务 以及任务的数量 这样我们就创建了一个服务. 当然,这样的方式在我们本地虚拟机 ...
- thinkphp远程执行漏洞的本地复现
thinkphp远程执行漏洞的本地复现 0X00漏洞简介 由于ThinkPHP5 框架控制器名 没有进行足够的安全监测,导致在没有开启强制路由的情况下,可以伪装特定的请求可以直接Getshell(可以 ...
- CVE-2019-0199:Apache Tomcat DDOS
CVE-2019-0199:Apache Tomcat DDOS 0X00漏洞概述 Apache Tomcat HTTP/2拒绝服务漏洞,该漏洞是由于应用服务允许接收大量的配置流量,并且客户端在没有读 ...
- 【OpenGL】OpenGL4.3常用指令目录
参考OpenGL编程指南 第8版 VAO void glGenVertexArrays(GLsizei n, GLuint *arrays); 返回n个未使用的对象名到数组arrays中,用作顶点数组 ...
- 免费网盘!无限申请5TB容量并且不限速的网盘!
鸽了好久没有更新博客了哎…… 前言 这里我先说一下下,本人深受百度网盘坑害,自己上传的文件,16GB下载花了3天时间 最后下载失败? 所以找到的一个新的储存个人文件的方法. 这个网盘是onedrive ...
- STM32F407的时钟配置
有3种时钟, HSI,High Speed Internal,默认是这个 HSE,High Speed External,用外置晶振,官方开发板默认晶振为25MHz,stm32f4xx.h中有定义HS ...
- sys.stdout.write和print和sys.stdout.flush
1. 先看下官方文档 """ sys.stdout.write(string) Write string to stream. Returns the number of ...