<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Socket是应用层与TCP/IP协定族通讯的中间软体抽象层,它是一组介面。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协定族隐藏在Socket介面后面,对用户来说,一组简单的介面就是全部,让Socket去组织资料,以符合指定的协定。所以,我们无需深入理解tcp/udp协定,socket已经为我们封装好了,我们只需要遵循socket的规定去程式设计,写出的程式自然就是遵循tcp/udp标准的。
先从伺服器端说起。伺服器端先初始化Socket,然后与埠系结(bind),对埠进行监听(listen),呼叫accept阻塞,等待用户端连线。在这时如果有个用户端初始化一个Socket,然后连线伺服器(connect),如果连线成功,这时用户端与伺服器端的连线就建立了。用户端传送资料请求,伺服器端接收请求并处理请求,然后把回应资料传送给用户端,用户端读取资料,最后关闭连线,一次互动结束。
private void btnListen_Click(object sender, EventArgs e) { IPEndPoint point = new IPEndPoint(IPAddress.Any, 13000);//IPAddress.Any本机任何网络卡IP。本机埠检视netstat -an //伺服器端Socket定义 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(point); //系结IP socket.Listen(10);//启动监听。最大监听数,同一个时间点过来10个用户端,排队 ShowMsg("伺服器开始监听"); Thread thread = new Thread(AcceptInfo); thread.Start(socket); } //记录通讯用的Socket Dictionary<string, Socket> dic = new Dictionary<string, Socket>(); // private Socket client; void AcceptInfo(object o) { Socket socket = o as Socket; while (true) { //通讯用socket try { Socket clientSocket = socket.Accept();//如果用户端有请求,生成一个新的Socket string point = clientSocket.RemoteEndPoint.ToString(); ShowMsg(point + "连线用户端成功!"); dic.Add(point, clientSocket); //接收讯息 Thread th = new Thread(ReceiveMsg); th.Start(clientSocket); } catch (Exception ex) { break; } } socket.Close(); } //接收讯息 void ReceiveMsg(object socket) { Socket clientSocket = socket as Socket; while (true) { //接收用户端传送过来的资料 try { //定义byte阵列存放从用户端接收过来的资料 byte[] buffer = new byte[1024 * 1024]; int n = clientSocket.Receive(buffer);//将接收过来的资料放到buffer中,并返回实际接受资料的长度 //将位元组转换成字串 string words = Encoding.Unicode.GetString(buffer, 0, n); Console.WriteLine(clientSocket.RemoteEndPoint.ToString() + ":" + words); byte[] msg = Encoding.Unicode.GetBytes(words); clientSocket.Send(msg);//传送资料,位元组阵列 } catch (Exception ex) { break; } } clientSocket.Shutdown(SocketShutdown.Both);//禁止传送和接受资料 clientSocket.Close();//关闭socket,释放资源 }
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint point = new IPEndPoint("127.0.0.1", 13000));//连线到的伺服器端IP clientSocket.Connect(point);//连线到伺服器 ShowMsg("连线成功"); ShowMsg("伺服器" + client.RemoteEndPoint.ToString()); ShowMsg("用户端:" + client.LocalEndPoint.ToString()); Thread th = new Thread(ReceiveMsg);//连线成功后,就可以接收伺服器传送的资讯了 th.IsBackground = true; th.Start(); clientSocket.Shutdown(SocketShutdown.Both);//禁止传送和接受资料 clientSocket.Close();//关闭socket,释放资源
名称 | 说明 |
---|---|
AddressFamily | 获取 Socket 的地址族。 |
Available | 获取已经从网路接收且可供读取的资料量。 |
Blocking | 获取或设定一个值,该值指示 Socket 是否处于阻止模式。 |
Connected | 获取一个值,该值指示 Socket 是在上次 Send 还是 Receive 操作时连线到远端主机。 |
Handle | 获取 Socket 的作业系统控制代码。 |
LocalEndPoint | 获取本地终结点。 |
RemoteEndPoint | 获取远端终结点。 |
ProtocolType | 获取 Socket 的协定型别。 |
SocketType | 获取 Socket 的型别。 |
ReceiveBufferSize | 获取或设定一个值,它指定 Socket 接收缓冲区的大小。 |
ReceiveTimeout | 获取或设定一个值,该值指定之后同步 Receive 呼叫将超时的时间长度。 |
SendBufferSize | 获取或设定一个值,该值指定 Socket 传送缓冲区的大小。 |
SendTimeout | 获取或设定一个值,该值指定之后同步 Send 呼叫将超时的时间长度。 |
Accept
名称 | 说明 |
---|---|
Accept() | 为新建连线建立新的 Socket。 |
BeginAccept(AsyncCallback, Object) | 开始一个非同步操作来接受一个传入的连线尝试。 |
EndAccept(Byte[], IAsyncResult) | 非同步接受传入的连线尝试,并建立新的 Socket 物件来处理远端主机通讯。 此方法返回包含所传输的初始资料的缓冲区。 |
AcceptAsync(SocketAsyncEventArgs) | 开始一个非同步操作来接受一个传入的连线尝试。 |
Connect
名称 | 说明 |
---|---|
Connect(EndPoint) | 与远端主机建立连线。 |
BeginConnect(EndPoint, AsyncCallback, Object) | 开始一个对远端主机连线的非同步请求。 |
EndConnect(IAsyncResult) | 结束挂起的非同步连线请求。 |
ConnectAsync(SocketAsyncEventArgs) | 开始一个对远端主机连线的非同步请求。 |
Disconnect
名称 | 说明 |
---|---|
Disconnect(Boolean) | 关闭通讯端连线并允许重用通讯端。 |
BeginDisconnect(Boolean, AsyncCallback, Object) | 开始非同步请求从远端终结点断开连线。 |
EndDisconnect(IAsyncResult) | 结束挂起的非同步断开连线请求。 |
DisconnectAsync(SocketAsyncEventArgs) | 关闭通讯端连线并允许重用通讯端。 |
Receive
名称 | 说明 |
---|---|
Receive(Byte[]) | 从系结的 Socket 通讯端接收资料,将资料存入接收缓冲区。 |
BeginReceive(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object) | 开始从连线的 Socket 中非同步接收资料。 |
EndReceive(IAsyncResult) | 结束挂起的非同步读取。 |
ReceiveAsync(SocketAsyncEventArgs) | 开始一个非同步请求以便从连线的 Socket 物件中接收资料。 |
ReceiveFrom
名称 | 说明 |
---|---|
ReceiveFrom(Byte[], EndPoint) | 将资料包接收到资料缓冲区并储存终结点。 |
BeginReceiveFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object) | 开始从指定网路装置中非同步接收资料。 |
EndReceiveFrom(IAsyncResult, EndPoint) | 结束挂起的、从特定终结点进行非同步读取。 |
ReceiveFromAsync(SocketAsyncEventArgs) | 开始从指定网路装置中非同步接收资料。 |
ReceiveMessageFrom
名称 | 说明 |
---|---|
ReceiveMessageFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, IPPacketInformation) | 使用指定的 SocketFlags 将指定位元组数的资料接收到指定的资料缓冲区位置,并储存终结点和封包资讯。 |
BeginReceiveMessageFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object) | 开始使用指定的 SocketFlags 将指定位元组数的资料非同步接收到资料缓冲区的指定位置,然后储存终结点和封包资讯。 |
EndReceiveMessageFrom(IAsyncResult, SocketFlags, EndPoint, IPPacketInformation) | 结束挂起的、从特定终结点进行非同步读取。 此方法还显示有关封包而不是 EndReceiveFrom(IAsyncResult, EndPoint) 的更多资讯。 |
ReceiveMessageFromAsync(SocketAsyncEventArgs) | 开始使用指定的 SocketFlags 将指定位元组数的资料非同步接收到资料缓冲区的指定位置,并储存终结点和封包资讯。 |
Send
名称 | 说明 |
---|---|
Send(Byte[]) | 将资料传送到连线的 Socket。 |
BeginSend(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object) | 将资料非同步传送到连线的 Socket。 |
EndSend(IAsyncResult) | 结束挂起的非同步传送。 |
SendAsync(SocketAsyncEventArgs) | 将资料非同步传送到连线的 Socket 物件。 |
SendFile
名称 | 说明 |
---|---|
SendFile(String) | 使用 Socket 传输标志,将档案 fileName 传送到连线的 UseDefaultWorkerThread 物件。 |
BeginSendFile(String, AsyncCallback, Object) | 使用 Socket 标志,将档案 fileName 传送到连线的 UseDefaultWorkerThread 物件。 |
EndSendFile(IAsyncResult) | 结束档案的挂起非同步传送。 |
SendTo
名称 | 说明 |
---|---|
SendTo(Byte[], EndPoint) | 将资料传送到指定的终结点。 |
BeginSendTo(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object) | 以非同步方式将资料传送到特定远端主机。 |
EndSendTo(IAsyncResult) | 结束挂起的、向指定位置进行的非同步传送。 |
SendToAsync(SocketAsyncEventArgs) | 以非同步方式将资料传送到特定远端主机。 |
其它
名称 | 说明 |
---|---|
Select(IList, IList, IList, Int32) | 确定一个或多个通讯端的状态。 |
SendPacketsAsync(SocketAsyncEventArgs) | 将档案集合或者记忆体中的资料缓冲区以非同步方法传送给连线的 Socket 物件。 |
Bind(EndPoint) | 使 Socket 与一个本地终结点相关联。 |
Listen(Int32) | 将 Socket 置于侦听状态。 |
CancelConnectAsync(SocketAsyncEventArgs) | 取消一个对远端主机连线的非同步请求。 |
GetSocketOption(SocketOptionLevel, SocketOptionName) | 返回指定的 Socket 选项的值,表示为一个物件。 |
SetSocketOption(SocketOptionLevel, SocketOptionName, Boolean) | 将指定的 Socket 选项设定为指定的 Boolean 值。 |
SetIPProtectionLevel(IPProtectionLevel) | 设定通讯端的 IP 保护级别。 |
Shutdown(SocketShutdown) | 禁用某 Socket 上的传送和接收。 |
Close() | 关闭 Socket 连线并释放所有关联的资源。 |
Dispose() | 释放 Socket 类的当前范例所使用的所有资源。 |
到此这篇关于C#之Socket(通讯端)通讯的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45