基于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. (翻译)React Container Components

    原文:Container Components Container Components 在 React 模式上对我的代码有最深远影响的一个模式叫 container component 模式. 在 ...

  2. leetcode205

    public class Solution { public bool IsIsomorphic(string s, string t) { if (s.Length != t.Length) { r ...

  3. 一行代码让App运行时iPhone不会进入锁屏待机状态

    转自:http://www.cocoachina.com/iphonedev/sdk/2010/1028/2260.html 如果你不希望应用运行时 iPhone 进入锁屏待机状态,加入下面这行代码即 ...

  4. js 实现 一张图片的上传

    .js进行图片预览 使用input标签来选择图片,使用FileReader读取图片并转成base64编码,然后发送给服务器. <html> <body> <img id= ...

  5. tomcat加固

    tomcat安全加固和规范 tomcat是一个开源Web服务器,基于Tomcat的Web运行效率高,可以在一般的硬件平台上流畅运行,因此,颇受Web站长的青睐.不过,在默认配置下其存在一定的安全隐患, ...

  6. 对象的notify方法的含义和对象锁释放的三种情况

    1,notify的含义     (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...

  7. idea 插件

    https://plugins.jetbrains.com/plugin/4509-statistic

  8. php7源码编译安装

    以下以CentOS 7.2为例,安装php的运行环境,首先打开php官网http://php.net/点击导航栏的Downloads进入下载页面:http://php.net/downloads.ph ...

  9. 数论知识总结——史诗大作(这是一个flag)

    1.快速幂 计算a^b的快速算法,例如,3^5,我们把5写成二进制101,3^5=3^1*1+3^2*2+3^4*1 ll fast(ll a,ll b){ll ans=;,a=mul(a,a)))a ...

  10. OGNL概述

    -------------------siwuxie095 OGNL 概述 1.OGNL 即 Object-Graph Navigation Language,对象图导航语言, 它是一个应用于 Jav ...