Socket点对点通信

简介:

前言

  Socket的英文原义是“孔”或“插座”,其实在网络编程中Socket就是这个意思,就像我们打电话,要首先知道对方的手机号一样,这个手机号就相当于一个Socket号、一个插座,在网络编程中就是ip+端口作为一个插座。

实现

  System.Net.Sockets命名空间下提供了Socket类,使.net下Socket变得很简单,Socket实现点对点通信有两种方式,一种是用服务器转接,所有的客户端都发送到服务端,客户端只做客户端;另一种是客户端是服务端又是服务端,就是既监听又发送信息。这篇就用第二种方式简单实现下,首先看下简单示意图:

  发送信息代码:

复制代码
 1   string message = txtMsg.Text.Trim();
 2   socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 3   string remoteIp = this.txtRemoteIP.Text;
 4   string remotePort = this.txtRemotePort.Text;
 5   int serverPort = Convert.ToInt32(remotePort);
 6   IPAddress serverIp = IPAddress.Parse(remoteIp);
 7   IPEndPoint remoteIep = new IPEndPoint(serverIp, serverPort);
 8   socketClient.Connect(remoteIep);
 9   toolStripStatusLabel1.Text = "与远程计算机" + remoteIp + ":" + remotePort + "建立连接!";
10 
11   byte[] byteMessage = Encoding.Default.GetBytes(message);
12   socketClient.Send(byteMessage);
13 
14   IPHostEntry host = Dns.GetHostEntry(GetServerIP());
15   string HostName = host.HostName;
16 
17   //发送信息 
18   string time1 = DateTime.Now.ToString();
19   listBox1.Items.Add(GetServerIP().ToString() + "(" + HostName + ") " + time1);
20   listBox1.Items.Add(message);
21 
22   socketClient.Shutdown(SocketShutdown.Both);
23   socketClient.Close();
复制代码

  IPEndPoint从这个单词的意思就可以看出是一个远端的地址信息,Connect方法根据这个地址建立链接,然后调用Send方法向远端发送信息,发送完信息之后要使用Shutdown指向当前Socket是否接受发送消息,下面列出SocketShutdown的枚举值:

描述

Send

禁用此 Socket 上的发送。

Receive

禁用此 Socket 上的接收。

Both

同时禁用此 Socket 上的发送和接收。

  Shutdown在msdn上解释是这样的:如果当前使用的是面向连接的Socket,则必须先调用 Shutdown 方法,然后才能关闭Socket这可以确保在已连接的套接字关闭之前,已发送和接收该套接字上的所有数据。Shutdown也是关闭的意思,其实关于Shutdown和Close我在网上找了很多资料,关于Shutdown解释的云里雾里,不是很明白,我这样理解不知道对不对,上面打电话的例子,按号码打通电话说完话按下挂机键,Shutdown的意思这样,确保信息已经发送。

  监听代码:

复制代码
 1    socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 2 
 3    IPAddress ServerIp = GetServerIP();
 4    IPEndPoint iep = new IPEndPoint(ServerIp, port);
 5    socketServer.Bind(iep);
 6 
 7    while (true)
 8    {
 9        try
10        {
11            socketServer.Listen(5);
12            allDone.Reset();
13            socketServer.BeginAccept(new AsyncCallback(AcceptCallback), socketServer);
14            allDone.WaitOne();
15        }
16        catch (SocketException ex)
17        {
18            toolStripStatusLabel1.Text += ex.ToString();
19        }
20    }
复制代码

  Bind与本机绑定开通这个“号码”以方便别人可以打进来,Listen(5)5的意思是最大的监听数,BeginAccept的意思是开始一个异步操作来接受一个传入的连接尝试,以异步方式接受连接将使您能够在单独的执行线程中发送和接收数据,回调方法使用EndAccept,并返回新的Socket对象。

复制代码
 1     //异步连接回调函数
 2     public void AcceptCallback(IAsyncResult ar)
 3     {
 4         Socket listener = (Socket)ar.AsyncState;
 5         Socket client = listener.EndAccept(ar);
 6         allDone.Set();
 7         StateObject state = new StateObject();
 8         state.workSocket = client;
 9         client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(readCallback), state);
10     }
11 
12     //异步接收回调函数
13     public void readCallback(IAsyncResult ar)
14     {
15         StateObject state = (StateObject)ar.AsyncState;
16         Socket handler = state.workSocket;
17         int bytesRead = handler.EndReceive(ar);
18         if (bytesRead > 0)
19         {
20             string strmsg = Encoding.Default.GetString(state.buffer, 0, bytesRead);
21 
22             //远端信息
23             EndPoint tempRemoteEP = handler.RemoteEndPoint;
24             IPEndPoint tempRemoteIP = (IPEndPoint)tempRemoteEP;
25             IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address);
26             string HostName = host.HostName;
27 
28             string ip = tempRemoteIP.Address.ToString() + "(" + HostName + ") " + DateTime.Now.ToString();
29             if (listBox1.InvokeRequired)
30             {
31                 MyDelegate md;
32                 md = new MyDelegate(ChangeText);
33                 listBox1.Invoke(md, ip, strmsg);
34             }
35         }
36     }
复制代码

  listener.EndAccept(ar)和handler.EndReceive(ar)取回远端Socket对象,这边注意下获取IPHostEntry对象并不是用GetHostEntry方法,而是GetHostByAddress方法,使用GetHostEntry方法会产生异常,异步调用传输对象StateObject:

复制代码
1      //异步传递的状态对象
2     public class StateObject
3     {
4         public Socket workSocket = null;
5         public const int BufferSize = 1024;
6         public byte[] buffer = new byte[BufferSize];
7     }
复制代码

  运行截图:

  完整代码:

  View Code

  程序下载:Socket点对点通信.rar

  附录:小菜学习编程-Winform系列(初学者)

 



本文转自田园里的蟋蟀博客园博客,原文链接:http://www.cnblogs.com/xishuai/p/3540200.html,如需转载请自行联系原作者

相关文章
|
3月前
|
缓存 监控 Java
Java Socket编程最佳实践:优化客户端-服务器通信性能
【6月更文挑战第21天】Java Socket编程优化涉及识别性能瓶颈,如网络延迟和CPU计算。使用非阻塞I/O(NIO)和多路复用技术提升并发处理能力,减少线程上下文切换。缓存利用可减少I/O操作,异步I/O(AIO)进一步提高效率。持续监控系统性能是关键。通过实践这些策略,开发者能构建高效稳定的通信系统。
116 1
|
1月前
|
Python
python socket 简单通信
python socket 简单通信
34 1
|
25天前
|
网络协议 安全 网络安全
网络编程:基于socket的TCP/IP通信。
网络编程:基于socket的TCP/IP通信。
125 0
|
3月前
|
Java 应用服务中间件 开发者
【实战指南】Java Socket编程:构建高效的客户端-服务器通信
【6月更文挑战第21天】Java Socket编程用于构建客户端-服务器通信。`Socket`和`ServerSocket`类分别处理两端的连接。实战案例展示了一个简单的聊天应用,服务器监听端口,接收客户端连接,并使用多线程处理每个客户端消息。客户端连接服务器,发送并接收消息。了解这些基础,加上错误处理和优化,能帮你开始构建高效网络应用。
282 10
|
3月前
|
IDE Java 开发工具
从零开始学Java Socket编程:客户端与服务器通信实战
【6月更文挑战第21天】Java Socket编程教程带你从零开始构建简单的客户端-服务器通信。安装JDK后,在命令行分别运行`SimpleServer`和`SimpleClient`。服务器监听端口,接收并回显客户端消息;客户端连接服务器,发送“Hello, Server!”并显示服务器响应。这是网络通信基础,为更复杂的网络应用打下基础。开始你的Socket编程之旅吧!
44 3
|
3月前
|
Java 数据挖掘 开发者
Java网络编程进阶:Socket通信的高级特性与应用
【6月更文挑战第21天】Java Socket通信是分布式应用的基础,涉及高级特性如多路复用(Selector)和零拷贝,提升效率与响应速度。结合NIO和AIO,适用于高并发场景如游戏服务器和实时数据分析。示例展示了基于NIO的多路复用服务器实现。随着技术发展,WebSockets、HTTP/2、QUIC等新协议正变革网络通信,掌握Socket高级特性为应对未来挑战准备。
34 1
|
3月前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
76 0
|
3月前
|
安全 Java 网络安全
Java Socket编程教程:构建安全可靠的客户端-服务器通信
【6月更文挑战第21天】构建安全的Java Socket通信涉及SSL/TLS加密、异常处理和重连策略。示例中,`SecureServer`使用SSLServerSocketFactory创建加密连接,而`ReliableClient`展示异常捕获与自动重连。理解安全意识,如防数据截获和中间人攻击,是首要步骤。通过良好的编程实践,确保网络应用在复杂环境中稳定且安全。
77 0
|
4天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【9月更文挑战第14天】网络协议是机器间交流的约定格式,确保信息准确传达。主要模型有OSI七层与TCP/IP模型,通过分层简化复杂网络环境。IP地址全局定位设备,MAC地址则在本地网络中定位。网络分层后,数据包层层封装,经由不同层次协议处理,最终通过Socket系统调用在应用层解析和响应。
|
22天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【8月更文挑战第27天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。