也说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的服务端,并进行双向通信.如 ...
随机推荐
- MySQL:数据库表的空间回收
1. 表数据的存储方式 表数据既可以存储在共享表空间,也可以时单独的文件.这个行为由参数 innodb_file_per_table 控制: 设置为 OFF 时,表示表数据存储在共享表空间: 设置为 ...
- 深入分析Java I/O的工作机制 (一)
此篇博客看至许令波的深入分析javaWeb内幕书籍, 此篇博客写的是自己看完之后理解的重点内容,加一些理解,希望对你有帮助. 1.Java的I/O类库的基本架构 先说一下什么是类库:可以说是类的集合, ...
- JavaScript 快速入门
JavaScript是jquery的基础, JavaScript是一种描述性语言 JavaScript的组成 :ECMAScript,BOM,DOM. JavaScript的基本结构 <scri ...
- Zookeeper-watcher机制源码分析(一)
Watcher的基本流程 ZooKeeper 的 Watcher 机制,总的来说可以分为三个过程:客户端注册 Watcher.服务器处理 Watcher 和客户端回调 Watcher 客户端注册wat ...
- 使用异步任务降低API延迟_实践总结
之前在想如何降低API的延迟,这些API里有几个比较耗时的操作且是串行执行,那通过异步执行的方式理论上可以降低运行的时间,如下图所示: 具体的实现比较简单,例如这样: public class Par ...
- VueJs(11)---vue-router(命名路由,命名视图,重定向别名,路由组件传参)
vue-router 上篇文章讲了第一篇vue-router相关文章,文章地址:VueJs(10)---vue-router(进阶1) 一.命名路由 有时候,通过一个名称来标识一个路由显得更方便一些, ...
- mysql 导入 CSV文件命令行 ERROR 13 (HY000): Can't get stat of
一定要查看好CSV字段结构是否和文件的表结构字段一致 load data local infile 'F:/MySqlData/test1.csv' --CSV文件存放路径 into table st ...
- Android--解析XML之DOM
前言 前面已经介绍了Android平台下两种解析XML的方法,SAX和PULL,这两个均为事件驱动,以流的形式解析XML文档.现在介绍一种新的方式DOM方式解析XML. DOM是一种用于XML文档对象 ...
- Ioc及Bean容器(三)
专题一 IoC 接口及面向接口编程 什么是 IoC Spring 的Bean配置 Bean 的初始化 Spring 的常用注入方式 接口 用于沟通的中介物的抽象化 实体把自己提供给外界的一种抽象化说明 ...
- [ASP.NET MVC]笔记(四) UnobtruSive AJAX和客户端验证
UnobtruSive AJAX和客户端验证 ASP.NET MVC 已经默认开启非侵入试js和客户端验证,在web.config可以看到如下配置: <configuration> < ...