socket网络编程

馋奶兔 提交于 2019-12-17 09:07:52

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);
  }
 };
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!