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

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

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

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

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

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

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

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

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

下面用代码实现简单的服务器---客户端通信,在此实例中两方只能收发一次消息,如果要进行多次消息,要使用到线程。

服务器端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks; namespace _021_socket编程_TCP协议 {
class Program {
static void Main(string[] args) {
// 1,创建socket
Socket tcpServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//2,绑定ip跟端口号
IPAddress ipaddress = new IPAddress(new byte[]{192,168,1,101});
EndPoint point = new IPEndPoint(ipaddress,7788);//ipendpoint是对ip+端口做了一层封装的类
tcpServer.Bind(point);//向操作系统申请一个可用的ip跟端口号 用来做通信
//3,开始监听 (等待客户端连接)
tcpServer.Listen(100);//参数是最大连接数
Console.WriteLine("开始监听"); Socket clientSocket = tcpServer.Accept();//暂停当前线程,直到有一个客户端连接过来,之后进行下面的代码
Console.WriteLine("一个客户端连接过来了");
//使用返回的socket跟客户端做通信
string message = "hello 欢迎你";
byte[] data = Encoding.UTF8.GetBytes(message);//对字符串做编码,得到一个字符串的字节数组
clientSocket.Send(data);
Console.WriteLine("向客户端发送了一条数据"); byte[] data2 = new byte[1024];//创建一个字节数组用来当做容器,去承接客户端发送过来的数据
int length = clientSocket.Receive(data2);
string message2 = Encoding.UTF8.GetString(data2, 0, length);//把字节数据转化成 一个字符串
Console.WriteLine("接收到了一个从客户端发送过来的消息:"+message2); Console.ReadKey();
}
}
}

客户端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks; namespace _001_socket编程_tcp协议_客户端 {
class Program {
static void Main(string[] args) {
//1,创建socket
Socket tcpClient = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); //2,发起建立连接的请求
IPAddress ipaddress = IPAddress.Parse("192.168.1.101");//可以把一个字符串的ip地址转化成一个ipaddress的对象
EndPoint point = new IPEndPoint(ipaddress,7788);
tcpClient.Connect(point);//通过ip:端口号 定位一个要连接到的服务器端
byte[] data = new byte[1024];
int length = tcpClient.Receive(data);//这里传递一个byte数组,实际上这个data数组用来接收数据
//length返回值表示接收了多少字节的数据
string message = Encoding.UTF8.GetString(data,0,length);//只把接收到的数据做一个转化
Console.WriteLine(message); //向服务器端发送消息
string message2 = Console.ReadLine();//读取用户的输入 把输入发送到服务器端
tcpClient.Send( Encoding.UTF8.GetBytes(message2) );//把字符串转化成字节数组,然后发送到服务器端 Console.ReadKey();
}
}
}

执行过程:

(1)首先开启服务器

(2)然后开启客户端,此时,客户端连接到服务器,收到服务器发来的消息

(3)在客户端输入一条消息发给服务器

最新文章

  1. JS对象继承篇
  2. C#上传图片
  3. SqlException 当前命令发生了严重错误 应放弃任何可能产生的结果
  4. 9.5.8 Optimizing InnoDB Disk I/O
  5. Eclipse 中引用其他项目及项目打包
  6. js实现对数据库的增删查改
  7. C++类的const成员函数、默认的构造函数、复制形参调用函数(转)
  8. ajax防止重复提交请求1
  9. 从零开始学Xamarin.Forms(二) 环境搭建、创建项目
  10. Asp.net vNext 学习1
  11. 数据库读写分离Amoeba
  12. yii2 获取从前台传过来的post数据
  13. Hdoj 1203.I NEED A OFFER! 题解
  14. centos7破解安装jira6.3.6(含Agile)
  15. 一脸懵逼学习oracle(图形化界面操作---》PLSQL图形化界面)
  16. asp.net 的三种开发模式
  17. win+R快捷启动程序
  18. C++中的break,continue和return语句小结
  19. JAVA 框架hibernate (三)(数据库更新丢失)
  20. Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2)

热门文章

  1. 10分钟搭建Kubernetes容器集群平台(kubeadm)
  2. es聚合学习笔记
  3. SQLite3的安装与使用
  4. kettle案例实现
  5. Python之列表与元组的区别详解
  6. pdf缩略图生成上传解决方案
  7. Java web分级测试评分C级感受
  8. CF1216E Numerical Sequence
  9. 树状数组(BIT)
  10. Linux添加磁盘和挂载