C#-Socket监听消息处理
TCP/IP:Transmission Control Protocol/Internet Protocol,传输控制协议/因特网互联协议,又名网络通讯协议。简单来说:TCP控制传输数据,负责发现传输的问题,一旦有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地,而IP是负责给因特网中的每一台电脑定义一个地址,以便传输。TCP协议在许多分布式应用程序中进行消息命令传递是必不可少的部分。
TCP通信的三次握手:三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。
- 第一次握手:客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。
- 第二次握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。
- 第三次握手:客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1
先看下服务端Socket监听代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace SocketDome
{
/// <summary>
/// 处理Socket监听逻辑
/// </summary>
public class SocketProvider
{
private static Socket serviceSocketListener; //Socke监听处理请求
/// <summary>
/// 开启Socket监听
/// </summary>
public static void Init()
{
serviceSocketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serviceSocketListener.Bind()); //IP和端口应该是可配置
serviceSocketListener.Listen();
Thread handleSocket = new Thread(new ThreadStart(HandleSocket));
handleSocket.Start();
}
/// <summary>
/// 监听链接
/// </summary>
private static void HandleSocket()
{
while (true)
{
try
{
Socket currSocket = serviceSocketListener.Accept(); //为新建连接创建新的 System.Net.Sockets.Socket
Thread processThread = new Thread(new ParameterizedThreadStart(ProcessSocket));
processThread.Start(currSocket);
}
catch { }
}
}
/// <summary>
/// 处理Socket信息
/// </summary>
/// <param name="obj">新建连接创建新Socket对象</param>
private static void ProcessSocket(object obj)
{
Socket currSocket = (Socket)obj;
try
{
];
int recbytes;
recbytes = currSocket.Receive(recvBytess, recvBytess.Length, );
)
{
, recbytes);
var _order = contentStr.Split('~');
].ToUpper() + "#SUCCESS"); //先相应对话,然后去异步处理
currSocket.Send(sendPass, sendPass.Length, SocketFlags.None);
].ToUpper())
{
case"ADDCACHE":
Console.WriteLine(]);
//处理ADDCACHE逻辑
Console.WriteLine("写Log日志");
break;
default :
Console.WriteLine("命令错误");
Console.WriteLine("写Log日志");
break;
}
}
}
catch (Exception ex)
{
Console.WriteLine("写Error日志" + ex.Message);
}
}
}
}
这个服务端,监听着客户端发来的命令,格式定义为:命令~参数,在服务端接受到客户端的命令消息后立即回传接到命令并开始处理,进行异步处理避免客户端等待。
下面看下客户端的Socket客户端主动请求服务端代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace ConsoleApplication7
{
/// <summary>
/// Socket Helper
/// </summary>
public class SocketHelper
{
private string ip;
private IPEndPoint ex;
private Socket socket;
public SocketHelper(string ip, int port)
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
this.ip = ip;
this.ex = new IPEndPoint(IPAddress.Parse(ip), port);
}
/// <summary>
/// Socket 进行连接
/// </summary>
/// <returns>连接失败OR成功</returns>
public bool Socketlink()
{
try
{
socket.Connect(ex);
return true;
}
catch (Exception ex)
{
return false;
}
}
/// <summary>
/// Socket 发送消息
/// </summary>
/// <param name="strmsg">消息</param>
public void SendVarMessage(string strmsg)
{
try
{
byte[] msg = System.Text.Encoding.UTF8.GetBytes(strmsg);
this.socket.Send(msg);
}
catch (Exception ex)
{
this.socket.Close();
}
}
/// <summary>
/// Socket 消息回传
/// </summary>
/// <returns></returns>
public string ReceiveMessage()
{
try
{
];
int recv = socket.Receive(msg);
this.socket.Close();
, recv);
}
catch (Exception ex)
{
this.socket.Close();
return "ERROR";
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication7
{
class Program
{
static void Main(string[] args)
{
SocketHelper socket = );
if(socket.Socketlink())
{
Console.WriteLine("连接成功");
socket.SendVarMessage("ADDCACHE~张三");
string strReposon = socket.ReceiveMessage();
Console.WriteLine(strReposon);
}
Console.Read();
}
}
}
首先以管理园身份开启服务端查询,然后客户端主动请求服务端进行消息请求。
C#-Socket监听消息处理的更多相关文章
- 解决tomcat启动Socket监听端口死循环被hold问题
原文链接:http://blog.csdn.net/dead_cicle/article/details/7073433 1.SOCKET监听置于servlet的init方法中,在web.xml里加入 ...
- 【网络通信】服务器端Socket监听80端口,建立连接传输数据时也是使用的80端口么?
1. 服务器端Socket监听80端口,建立连接传输数据时也是使用的80端口么? 答:对.建立连接时服务器会分配一个新的Socket,但是用的源端口号还是80端口.套接字是由协议类型.源IP.目的IP ...
- Tomcat服务器无法启动socket监听端口
最近生成一个新的web服务器,在启动后无法启动socket监听,检查程序本身无问题, 找原因,只是发布时搞错.处理如下: 1.在Eclipse平台 删除原来的web server; 2.新建serve ...
- 为什么有监听socket和连接socket,为什么产生两个socket
为什么有监听socket和连接socket,为什么产生两个socket 先看一半的socket建立连接的双方的过程: 客户端: socket()---->创建出 active_socket_fd ...
- C# 利用socekt做到http监听,怎么样才能做到高性能
c#原始提供了http的监听的类HttpListener,实现了简单的http.文章地址<C# 控制台或者winform程序开启http的监听状态> 但是经过我测试,这个HttpListe ...
- iptables 完成联网控制 (续) ,独立native进程监听。
上一篇:http://www.cnblogs.com/oscar1011/p/5243877.html 之前做的iptables 来进行的联网控制,一直耿耿于怀,想要知道系统里的netd等等是如何做到 ...
- 简单读!tomcat源码(一)启动与监听
tomcat 作为知名的web容器,很棒! 本文简单了从其应用命令开始拆解,让我们对他有清晰的了解,揭开神秘的面纱!(冗长的代码流水线,给你一目了然) 话分两头: 1. tomcat是如何启动的? 2 ...
- ORA-12514:监听程序无法识别
使用plsql远程登录oracle数据库时,出现无法识别监听程序的错误.很大机率是配置文件出错. 配置文件如下: listener.ora是服务器端用的,oracle监听程序,就是读的这个文件,里面有 ...
- C# Socket系列一 简单的创建socket的监听
socket的应用场景,在快速,稳定,保持长连接的数据传输代码.Http也是socket封装出来的,基于一次请求一次回复,然后断开的socket连接封装. 比如我们常见的游戏服务器,目前的很火的物联网 ...
随机推荐
- Android学习第二天-android常用命令
上一篇文章中,我们重点讲解了adb的常用命令,下面我们一起来看看其它常用的命令 2 android 2.1 查看机器上所有已经安装的Android版本和AVD设备 2.1.1查看机器上已经安装的AVD ...
- oracle中查询、禁用、启用、删除表外键
1.查询所有表的外键的: select table_name, constraint_name from user_constraints where constraint_type = 'R'; ...
- java,H5微信蓝牙设备开发教程申请设备和添加设备(2)
转载地址 http://www.vxzsk.com/76.html 申请设备功能 a. 登录公众平台,点击左边功能栏的"添加功能插件",选择"设备功能". b ...
- Android笔记——SQLiteOpenHelper类
public 抽象类 SQLiteOpenHelper 继承关系 Java.lang.Object android.database.sqlite.SQLiteOpenHelper 类概要 这是一个辅 ...
- Ajax概要:
Ajax概要: Ajax不是个全新的技术,它是多种技术合并在一起产生的,包括XHTML,CSS,JavaScript,XmlHttpRequest,XML,JSON,DOM等 优点:(这也解释了为何我 ...
- 推荐21款最佳 HTML5 网页游戏
尽管 HTML5 的完全实现还有很长的路要走,但 HTML5 正在改变 Web,未来 HTML5 将把 Web 带入一个更加成熟和开放的应用平台.现在,越来越多的人尝试用 HTML5 来制作网页游戏等 ...
- javascript面向对象系列第三篇——实现继承的3种形式
× 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...
- php常用函数
1.随机数和时间 echo rand(); //随机数生成器echo rand(0,10); //生成某个范围内的随机数 <!DOCTYPE html PUBLIC "-//W3C/ ...
- Java设计模式之单例模式(Singleton)
前言: 在总结okHttp的时候,为了管理网络请求使用到了单例模式,晚上实在没啥状态了,静下心来学习总结一下使用频率最高的设计模式单例模式. 单例模式: 单例模式确保某个类只有一个实例,而且自行实例化 ...
- ASP.NET Core的配置(1):读取配置信息
提到"配置"二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...