4.socket(-)之控制台
一Socket介绍:
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
Socket在英文原意椒"孔"或者"插座",作为BSD UNIX ,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
--------说一个简单的例子
大学里男生要去找自己的女朋友,但是女朋友在宿舍,他又没有手机,因为是女生宿舍男生又不能直接去找女生。他只能通过宿舍阿姨去联系女生。这个阿姨就是Socket。男生女生通过阿姨进行通信。在或者我们打电话和别人联系。手机也是。
在来看看我代码里的Socket 做了哪些处理。
鄙人不才,画了这个么一个图。
大致意思就是客户端有一个Socket对象,向服务端发送请求。服务端有一个专门负责监听的Socket,监听的Socket监听到了有请求的时候就会为这个请求创建一个与之对应通信的Socket进行通信。
接下来讲讲Socket类
public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);
首先看看Socket类的构造函数的三个参数。
AddressFamily 这个参数制定了寻找地址的方案。Socket通过他确定如果解析地址,比如地址设置了IPv4,Socket就会通过Ipv4的规则去解析地址,如果是IPV6就会通过Ipv6规则去解析地址。
AddressFamily 这个枚举的具体有哪些值可以看MSDN。这里附上传送门----->点击这里
SocketType 这个参数看名字就是知道干啥用了。Socke Type 就是设置Socket类型,这个参数是与最后一个参数有关联。这里附上传送门------->点击这里 protocolType 这个参数设置Socket之间的通信协议,就是通信规则,就是类似抗战时期地下工作都有暗号一样。天王盖地虎,宝塔侦镇河妖,只有口号对上了才是自己人,他们都有自己的规则。
Socket也一样,也需要规定一种口号,一种协议。常见有TCP协议,和UDP协议。这里附上传送门------->点击这里
注意:SocketType 有时会隐式指示在 AddressFamily 中使用哪个 ProtocolType。例如,当 SocketType 为 Dgram 时,ProtocolType 始终为 Udp。当 SocketType 为 Stream 时,ProtocolType 始终为 Tcp。如果试图使用不兼容的组合创建 Socket,则 Socket 将引发 SocketException。
下面开始掏出一手代码进行说明了
服务端代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace SocketTest
{
class Program
{
static void Main(string[] args)
{
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;
IPEndPoint point = new IPEndPoint(ip, );//设置Socket服务端接受请求的Ip和服务端的端口号
socketWatch.Bind(point);//进行绑定
Console.WriteLine("正在监听中。。。。。");
Thread therad = new Thread(listen);
socketWatch.Listen();
therad.Start(socketWatch); }
static void listen(object obj)
{
Socket socket = obj as Socket;
while (true)
{
//等待请求返回,并且创建一个与客户端通信的请求(如果这句话写在主线程里,而且没有请求过来,主线程会卡死,因为它会一直等待)
Socket socketsend = socket.Accept(); //socketsend.RemoteEndPoint 或者请求的Ip地址
Console.WriteLine(socketsend.RemoteEndPoint.ToString() + "已经连接上来啦");
byte[] byte0 = new byte[ * ];
int count = socketsend.Receive(byte0);
string str = Encoding.UTF8.GetString(byte0);
Console.WriteLine("收到客户端"+ socketsend.RemoteEndPoint.ToString()+"发来的小时:"+str); //测试用For循环发三次消息给已经连接的客户端
for (int i = ; i < ; i++)
{
string sMsg = "我是服务端,你已经连接上来了,重要的事情说三遍";
byte[] bytes = Encoding.UTF8.GetBytes(sMsg);
socketsend.Send(bytes); //Send方法是发送消息
Thread.Sleep();
} }
}
}
}
客户端代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace SocketClient
{
class Program
{
static void Main(string[] args)
{
Socket socketclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //设置连接服务端的Ip
IPAddress address = IPAddress.Parse("127.0.0.1"); //设置连接服务端的端口
IPEndPoint point = new IPEndPoint(address, ); //连接
socketclient.Connect(point);
byte[] arrRecvmsg = new byte[ * ];
arrRecvmsg = Encoding.UTF8.GetBytes("我是客户端,我要连接你!!"); //发送消息
socketclient.Send(arrRecvmsg);
Console.WriteLine("正在连接服务端"); //开启线程接受消息
Thread th = new Thread(GetMessage);
th.Start(socketclient);
Console.ReadKey();
}
static void GetMessage(object obj)
{
byte[] arrRecvmsg = new byte[*];
Socket socketclient = obj as Socket;
while (true)//开启循环 一直读取客户端发来的消息
{
int length = socketclient.Receive(arrRecvmsg);//读取消息
string str = Encoding.UTF8.GetString(arrRecvmsg, , length);
Console.WriteLine("收到服务端发来的消息:"+str);
} }
}
}
运行效果
OK!简单应用就是这样啦。以上代码是学习的Demo,不能用于实际应用,只能用来学习,实际应用要复杂的很多。
由于本人也是渣渣菜鸟,以上可叙述可能有错误。如有发现,还请告之。
大家一起学习进步。
4.socket(-)之控制台的更多相关文章
- Java多线程Socket在控制台输出的多人聊天室编程
服务器端代码 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java ...
- AutoCAD.net支持后台线程-Socket服务端
最近因为公司项目的需求,CAD作为服务端在服务器中常驻运行,等待客户端远程发送执行任务的指令,最终确认用Socket-tcp通讯,CAD需要实时监听客户端发送的消息,这时就需要开启线程执行Socket ...
- AutoCAD.net支持后台线程-Socket通讯
最近因为公司项目的需求,CAD作为服务端在服务器中常驻运行,等待客户端远程发送执行任务的指令,最终确认用Socket-tcp通讯,CAD需要实时监听客户端发送的消息,这时就需要开启线程执行Socket ...
- TCP/IP以及Socket对象基本
1 OSI七层模型概念介绍 物理层:数据以比特的方式进行传递,典型的设备是集线器.该层主要规定了设备的电压或者端口等等一些列物理层面上的规定 数据链路层:该层数据以帧的方式进行传递,主要是两个 ...
- 7.Sentinel源码分析—Sentinel是怎么和控制台通信的?
这里会介绍: Sentinel会使用多线程的方式实现一个类Reactor的IO模型 Sentinel会使用心跳检测来观察控制台是否正常 Sentinel源码解析系列: 1.Sentinel源码分析-F ...
- Qt之QTextCodec乱谈
何处开始呢? 一旦在Qt程序中出现latin1字符集以外的字符,几乎大家无一例外的会用到 QTextCodec. 而不少网友不分青红皂白,一旦用到中文,就同时使用下面3条指令(其中textc 取为 g ...
- 长期更新系列:C#知识点
PS:写这个主要是基础差,写这么一个主要是为了自己查漏补缺,不会的搞会了.会了搞的更会.顺便整理知识. 目录 1.C#知识点:值类型和引用类型 2.C#知识点:I/0 3.C#知识点:is和as 4. ...
- AOSP 源码整编单编
<AOSP 源码下载>完成后,就可以开编了. 整编 整编,顾名思义就是编译整个 Android 源码,最终 out 目录会生成几个重要的镜像文件,其中有 system.img.userda ...
- qt学习(三):鼠标图标改变
qt学习 (三):鼠标图标改变 当你进入一个美好的qt软件场景,比如游戏,电脑的黑白图标会让程序逊色不少, 1改图标要加光标的头文件, 2 载入光标图, 3 再设置改光标就可以了 1在头文件中加 #i ...
随机推荐
- .net core部署到linux可能碰到的问题
缺少icu库以独立部署 (SCD)的方式发包,运行时报错错误信息:FailFast: Couldn't find a valid ICU package installed on the system ...
- [翻译]第三天- 在 Mac 上运行 .NET Core 应用程序
原文: http://michaelcrump.net/part3-aspnetcore/ *** 简介 该系列文章的完整列表如下: 第一天 - 在 Windows 下安装和运行 .NET Core ...
- WPF学习笔记(5):两个DataGrid的滚动条实现同步滚动
效果:两个DataGrid的滚动条实现同步滚动. 代码参考了博客园chuncn的文章<.net中同步多个ScrollViewer滚动的四种方法>,原文是针对ListBox的.现改为针对Da ...
- 【转】「Chris Richardson 微服务系列」微服务架构的优势与不足
Posted on 2016年5月4日 编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第一篇,主要探讨了传统的单体式应用的不足,以及微服务架构的优势与挑战. 作者介绍:Chris Ric ...
- Android逆向进阶—— 脱壳的奥义(基ART模式下的dump)
本文作者:i春秋作家HAI_ZHU 0×00 前言 市面上的资料大多都是基于Dalvik模式的dump,所以这此准备搞一个ART模式下的dump.HAI_的使用手册(各种好东西) Dalvik模式是A ...
- windows中eclipse调试hadoop
下载eclipse:https://www.eclipse.org/downloads/eclipse-packages 下载hadoop eclipse插件:https://github.com/w ...
- mybatis 控制台打印执行的SQL语句
1. Spring boot 集成 mybatis [转载]SpringBoot中Mybatis打印sql 1.1 如果使用的是application.properties文件,加入如下配置: log ...
- Vue + Bootstrap 制作炫酷个人简历(二)
没想到隔了这么久才来更新. 用vue做简历,不是非常适合,为什么呢. 因为简历没什么数据上的操作,一般都是静态的内容. 不过都说了用Vue来做,也只能强行续命了. 这里是我做好的成品 非一般简历 由 ...
- 【转】如何用css限制文字长度,使溢出的内容用省略号…显示
文章转自这里(现在貌似被黑了,建议不要点击了) ps:因在该地方没看到转载按钮,复制下存到这里以待自己方便,别人能看到帮助一下更是乐意之至,效果亲测可以实现,兼容IE.谷歌.火狐 由于文字内容长度的不 ...
- python学习笔记11-文件操作方法
f=open("1.txt","r",encoding='utf-8') # a=f.readline() print(a) #光标会移动 下面两者结果不一样 ...