也说Socket
网上有大量socket相关文章,茫茫多,大多交代不清,最近自我整理了一下socket相关知识,附加了大量代码注释,先看效果。

上代码,客户端:
Socket socket1 = null;//一个全局的socket对象
private void btnConnect_Click(object sender, EventArgs e)
{
//获得服务器ip和端口号
IPAddress ip = IPAddress.Parse(textBox1.Text);
int port =Convert.ToInt32( textBox2.Text);
//构造客户端socket,设置为tcp协议模式
socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接
socket1.Connect(ip, port);
if (socket1.Connected)//如果连接成功
{
textBox3.Text += "连接成功\r\n";
SendMsg(socket1, "发成功");
string recMsg= "";
//接收
ReceiveMsg(socket1, ref recMsg);
textBox3.Text +=recMsg;//文本显示
}
else
{
textBox3.Text += "连接不成功\r\n";
}
}
private void btnSendMessage_Click(object sender, EventArgs e)
{
if (socket1.Connected)
{
string sendMsg = textBox4.Text;
//依据长度判断是否发送
if (sendMsg.Length <= )
{
return;
}
//拿到发送是否成功的标记
bool isSendSuccess = SendMsg(socket1, textBox4.Text);
string recMsg = "";
bool isReceiveSuccess = ReceiveMsg(socket1, ref recMsg);
textBox3.Text += recMsg;
if (!(isSendSuccess&&isReceiveSuccess))
{
textBox3.Text += "连接已断开,请重连";
}
}
}
/// <summary>
/// 发送内容,并显示
/// </summary>
/// <param name="socket">发送内容的socket</param>
/// <param name="msg">输入字符串</param>
/// <returns>发送是否成功</returns>
private bool SendMsg(Socket socket, string msg)
{
try {
socket.Send(Encoding.UTF8.GetBytes(msg));
return true;
}
catch (Exception e)
{
socket.Close();
return false;
}
}
/// <summary>
/// 接收内容,并显示
/// </summary>
/// <param name="socket">接受内容的socket</param>
/// <param name="msg">输出字符串</param>
/// <returns>接收是否成功</returns>
private static bool ReceiveMsg(Socket socket ,ref string msg)
{
try
{
int recNumber;//接收到的字节数量
byte[] recBytes = new byte[];//缓冲字节数组
recNumber = socket.Receive(recBytes);//接收行为
byte[] recBytesForShort = new byte[recNumber];//byteArrayForDestination
Array.Copy(recBytes, recBytesForShort, recNumber);//拷贝
//显示文本构造
msg += (Encoding.UTF8.GetString(recBytesForShort) + "\r\n");
return true;
}
catch (Exception e)
{
socket.Close();
return false;
}
}
客户端
服务端:
static void Main(string[] args)
{
//设置监听的ip和端口号
IPAddress ip = IPAddress.Parse("192.168.120.56");
IPEndPoint ipEP = new IPEndPoint(ip, ); //迎宾socket
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定
serverSocket.Bind(ipEP);
//监听
serverSocket.Listen();
Console.WriteLine("监听已开\r\n"); while (true)
{
//这里会阻塞当前线程,以等待连接
Socket socketTemp = serverSocket.Accept(); //开启其他线程处理数据
ParameterizedThreadStart pts = new ParameterizedThreadStart(ReceiveAndSend);//这里传入的方法必须是静态
new Thread(pts).Start(socketTemp);
} } /// <summary>
/// socket循环读取和发送的方法,建议用于多线程异步处理
/// </summary>
/// <param name="socketTemp">单用户Socket对象</param>
private static void ReceiveAndSend(object socketTemp)
{
Socket socket = (Socket)socketTemp;
IPEndPoint ipep = ((IPEndPoint)(socket.RemoteEndPoint));
string ip = ipep.Address.ToString();//获得对方ip
string port = ipep.Port.ToString();//获得对方端口
byte[] buffer = new byte[]; while (true)//循环接收和发送
{
//接收并显示
string result="";
bool isReceiveMsgSuccess = ReceiveMsg(socket, ref result);
if (isReceiveMsgSuccess)
{
Console.WriteLine(DateTime.Now.ToLongDateString()+" "+ DateTime.Now.ToLongTimeString());
Console.WriteLine(ip + " _ " + port + ":" + result);
} //回发
string sendBackStr = "服务端已接收:" + result;
SendMsg(socket, sendBackStr); //socket.Shutdown(SocketShutdown.Both);
//socket.Close();
//socket.Dispose();
}
} /// <summary>
/// 接收内容(如果失败,会释放socket)
/// </summary>
/// <param name="socket">接受内容的socket</param>
/// <param name="msg">输出字符串</param>
/// <returns>接收是否成功</returns>
private static bool ReceiveMsg(Socket socket,ref string msg)
{
try
{
int recNumber;//接收到的字节数量
byte[] recBytes = new byte[];//缓冲字节数组
recNumber = socket.Receive(recBytes);//接收行为
byte[] recBytesForShort = new byte[recNumber];
Array.Copy(recBytes, recBytesForShort, recNumber);//拷贝 //显示
msg += Encoding.UTF8.GetString(recBytesForShort) + "\r\n"; return true;
}
catch (Exception e)
{
socket.Close(); return false;
} } /// <summary>
/// 发送内容(如果失败,会释放socket)
/// </summary>
/// <param name="socket">发送内容的socket</param>
/// <param name="msg">输入字符串</param>
/// <returns>接收是否成功</returns>
private static bool SendMsg(Socket socket, string msg)
{
try
{
socket.Send(Encoding.UTF8.GetBytes(msg));
return true;
}
catch (Exception e)
{
socket.Close();
return false;
}
}
服务端
也说Socket的更多相关文章
- socket读写返回值的处理
在调用socket读写函数read(),write()时,都会有返回值.如果没有正确处理返回值,就可能引入一些问题 总结了以下几点 1当read()或者write()函数返回值大于0时,表示实际从缓冲 ...
- Socket聊天程序——Common
写在前面: 上一篇记录了Socket聊天程序的客户端设计,为了记录的完整性,这里还是将Socket聊天的最后一个模块--Common模块记录一下.Common的设计如下: 功能说明: Common模块 ...
- Socket聊天程序——客户端
写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...
- Socket聊天程序——服务端
写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...
- Socket聊天程序——初始设计
写在前面: 可能是临近期末了,各种课程设计接踵而来,最近在csdn上看到2个一样问答(问题A,问题B),那就是编写一个基于socket的聊天程序,正好最近刚用socket做了一些事,出于兴趣,自己抽了 ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- Android Socket连接PC出错问题及解决
最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.
- Linux下的C Socket编程 -- server端的继续研究
Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...
- Mono 3.2.3 Socket功能迎来一稳定的版本
由于兴趣自己业余时间一直在搞.net下面的通讯应用,mono的存在得以让.NET程序轻松运行在Linux之下.不过经过多尝试Socket相关功能在Mono下的表现并不理想.不管性能还是吞吐能力方面离我 ...
- Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...
随机推荐
- PHP中的自动加载
自动加载? 或许你已经对自动加载有所了解.简单描述一下:自动加载就是我们在new一个class的时候,不需要手动去写require来导入这个class.php文件,程序自动帮我们加载导入进来.这是 ...
- String字符串相加常见面试题
String name1="jack"; String name2="jack"; System.out.println(name1==name2); // t ...
- PHP验证码生成及图片处理(GD库)
GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片,也可以给图片加水印. 本章实现了生成图片并绘画各种形状.图片的压缩.中文字符水印及图片水印 ...
- yolo_v3训练自己的模型(人脸及deep-sort)
做deep-sort多目标跟踪需要结合yolo_v3进行检测行人 由于我的项目中需要对人脸进行检测,所以需要训练针对人脸的模型 训练样本是来自WIDER-FACE人脸库.(有3w+的图片和标注框) d ...
- jquery.jtable的事件
前景提要最近在使用abp zero框架帮朋友搭建一个工厂管理系统.其中有一块功能的话是通过定时爬虫拉取当日的铝价.铝价展示用的是abp zero框架中土牛写的jquery.jtable,铝价需要根据当 ...
- Ocelot简易教程(五)之集成IdentityServer认证以及授权
Ocelot简易教程目录 Ocelot简易教程(一)之Ocelot是什么 Ocelot简易教程(二)之快速开始1 Ocelot简易教程(二)之快速开始2 Ocelot简易教程(三)之主要特性及路由详解 ...
- Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程
Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一) 图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图.那么如何在Asp.Net Core W ...
- Android--UI之ProgressBar
前言 开门见山,开篇明意.这篇博客主要讲解一下Android中ProgressBar控件以及间接继承它的两个子控件SeekBar.RatingBar的基本用法,因为其有继承关系,存在一些共有特性,所以 ...
- 谷歌浏览器中安装JsonView扩展程序
实际开发工作中经常用到json数据,那么就会有这样一个需求:在谷歌浏览器中访问URL地址返回的json数据能否按照json格式展现出来. 比如,在谷歌浏览器中访问:http://jsonview.co ...
- spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)
不多说,直接上干货! 前言 其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...