IP Socket通信实例,拿来即可用,超实用

首先看下运行效果:

工业通信中用C# TCP/IP Socket通信实例,拿来即可用,超实用

一、套接字(socket)概念

套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应 用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

二、建立socket连接

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

1、 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求 ;

//IP地址字符串转换为IPAddress

IPAddress iP = IPAddress.Parse(textBox1.Text);

//IP地址和端口号

IPEndPoint iP_EndPoint = new IPEndPoint(iP,Convert.ToInt32(textBox2.Text));

//创建socket

Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

//socket绑定IP和端口号

try

{

socket.Bind(iP_EndPoint);

socket.Listen(10);

ShowMsg("服务器开始监听...");

Thread thread_Accept = new Thread(AcceptInfo);

thread_Accept.IsBackground = true;

thread_Accept.Start(socket);

}

catch(Exception ex)

{

MessageBox.Show(ex.ToString());

}

//监听连接的客户端

private void AcceptInfo(object o)

{

Socket socket = o as Socket;

while(true)

{

try

{

Socket tSocket = socket.Accept();

string point = tSocket.RemoteEndPoint.ToString();

ShowMsg(point+"连接成功");

comboBox1.Items.Add(point);

dic.Add(point, tSocket);

Thread thread_Receive = new Thread(ReceiveMsg);

thread_Receive.IsBackground = true;

thread_Receive.Start(tSocket);

}

catch(Exception ex)

{

ShowMsg(ex.Message);

break;

}

}

}

2、客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

IPAddress iP = IPAddress.Parse(textBox5.Text);

IPEndPoint ip_EndPoint = new IPEndPoint(iP,Convert.ToInt16(textBox4.Text));

try

{

client.Connect(ip_EndPoint);

ShowMsg2("连接成功");

ShowMsg2("服务器:" + client.RemoteEndPoint.ToString());

ShowMsg2("客户端:" + client.LocalEndPoint.ToString());

Thread th = new Thread(ReceiveMsg2);

th.IsBackground = true;

th.Start(client);

}

catch(Exception ex)

{

ShowMsg2(ex.Message);

}

3、 连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户 端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

private void ReceiveMsg2(object o)

{

Socket client2 = o as Socket;

while (true)

{

try

{

byte[] buffer2 = new byte[1024 * 1024];

int n2 = client2.Receive(buffer2);

string words2 = Encoding.UTF8.GetString(buffer2, 0, n2);

ShowMsg2(client2.RemoteEndPoint.ToString() + ":" + words2);

}

catch (Exception ex)

{

ShowMsg(ex.Message);

break;

}

}

}

三、SOCKET连接与TCP连接

创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接

Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

四、完整代码较长,如需要完整代码可先关注并留言,然后私信我发送“套接字”即可自动回复,如果能帮助到你,感谢你的关注订阅,可以第一时间接收后续更新。


分享到:


相關文章: