基于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 3.0 常见集群的搭建(主从复制,副本集,分片....)

      一.mongodb主从复制配置 主从复制是mongodb最常用的复制方式,也是一个简单的数据库同步备份的集群技术,这种方式很灵活.可用于备份,故障恢复,读扩展等. 最基本的设置方式就是建立一个主节 ...

  2. 关于sqoop --split-by 及 -m的理解

    场景: sqoop import --connect jdbc:postgresql://...../..... --username ....  --query "select * fro ...

  3. django-连接数据库及创建表,已存字段的增删

    连接数据库 配置文件settings DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 你的数据库引擎 'HOST' ...

  4. Vim中nerdtree配置

    nerdtree nerdtree,就是一个文件树目录. 配置脚本 "文件树 Plug 'scrooloose/nerdtree' Plug 'Xuyuanp/nerdtree-git-pl ...

  5. Workgroup&Domain(Realm)

    [工作组 Work Group] 在一个网络内,可能有成百上千台电脑,如果这些电脑不进行分组,都列在“网上邻居”内,可想而知会有多么乱.为了解决这一问题,Windows 9x/NT/2000就引用了“ ...

  6. token的作用及实现原理

    1:首先,先了解一下request和session的区别request 指在一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应的整个过程,存放在HttpServletRequest对象 ...

  7. new Class{}形式

    先看下面代码 Test.java public class Test { public static void main(String[] args) { A a=new A() { @Overrid ...

  8. C#中释放数据库连接资源

    1.确保释放数据库连接资源的两种方式如下:   a.使用try...catch...finally语句块,在finally块中关闭连接:   b.使用using语句块,无论如何退出,都会自动关闭连接: ...

  9. 18-(unicode error) 'unicodeescape' codec can't decode bytes in position 16-17: truncated \uXXXX escape

    读取文件时碰到问题: 1.(unicode error) 'unicodeescape' codec can't decode bytes in position 16-17: truncated \ ...

  10. 洛谷 P2899 [USACO08JAN]手机网络Cell Phone Network(树形动规)

    题目描述 Farmer John has decided to give each of his cows a cell phone in hopes to encourage their socia ...