Socket通讯
多台计算机想要建立起连接就要通过这个Socket来连接,Socket可以理解成程序间的电话
原来的意思就是孔或者插座
通讯就要分为客户端和服务端
打个比方
客户端就是男生,服务端就是女生,男生要去找女生就要经过一个宿管大妈,而这个宿管大妈就是负责监听的socket
我客户端想要询问服务端的里面的东西就要知道IP和端口号 IP就是访问到指定的服务端,而端口号就是指定的服务端里面的各种各样的app,而宿管大妈就是负责监视,来的客户,把他分配给客户想要的女生也就是app。让app和男生接触。
Socket通讯呢有两种协议,一种是TCP协议一种是UDP协议。
TAP协议的优点就是稳定安全但是效率低,他呢主要的连接方式是三次握手
就是客户端给服务端发消息问你在不在,服务端回消息给客户端说我在,客户端最后告诉服务端说我知道你在了,那么TCP必须满足这三条才能成立,所以他安全稳定
那么UDP呢就是我不管你服务端又没有空我就一直给你发消息,这样就会产生数据的流失,但是他的效率高但是不稳定,一般的视频通讯就可以采用UDP
流程
下面我们就开始写整个Socket通讯的流程,参考下面的如我们一一讲解
首先在C#中建立一个客户端的Form
然后在C#中建立一个服务端的Form
然后开始正式的编程
编程开始
首先在服务端里面写一个负责监听的Socket也就是宿管大妈
//创建一个负责监听的Socket
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//这里TCP就是StreamUDP就是Dgram
下一步要写监听自己IP和端口号的代码
//要监听自己的IP地址和端口号
//创建ip地址和端口号对象
//any 就是跟随着变得 而txt是写死的
PAddress ip = IPAddress.Any; //IPAddress.Parse(txtServer.Text);
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
下一步让负责监听的Socket绑定IP和端口号
//让负责监听的socket绑定ip地址和端口号
socketWatch.Bind(point);
ShowMsg("监听成功");
这里有个方法ShowMsg在这里补充
void ShowMsg(string s)
{
txtLog.AppendText(s + "\r\n");//换行
}
下一步开始设置监听的队列
//设置监听队列
socketWatch.Listen(10);//在这个时间段内最多能进来10个人而不是服务期满了多余的人进不去了
下一步要创建一个和客户端通讯的Socket来等待客户端的连接,要把他写在一个循环里面,否则只能接受一次,下面来写这个方法
/// <summary>
/// 等待客户端的连接 并且创建与之通信的Socket
/// </summary>
Socket socketSend;
void Listen(object o)
{
Socket socketWatch = o as Socket;
while (true)
{
try
{
//负责监听的socket 来接受客户端的连接 创建和客户端通信的Socket
socketSend = socketWatch.Accept();//这行代码让程序卡死了 这句就是等待客户端连接
//将远程连接的客户端的IP地址和Socket存入键值对集合中
dicSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
//将IP和端口号存入下拉框中
cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString());
ShowMsg(socketSend.RemoteEndPoint.ToString() + "连接成功");
//开启一个线程不停的接收客户端发过来的消息
Thread th = new Thread(Recive);
th.IsBackground = true;
th.Start(socketSend);
}
catch
{
}
}
}
下一步客户端连接成功后,服务器应该接受客户端发过来的消息
/// <summary>
/// 服务器端不停的接受客户端发送过来的消息
/// </summary>
/// <param name="o"></param>
void Recive(object o)
{
Socket socketSend = o as Socket;
while (true)
{
try
{
//客户端连接成功后,服务器应该接受客户端发过来的消息
byte[] buffer = new byte[1024 * 1024 * 2];
//实际接受的有效字节数
int r = socketSend.Receive(buffer);
if (r == 0)//空不是空格
{
break;
}
string s = Encoding.UTF8.GetString(buffer, 0, r);
ShowMsg(socketSend.RemoteEndPoint + ":" + s);//remoteendpoint 能获得远程端口号 冒号就是他说的话
}
catch
{
//什么都不写 给用户感觉 程序很棒 就算出现异常也不跳出异常
}
}
}
以上的关于 服务端的部分就先告一段落,先把客户端的给写完然后再继续写服务端的部分
首先创建一个负责通讯的Socket
//创建一个负责通信的Socket
socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
然后让这个Socket和服务端的ip和端口号连接
IPAddress ip = IPAddress.Parse(txtSever.Text);
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
//获得要连接的远程ip和端口号
socketSend.Connect(point);
ShowMsg("连接成功");
连接成功了就开始给服务端发送信息
private void button2_Click(object sender, EventArgs e)
{
string s = txtMsg.Text.Trim();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(s);
socketSend.Send(buffer);
}
到这一步,客户端可以给服务端发消息了,服务端也能接收到了,现在开始写服务端给客户端发的消息和客户端要接收服务端的消息。
由于这里的代码几乎和客户端给服务端发的消息以及服务端接收客户端的消息的内容是一致的就不在这里贴代码了(后面也会改进这里的代码)。
至此客户端和服务端的整体简单的通讯就结束了,后续我会更新客户端和服务端之间传图片等方法。