基于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)在客户端输入一条消息发给服务器

C#编程 socket编程之tcp服务器端和客户端的更多相关文章

  1. C#编程 socket编程之udp服务器端和客户端

    基于Udp协议是无连接模式通讯,占用资源少,响应速度快,延时低.至于可靠性,可通过应用层的控制来满足.(不可靠连接) 使用Udp协议通讯需要具备以下几个条件: (1).建立一个套接字(Socket) ...

  2. Linux系统编程(32)—— socket编程之TCP服务器与客户端

    TCP协议的客户端/服务器程序的一般流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后, ...

  3. Linux系统编程(34)—— socket编程之TCP服务器与客户端的交互

    前面几篇中实现的client每次运行只能从命令行读取一个字符串发给服务器,再从服务器收回来,现在我们把它改成交互式的,不断从终端接受用户输入并和server交互. /* client.c */ #in ...

  4. linux socket编程之TCP与UDP

    转:http://blog.csdn.net/gaoxin1076/article/details/7262482 TCP/IP协议叫做传输控制/网际协议,又叫网络通信协议 TCP/IP虽然叫传输控制 ...

  5. Java Socket编程之TCP

    基于TCP的Socket通信: 服务器端: 创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 调用accept()方法开始监听,等待客户端的连接 连接建立后,通过 ...

  6. socket编程之TCP/UDP

    目标: 1.编写TCP服务端客户端,实现客户端发送数据,服务端接收打印 2.采用OOP方式编写TCP服务端客户端,实现客户端发送数据,服务端添加时间戳,返回给客户端 3.采用OOP方式编写UDP服务端 ...

  7. Linux系统编程(35)—— socket编程之TCP服务器的并发处理

    我们知道,服务器通常是要同时服务多个客户端的,如果我们运行上一篇实现的server和client之后,再开一个终端运行client试试,新的client就不能能得到服务了.因为服务器之支持一个连接. ...

  8. Linux系统编程(33)—— socket编程之TCP程序的错误处理

    上一篇的例子不仅功能简单,而且简单到几乎没有什么错误处理,我们知道,系统调用不能保证每次都成功,必须进行出错处理,这样一方面可以保证程序逻辑正常,另一方面可以迅速得到故障信息. 为使错误处理的代码不影 ...

  9. Linux系统编程(31)—— socket编程之TCP详解

    TCP有源端口号和目的端口号,通讯的双方由IP地址和端口号标识.32位序号.32位确认序号.窗口大小稍后详细解释.4位首部长度和IP协议头类似,表示TCP协议头的长度,以4字节为单位,因此TCP协议头 ...

随机推荐

  1. 如何在vue项目中引入elementUI组件

    个人博客同步文章 https://mr-houzi.com/2018/02/... 前提:已经安装好Vue 初始化vue vue init webpack itemname 运行初始化demo 运行一 ...

  2. Pandas中DataFrame数据合并、连接(concat、merge、join)之concat

    一.concat:沿着一条轴,将多个对象堆叠到一起 concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, key ...

  3. logback.xml 配置详解(转)

    <?xml version="1.0" encoding="UTF-8"> <configuration> <!-- 设置控制台日 ...

  4. zookeeper 客户端 zkCli 命令详解

    该文写的比较详细 https://blog.csdn.net/feixiang2039/article/details/79810102

  5. 【Springboot】Springboot整合Ehcache

    刚刚项目上线了,记录下使用的技术...... EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. Ehcache的特点 ( ...

  6. vue中 请求拦截 响应拦截设置

    第一,在项目的src中新建http.js文件,将以下代码复制进去 import axios from 'axios' import { Message, Loading } from 'element ...

  7. Python SMTP发送邮件Ⅱ

    使用Python发送HTML格式的邮件 Python发送HTML格式的邮件与https://www.xuanhe.net/weixiu/4271.html发送纯文本消息的邮件不同之处就是将MIMETe ...

  8. 浏览器表单自动填充默认样式 - autofill问题解决

    这不知道是个什么神仙网站,解决办法写的这么清楚,页面有这么让人舒服 https://lhajh.github.io/css/chrome/2018/04/17/The-chrome-browser-f ...

  9. SpringMVC 基础内容及使用步骤

    MVC介绍 mvc是一个众所周知的以设计界面应用程序为基础的设计模式. 它主要通过分离模型.视图及控制器在应用程序中的角色将业务编辑从界面中解耦. MVC的核心思想是将业务逻辑从界面中分离出来,允许它 ...

  10. JS基础_使用工厂方法创建对象

    创建一个对象 var obj={ name:"hhh", age:28, gender:"男", say:function(){ console.log(&qu ...