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连接封装. 比如我们常见的游戏服务器,目前的很火的物联网 ...
随机推荐
- SQL Server AlwaysOn
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/高性能解决方案 概述 环境: 域服务器:windows server 2008 R2 SP1,192.168.2.10 DNS:1 ...
- Chrome 控制台新玩法-console显示图片以及为文字加样式
有兴趣的同学可以文章最后的代码复制贴到控制台玩玩. Go for Code 在正常模式下,一般只能向console 控制台输出简单的文字信息.但为了把信息输出得更优雅更便于阅读,除了cosole.lo ...
- C语言 · 未名湖边的烦恼
问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩. 每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个.现在 ...
- 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型
第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...
- java stopwatch 功能
C#中有一个stopwatch的功能,主要是用来监测程序执行时间的.java之前一直都在用如下方式完成: public static void main(String[] args) { long s ...
- Service基础使用
Service基础使用 之前的文章一直介绍Activity的使用,很多知识和用法单一的配合Activity使用,这次将总结Android四大组件之二--Service. 本文将要介绍以下内容: Ser ...
- Java this的一两点使用
Java this的一两点使用 之前的文章都是关于Android的使用,这次想写一些关于Java的知识,总结一下Java的使用.这次写的是关于Java this的使用,介绍以下内容: this的概念 ...
- 删除数据表中除id外其他字段相同的冗余信息
删除一个信息表中除id外其他字段都相同的冗余信息,如下 id name addr 1 a b 2 a b 3 b c 删除这个表中的冗余信息 即应该是 id name addr 1 a b 3 b c ...
- Spring学习记录(七)---表达式语言-SpEL
SpEL---Spring Expression Language:是一个支持运行时查询和操作对象图表达式语言.使用#{...}作为定界符,为bean属性动态赋值提供了便利. ①对于普通的赋值,用Sp ...
- 微小,但是美好的改变 G2 2.2发布
G2 2.2.0, 『微小,但是美好的改变.』 # 一.丰富可视化交互形式 #### 选择: [图形的单选.多选](https://g2.alipay.com/tutorial/geom-select ...