基于Tcp协议的Socket通讯类似于B/S架构,面向连接,但不同的是服务器端可以向客户端主动推送消息。

使用Tcp协议通讯需要具备以下几个条件:

    (1).建立一个套接字(Socket)

    (2).绑定服务器端IP地址及端口号--服务器端

    (3).利用Listen()方法开启监听--服务器端

    (4).利用Accept()方法尝试与客户端建立一个连接--服务器端

    (5).利用Connect()方法与服务器建立连接--客户端

    (5).利用Send()方法向建立连接的主机发送消息

    (6).利用Recive()方法接受来自建立连接的主机的消息(可靠连接)

以下为个人平时编写的实例

TCP服务端实例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Net; namespace TcpServerConsoleApp
{
class Program
{
/// <summary>
/// 服务器端的监听器
/// </summary>
private static TcpListener _tcpl = null;
/// <summary>
/// 本机IP地址
/// </summary>
private static IPAddress _ip = null; private static int _port = ; static void Main(string[] args)
{
GetLocationIp();//获取IP地址
StartTcpServer();//启动 } private static void GetLocationIp()
{
//IP4获取IP地址
//IPAddress _ip = Dns.GetHostAddresses(Dns.GetHostName())[0];//可能有多个,此时的IP是本地IP //如果在IP6的需要以下发送获取IP地址
IPHostEntry IpEntry = Dns.GetHostEntry(Dns.GetHostName());
for (int i = ; i < IpEntry.AddressList.Length; i++)
{
//从IP地址列表中筛选出IPv4类型的IP地址
//AddressFamily.InterNetwork表示此IP为IPv4,
//AddressFamily.InterNetworkV6表示此地址为IPv6类型
if (IpEntry.AddressList[i].AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
_ip = IpEntry.AddressList[i];
break;
}
} } /// <summary>
/// 启动TCP服务器
/// </summary>
/// <param name="port"></param>
private static void StartTcpServer()
{
try
{
_tcpl = new TcpListener(_ip, _port);
_tcpl.Start();
Console.WriteLine("服务器已启动,正在监听...\n");
Console.WriteLine(string.Format("服务器IP:{0}\t端口号:{1}\n", _ip, _port));
//AcceptSocket 是一个阻止方法,该方法返回可用于发送和接收数据的 Socket。
//如果希望避免阻止,请使用 Pending 方法来确定传入连接队列中的连接请求是否可用。
//返回的 Socket 是使用远程主机的 IP 地址和端口号初始化的。
//您可以使用 Socket 类中任何可用的 Send 和 Receive 方法与远程主机进行通信。
//------------使用 Socket 后,请确保调用其 Close 方法。如果应用程序相对简单,-----------
//请考虑使用 AcceptTcpClient 方法代替 AcceptSocket 方法。
//TcpClient 提供了一些通过网络在阻止同步模式下发送和接收数据的简单方法。 Socket newClient = _tcpl.AcceptSocket();//本地TcpListener 接受新的请求
//返回的 Socket 是使用远程主机的 IP 地址和端口号初始化的 //byte[] packetBuff = new byte[ * ];//接收数据缓冲区大小10K
//newClient.Receive(packetBuff); Console.WriteLine("接入客服端:{0}", newClient.RemoteEndPoint.ToString()); Thread clientThread = new Thread(() => ThrendReciveFunc(newClient));
clientThread.Start();
}
catch
{ } } /// <summary>
/// 接收子线程
/// </summary>
/// <param name="socketClient"></param>
private static void ThrendReciveFunc(Socket socketClient)
{
while (true)
{
try
{
byte[] buffer = new byte[ * ];//接收数据缓冲区
int count = socketClient.Receive(buffer);
string msg = Encoding.Default.GetString(buffer, , count);
Console.WriteLine("收到消息:{0}", msg);
string sendmsg = "收到消息!";
socketClient.Send(Encoding.Default.GetBytes(sendmsg));
}
catch (Exception ex)
{
Console.WriteLine(string.Format("出现异常:{0}", ex.Message));
Thread.CurrentThread.Abort();//结束该接收线程
Console.Read();
break;
}
}
} }
}

TCP客服端实例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading; namespace TcpClientConsolApp
{
class Program
{
static IPAddress _ip = null;
static TcpClient _tcpc;
static NetworkStream Netstream;//提供用于访问网络的基本数据流
static void Main(string[] args)
{
Console.WriteLine("请输入IP地址:");
GetIpAddr();
Console.WriteLine("请输入端口号:");
int port = Convert.ToInt16(Console.ReadLine());
try
{
_tcpc = new TcpClient();
_tcpc.Connect(_ip, port);
if (_tcpc != null)
{
Console.WriteLine("连接成功");
Netstream = _tcpc.GetStream();
Thread recvieThread = new Thread(RecvieFunc);
recvieThread.Start(); /*发送数据*/
while (true)
{
Console.WriteLine("输入要发送的数据");
byte[] msg = Encoding.Default.GetBytes(Console.ReadLine());
Netstream.Write(msg, , msg.Length);
}
}
else
{
Console.WriteLine("连接失败!");
}
}
catch
{ } Console.Read(); } static void GetIpAddr()
{
try
{
_ip = IPAddress.Parse(Console.ReadLine());
}
catch
{ }
if (_ip == null)
{
Console.WriteLine("输入IP地址有误,请重新输入");
GetIpAddr();
}
} /// <summary>
/// 接收线程
/// </summary>
static void RecvieFunc()
{
while (_tcpc.Client.Connected)
{
try
{
byte[] buffer = new byte[ * ];
int count = _tcpc.Client.Receive(buffer);
string msg = Encoding.Default.GetString(buffer, , count);
Console.WriteLine("接收到信息:{0}", msg); }
catch (Exception ex)
{
Console.WriteLine(string.Format("出现异常:{0}", ex.Message));
//Netstream = null;
Netstream.Close();
Thread.CurrentThread.Abort();
break;
}
}
}
}
}

浅谈TCP通讯的更多相关文章

  1. 浅谈TCP IP协议栈(三)路由器简介

    读完这个系列的第一篇浅谈TCP/IP协议栈(一)入门知识和第二篇浅谈TCP/IP协议栈(二)IP地址,在第一篇中,可能我对协议栈中这个栈的解释有问题,栈在数据结构中是一种先进后出的常见结构,而在整个T ...

  2. 浅谈 TCP、IP、DNS 和 HTTP 的关系

    一.浅谈三个协议的基本概念 1.IP 协议 按层次分,IP网际协议位于网络层,几乎所有的网络的系统都会用到 IP 协议,其重要性非同一般.IP 协议作用就是把各种数据包传送给对方,对方的地址就要看其 ...

  3. 浅谈TCP/IP网络编程中socket的行为

    我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...

  4. 浅谈TCP优化

    原文地址:http://kb.cnblogs.com/page/197406/ 很多人常常对TCP优化有一种雾里看花的感觉,实际上只要理解了TCP的运行方式就能掀开它的神秘面纱.Ilya Grigor ...

  5. 浅谈TCP优化(转)

    很多人常常对TCP优化有一种雾里看花的感觉,实际上只要理解了TCP的运行方式就能掀开它的神秘面纱.Ilya Grigorik 在「High Performance Browser Networking ...

  6. 浅谈tcp粘包问题

    第一部分:简介tcp socket通信的底层原理 原理解析图: socket通信过程如图所示:首先客户端将发送内容通过send()方法将内容发送到客户端计算机的内核区,然后由操作系统将内容通过底层路径 ...

  7. 浅谈TCP IP协议栈(一)入门知识【转】

    说来惭愧,打算写关于网络方面的知识很久了,结果到今天才正式动笔,好了,废话不多说,写一些自己能看懂的入门知识,对自己来说是一种知识的总结,也希望能帮到一些想了解网络知识的童鞋. 万事开头难,然后中间难 ...

  8. 浅谈TCP协议,总算明白它是干什么的了

    一.什么是TCP,他是干什么的? TCP即传输控制协议(Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通讯协议. TCP是为了在不可靠的互联网 ...

  9. 面试:浅谈tcp/udp

    tcp是一种面向连接的.可靠的.基于字节流的传输层通信协议.是专门为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的,面向字节流. udp(用户数据报协议)是iso参考模型中一种无连接的传输层 ...

随机推荐

  1. Mongodb 集群加keyFile认证

    介绍 自从远古计绳结开始,数据库的存储就注定了今天的地位和多样性,Nosql的出现更是解决了现有的关系型数据库无法解决的一些难题,对高性能,灵活度,扩展性,海量数据的问题.随之而出现的高速内存索引数据 ...

  2. 使用Javamail发送邮件Util

    maven: <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artif ...

  3. apache配置https和http的时候You don't have permission to access / on this server.

    You don't have permission to access / on this server. 是由于没有设置访问目录 今天配置httpd-ssl.conf的时候  发现这个问题 由于默认 ...

  4. IOS 上架要求视频及屏幕截屏

    客户提供上架的资料 1.IOS 上架要求视频演示,录制一段视频,上传到优酷,需要url连接. 2.手机截屏,每个尺寸5张.5s/6/6p *5=15张.截屏图片分辨率. iPhone4s手机 3.5I ...

  5. delphi 触摸 手势

    delphi手势,左右滑动, 控件的OnGesture事件写代码. 放一个TGestureManager控件,设置控件的touch属性为TGestureManager控件. 然后勾选控件的Touch& ...

  6. Oracle数据库备份与恢复命令

    备份:exp  用户名/密码@实例 file="e:\databack\XX_%date%.dmp" log = "e:\databack\XX8_%date%log.t ...

  7. java.io.CharConversionException: Not an ISO 8859-1 character:

    java.io.CharConversionException: Not an ISO 8859-1 character: XXX 这个问题可能是因为outputstream输出中文字造成的影响. r ...

  8. Redis 键空间通知

    [Redis 键空间通知] 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件. 以下是一些键空间通知发送的事件的例子: 所有修改键的命令. 所有接收到 ...

  9. web和wap网站的区别 (转)

    WAP的全称是“无线应用协议(Wireless Application Protocol)”,是一种向移动终端提供互联网内容和先进增值服务的全球统一的开放式协议标准, 是简化了的无线Internet ...

  10. gRPC初探——概念介绍以及如何构建一个简单的gRPC服务

    目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...