也说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的服务端,并进行双向通信.如 ...
随机推荐
- Ubuntu 16.04 系统无法挂载u盘的问题
Ubuntu系统无法挂载U盘设备,提示错误为:mount:未知文件系统类型“exfat”.这是因为Ubuntu默认情况下是不允许挂载U盘的,想在Ubuntu系统下挂载U盘,就要用下面的方法了. sud ...
- gdb调试的layout使用
layout:用于分割窗口,可以一边查看代码,一边测试.主要有以下几种用法:layout src:显示源代码窗口layout asm:显示汇编窗口layout regs:显示源代码/汇编和寄存器窗口l ...
- tensorflow 1.0 学习:参数初始化(initializer)
CNN中最重要的就是参数了,包括W,b. 我们训练CNN的最终目的就是得到最好的参数,使得目标函数取得最小值.参数的初始化也同样重要,因此微调受到很多人的重视,那么tf提供了哪些初始化参数的方法呢,我 ...
- 如何配置React Native真机调试-iOS
说在前面,本教程是建立在项目已经成功在模拟器上运行的基础上,如果你是还未配置好环境的新手,建议先从官网快速入门开始:官网英文版 . 中文版 ok, 切入正题,当你已经完成好环境配置,在模拟器上成功的运 ...
- [Jenkins][Git]ssh原理以及与https的区别
-------------------------------------------------------------------- 本文参考多篇文章结合自身情况完成,可自由转载,需保留本文出处! ...
- 原生js ajax请求
什么是ajax AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新. 这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新, ...
- TCP/IP 笔记 - 安全
安全:可扩展身份认证协议.IP安全协议.传输层安全.DNS安全.域名密钥识别邮件 任何由用户或以用户账号执行却违背了用户本身意愿的软件被称为恶意软件 网络安全是一门十分广泛及有深度的学识,而本书旨在了 ...
- Chapter 4 Invitations——6
The snow washed away for good after that one dangerously icy day. 在危险的冰天雪地之后,这场雪洗走了很多. Mike was disa ...
- leetcode — search-a-2d-matrix
/** * Source : https://oj.leetcode.com/problems/search-a-2d-matrix/ * * * Write an efficient algorit ...
- Python 实现 KNN(K-近邻)算法
一.概述 KNN(K-最近邻)算法是相对比较简单的机器学习算法之一,它主要用于对事物进行分类.用比较官方的话来说就是:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例, ...