网上有大量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的更多相关文章

  1. socket读写返回值的处理

    在调用socket读写函数read(),write()时,都会有返回值.如果没有正确处理返回值,就可能引入一些问题 总结了以下几点 1当read()或者write()函数返回值大于0时,表示实际从缓冲 ...

  2. Socket聊天程序——Common

    写在前面: 上一篇记录了Socket聊天程序的客户端设计,为了记录的完整性,这里还是将Socket聊天的最后一个模块--Common模块记录一下.Common的设计如下: 功能说明: Common模块 ...

  3. Socket聊天程序——客户端

    写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...

  4. Socket聊天程序——服务端

    写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...

  5. Socket聊天程序——初始设计

    写在前面: 可能是临近期末了,各种课程设计接踵而来,最近在csdn上看到2个一样问答(问题A,问题B),那就是编写一个基于socket的聊天程序,正好最近刚用socket做了一些事,出于兴趣,自己抽了 ...

  6. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  7. Android Socket连接PC出错问题及解决

    最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.

  8. Linux下的C Socket编程 -- server端的继续研究

    Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...

  9. Mono 3.2.3 Socket功能迎来一稳定的版本

    由于兴趣自己业余时间一直在搞.net下面的通讯应用,mono的存在得以让.NET程序轻松运行在Linux之下.不过经过多尝试Socket相关功能在Mono下的表现并不理想.不管性能还是吞吐能力方面离我 ...

  10. Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!

    随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...

随机推荐

  1. Spring详解(八)------事务管理

    PS:本篇博客源码下载链接:http://pan.baidu.com/s/1mi3NhX2 密码:3io2 1.事务介绍 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指 ...

  2. feh: linux终端下看图片的好工具

    1) 普通浏览 $ feh * 可以察看当前目录下的所有图片,以及当前子目录里的所有图片 2) 播放幻灯片 (-D)   $ feh -D 2 *.jpg 对所有jpg以幻灯片的方式播放,每两秒放一张 ...

  3. ubuntu 16.04 和win10双系统ubuntu无法更新问题解决

    错误:E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem. ...

  4. redis安装以及安全配置

    redis安装以及安全配置 1. 安装 sudo apt-get install redis-server 使用which查询redis执行体安装路径: which redis-server #/us ...

  5. 解决Database returned an invalid datetime value. Are time zone definitions for your database installed?

    设定博客文章按照时间分层筛选出现问题 ret=Article.objects.filter(user=user).annotate(month=TruncMonth("create_time ...

  6. nginx、swoole高并发原理初探

    阅前热身 为了更加形象的说明同步异步.阻塞非阻塞,我们以小明去买奶茶为例. 同步与异步 同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式. 同步:当一个同步调用发出去后,调用者要一直等待调 ...

  7. Java核心技术及面试指南 键值对方面的面试题总结以及答案

    3.3.5.1如何遍历HashMap对象?尤其请说明通过Iterator遍历HashMap对象的方法. 建议用这种方式: Set<Entry<String,String>>en ...

  8. HashMap source code view(1)

    前言 HashMap source code view 类注释 Hash table based implementation of the Map interface. This implement ...

  9. python 加密算法及其相关模块的学习(hashlib,random,string,math)

    加密算法介绍 一,HASH Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种 ...

  10. python闯关之路(五)前端开发

    一,HTML部分 1,XHTML和HTML有什么区别 HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言最主要的不同: XHTML 元素必须被正确地嵌套. XHTML 元素必 ...