https://www.cnblogs.com/wangcq/p/3520400.html socket通信原理。
Socket 是在 C#
使用Socket通信 一般有3步;
服务端:
1,建立Socket
2.Bind Ip端口
3.开始监听
4.等待客服端链接()
客服端
1. 建立Socket
2. 链接 主机(connect)
3. send(Receive)
服务端:
这里的Ip为你的IP地址 端口随便,只要计算机没有占用的就OK
EndPoint endPoint = new IPEndPoint(IPAddress.Parse("xxx.xx.xxx.xxx"),7788);
TcpSocket.Bind(endPoint);
static void Main(string[] args)
{
//1 创建socket
Socket TcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2 绑定ip
//这里的Ip为你的IP地址 端口随便,只要计算机没有占用的就OK
EndPoint endPoint = new IPEndPoint(IPAddress.Parse("xxx.xx.xxx.xxx"),7788);
TcpSocket.Bind(endPoint);
//3 开始 监听
TcpSocket.Listen(100);
Console.WriteLine("服务端启动,开始监听");
Socket client = TcpSocket.Accept();
Console.WriteLine("链接进来了一个客服端");
client.Send(Encoding.UTF8.GetBytes("服务器:您好,我是服务器!"));
byte[] data = new byte[1024];
int length = client.Receive(data);
Console.WriteLine("来自客服端的消息"+Encoding.UTF8.GetString(data, 0, length));
}
EndPoint 是标识网络地址。 这是一个 abstract 类。
IPEndPoint是 它 的子类,
最大端口是65535
最小是0
两个 构造函数 体
他有三个方法 2个构造函数 ,两个构造函数里的参数 都差不多一个意思,只是类型不一样,
第一个参数都是Ip地址,第二个都是端口。
IPAddress 是 提供 Internet 协议 (IP) 地址。
IPv6和IPv4的区别https://zhidao.baidu.com/question/113756183.html
/ /摘要: public Socket Accept();
// 创建一个新 System.Net.Sockets.Socket 为新创建的连接。
//
// 返回结果:
// 一个 System.Net.Sockets.Socket 为新创建的连接。
//
// 异常:
// T:System.Net.Sockets.SocketException:
// 尝试访问套接字时出错。 有关详细信息,请参阅备注部分。
//
// T:System.ObjectDisposedException:
// System.Net.Sockets.Socket 已关闭。
//
// T:System.InvalidOperationException:
// 接受套接字不侦听连接。 必须调用 System.Net.Sockets.Socket.Bind(System.Net.EndPoint) 和 System.Net.Sockets.Socket.Listen(System.Int32)
// 之前调用 System.Net.Sockets.Socket.Accept。
Socket client = TcpSocket.Accept(); Accept 会等待 客服端链接进来,
客户端:
这里 要Connect 的Ip和端口要和上面的 一致
client.Connect(IPAddress.Parse("xxx.xx.xxx.xxx"), 7788);
static void Main(string[] args)
{
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(IPAddress.Parse("xxx.xx.xxx.xxx"), 7788);
byte[] data = new byte[1024];
int length = client.Receive(data);
Console.WriteLine(Encoding.UTF8.GetString(data, 0, length));
client.Send(Encoding.UTF8.GetBytes("我链接进来啦"));
}
client.Receive(data)
参数就是一个容器,返回值是它长度;
下面是Send()
参数是要发送的数据,字节,通过流来传输,返回值是发送到的字节;
这个是socket的使用, 如果需要一直通信 ,可以用while 和线程来实现
while(true)
{
Socket client=TcpServer.Accept();
}这样可以让别人一直进来。
判断是否断开链接 可以用 Poll 方法 ,第一个参数是微秒单位时间,第二个是选择模式,有读/写 Error
while (m_client.Poll(10,SelectMode.SelectRead)) 表示 10微秒后如果拉不回来 就是返回false
最好就是用个Client 类 封装 客服端Socket, 然后在服务端里面 对他们进行管理;