浅谈TCP通讯
基于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通讯的更多相关文章
- 浅谈TCP IP协议栈(三)路由器简介
读完这个系列的第一篇浅谈TCP/IP协议栈(一)入门知识和第二篇浅谈TCP/IP协议栈(二)IP地址,在第一篇中,可能我对协议栈中这个栈的解释有问题,栈在数据结构中是一种先进后出的常见结构,而在整个T ...
- 浅谈 TCP、IP、DNS 和 HTTP 的关系
一.浅谈三个协议的基本概念 1.IP 协议 按层次分,IP网际协议位于网络层,几乎所有的网络的系统都会用到 IP 协议,其重要性非同一般.IP 协议作用就是把各种数据包传送给对方,对方的地址就要看其 ...
- 浅谈TCP/IP网络编程中socket的行为
我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...
- 浅谈TCP优化
原文地址:http://kb.cnblogs.com/page/197406/ 很多人常常对TCP优化有一种雾里看花的感觉,实际上只要理解了TCP的运行方式就能掀开它的神秘面纱.Ilya Grigor ...
- 浅谈TCP优化(转)
很多人常常对TCP优化有一种雾里看花的感觉,实际上只要理解了TCP的运行方式就能掀开它的神秘面纱.Ilya Grigorik 在「High Performance Browser Networking ...
- 浅谈tcp粘包问题
第一部分:简介tcp socket通信的底层原理 原理解析图: socket通信过程如图所示:首先客户端将发送内容通过send()方法将内容发送到客户端计算机的内核区,然后由操作系统将内容通过底层路径 ...
- 浅谈TCP IP协议栈(一)入门知识【转】
说来惭愧,打算写关于网络方面的知识很久了,结果到今天才正式动笔,好了,废话不多说,写一些自己能看懂的入门知识,对自己来说是一种知识的总结,也希望能帮到一些想了解网络知识的童鞋. 万事开头难,然后中间难 ...
- 浅谈TCP协议,总算明白它是干什么的了
一.什么是TCP,他是干什么的? TCP即传输控制协议(Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通讯协议. TCP是为了在不可靠的互联网 ...
- 面试:浅谈tcp/udp
tcp是一种面向连接的.可靠的.基于字节流的传输层通信协议.是专门为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的,面向字节流. udp(用户数据报协议)是iso参考模型中一种无连接的传输层 ...
随机推荐
- 高斯白噪声(white Gaussian noise,WGN)
本文科普一下高斯白噪声(white Gaussian noise,WGN). 百度百科上解释为“高斯白噪声,幅度分布服从高斯分布,功率谱密度服从均匀分布”,听起来有些晦涩难懂,下面结合例子通俗而详细地 ...
- php遍历所有文件
<?php function getdir($dir){ static $str = ''; if(is_file($dir)){ $str.=$dir.'<br>'; }else{ ...
- eclipse中debug改变变量的值
step1:debug断点到变量的下一行,在debug试图的右上角variables中看到该变量的值: step2:鼠标右键点击str出现下图,选择Change Value... step3:点击Ch ...
- Multipart polyline to single part lines
Breaking Up Polylines http://forums.esri.com/Thread.asp?c=93&f=987&t=74554&mc=4#msgid19 ...
- SpringMVC 执行流程
- 带入gRPC:gRPC Streaming, Client and Server
带入gRPC:gRPC Streaming, Client and Server 原文地址:带入gRPC:gRPC Streaming, Client and Server 前言 本章节将介绍 gRP ...
- An Introduction To Value at Risk (VAR)
http://www.investopedia.com/articles/04/092904.asp http://www.jpmorgan.com/tss/General/email/1159360 ...
- 【git使用】Failed to connect to 127.0.0.1 port 1080: Connection refused
查询是否使用代理:git config --global http.proxy 取消代理:git config --global --unset http.proxy
- [IIS] 测试的产品登陆之后有个引用外部站点js的请求半天都无法返回,导致网页一直在打转,Selenium的driver也无法对页面进行下一步的操作
测试的产品登陆之后有个引用外部站点js的请求半天都无法返回: https://cdn.heapanalytics.com/js/heap-3497400264.js 这个js如果是在美国的机器上就可以 ...
- [Selenium]计算坐标进行拖拽,重写dragAndDropOffset
//@author jzhang6 public void dragAndDropOffset(WebDriver driver,WebElement dragableEl, WebElement d ...