socket网络编程
socket进程间的通信机制,也叫套接字。
tcp:3次握手,服务器安全稳定,但是效率低。
udp:快速效率高,但是不稳定,容易发生数据丢失,没有经历3次握手。
服务器端:socket(),bind()绑定监听端口,listen()设置监听队列, accept():在while(true)循环等待客户端连接,receive(),send(),close()。
客户端:socket(),connect()连接建立,send()发送数据,receive()接收数据,close()。
//socket网络编程
//服务器端
private void btnStart_Click(object sender, EventArgs e)
{
try{
//当点击开始监听的时候,在服务器端创建一个负责监听IP地址跟端口号的socket
Socket socketWatch = new Socket(AddressFamily.InterNetwork, Socket T)
IPAddress ip = IPAddress.Any;//IPAddress.Parse(txtServer.Text);
//创建端口对象
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
//监听
socketWatch.Bind(point);
ShowMsg("监听成功");
socketwatch.Listen(10);//多于10个要排队
Thread th = new Thread(Listen);//开启线程后窗体不卡死了,卸载函数中用线程执行。
th.IsBackground = true;
th.Start(socketWatch);
}
catch ()
{
}
}
///<summary>
///等待客户端连接,并且创建与之通信的socket
///</summary>
void Listen(object o)
{
Socket socketWatch = o as Socket;
//等待客户端连接,并且创建一个负责通信的Socket
while (true)
{
try{
Socket socketSend = socketWatch.Accept();//如果客户端不连接,就会一直等待,阻碍主线程的运行。1、造成窗体假死的情况:开一个线程。2、只能连接一个客户端:写在循环里面
ShowMsg(socketSend.remoteEndPoint.ToString() + ":" + "连接成功");
//开启一个新线程不停地接收客户端发送过来的消息
Thread th = new Thread(Recive);
th.IsBackground = true;
th.Start(socketSend);
}
catch ()
{
}
}
}
///<summary>
///服务器端不停地接收客户端发送过来的消息
///</summary>
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 str = Encoding.UTF8.GetString(buffer, 0, r);
ShowMsg(socketSend.RemotteEndPoint + ":" + str);
}
catch ()
{
}
}
}
void ShowMsg(string str)
{
txtLog.AppendText(str + "\r\n");//文本框追加文本
}
//客户端
namespace _07Client
{
public partial class Form1:Form
{
public Form1()
{
InitializeComponent();
}
Socket socketSend;
private void btnStart_Click(object sender, EventArgs 2)
{
//创建负责通信的Socket
socketSend = new Socket(AddressFamily.InterNetwork, SocketType flow, );
IPAddress ip = IPAddress.Parse(txtServer.Text);
IPEndPoint point = new IPEndPoint(ip,Convert.ToInt32(txtPort.Text));
//获得要连接的远程服务器应用程序的IP地址和端口号
socketSend.Connect(point);
showMsg("连接成功");
}
void showMsg(string str)
{
txtLog.AppendText(str + "\r\n");
}
//客户端给服务器发送消息
private void btnSend_Click(object sender, EventArgs e)
{
string str = txtMsg.Text.Trim();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
socketSend.send(buffer);
}
};
}