也说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的服务端,并进行双向通信.如 ...
随机推荐
- [P5172] Sum
"类欧几里得算法"第一题 sum [题意] 给入\(n,r\),求\(\sum_{d=1}^n(-1)^{\lfloor d\sqrt r \rfloor}\). [分析] 只需要 ...
- 浅谈工作单元 在整个 ABP 框架当中的应用
ABP在其内部实现了工作单元模式,统一地进行事务与连接管理. 其核心就是通过 Castle 的 Dynamic Proxy 进行动态代理,在组件注册的时候进行拦截器注入,拦截到实现了 Unit Of ...
- mysql 架构篇系列 1 复制原理和复制架构
一. 复制概述 mysql 从3.23版本开始提供复制功能,复制是指将主数据库的ddl和dml操作通过二进制日志传到复制服务器(也叫从服务器)上,然后在从服务器上对这些日志重新执行(也叫重做),从而使 ...
- Android--解析XML之PULL
前言 在上一篇博客已经介绍了Android解析XML的几种方式,分别有:SAX.DOM.PULL.详细的可以看看上一篇博客:http://www.cnblogs.com/plokmju/p/andro ...
- Android数据保存之SharedPreference
前言: 程序中处理的大部分问题都与数据有关,读取数据显示在UI上,读取的数据可以是本地的,也可以是网络的.保存用户数据到存储空间,可以是本地的数据库,文件等,也可以是保存到网络服务器.总之大部分的程序 ...
- 翻译:insert select(已提交到MariaDB官方手册)
本文为mariadb官方手册:insert select的译文. 原文:https://mariadb.com/kb/en/insert-select/ 我提交到MariaDB官方手册的译文:http ...
- tomcat编译项目后,classes文件没有相应的改变;
tomcat编译项目后,classes文件没有相应的改变: tomcat不能将项目部署到服务器: 1.首先,在tomcat安装目录webapps中将编译后的整个项目删掉,然后再在eclipse将tom ...
- 从零开始学安全(十)●TCP/IP协议栈
局域网靠mac 地址通信
- asp.net-基础-20180321
C#与.NET的关系 C#不是语言,.net是平台.
- [android] 开启新的activity获取他的返回值
应用场景:打开一个新的activity,在这个activity上获取数据,返回给打开它的界面 短信发送时,可以直接选择系统联系人 界面布局是一个线性布局,里面右侧选择联系人在EditText的右上,因 ...