什么是Socket呢?
Socket是应用层与TCP/IP协议通信的中间的抽象层,它是一组接口。在设计模式中Socket把复杂的TCP/IP协议隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。就比如电话机可以同时拿来拨打或者接听,但对Socket来说拨打或者监听是有区别的。
先来说清楚接听套接字创建过程。
- 安装电话机(调用socket函数)
- 通过绑定电话号码进行通话(调用bind函数)
- 只有连接电话线之后才能进行通话(调用Listen函数)
- 拿起话筒进行通话(调用accept函数)
网络编程中接受连接请求套接字创建过程如下
- 调用socket函数创建套接字
- 调用bind函数分配IP地址和端口号
- 调用listen函数转为可接受请求状态
- 调用accept函数受理连接请求
打电话套接字创建过程比较简单直接进行说明
- 调用Socket函数创建套接字
- 调用connection向服务器发送请求
通过上面讲解可以了解程序分为两大部分,第一部分创建服务器,第二部分创建客户端。
客户端界面如下:
服务器端界面如下
在这里说明程序实现的功能:客户端可以向服务器发送消息,服务器可以向指定的客户端发送消息,实现通信。
在显示代码之前说明重要的步骤:
- 服务器通过死循环不停接受从客户端发来的消息。
- 只有UI线程才可以操控UI元素。
服务器端代码如下
namespace Sever
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
static List<Socket> sockets = new List<Socket>();
public MainWindow()
{
InitializeComponent();
}
//监听客户端发来的请求 socketWatch为监听 secketSend为通信
Socket socketSend;
//根据IP地址寻扎Socket
Dictionary<string, Socket> disSocket = new Dictionary<string, Socket>();
private void Button_Click(object sender, RoutedEventArgs e)
{
try {
IPAddress ip = IPAddress.Any;
//当开始监听时候,在服务器创建一个负责IP地址跟端口号的Socket
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
//监听
socketWatch.Bind(point);
ShowMsg("监听成功");
socketWatch.Listen(10);
Thread th = new Thread(ListenClickConnect);
th.IsBackground = true;
th.Start(socketWatch);
}
catch { }
}
publi