zoukankan      html  css  js  c++  java
  • 利用Socket通信

      网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

      建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

                                                                                                                                                                                        --------来自百度百科

    套接字:源IP地址和目的IP地址以及源端口号和目的端口号的组合。

    做Socket通信,需要用到C#提供的一个类Socket和线程的相关知识。

    一、服务端

    1.新建一个Socket实例,Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    这里的第一个参数设置网络寻址协议(这里用的是IP4,就是4位的IP地址),第二个参数设置数据传输的方法,第三个参数是传输控制协议。

    2.socket.Bind(ipEndPoint);

    Socket绑定一个IPEndPoint,需要一个主机ip地址和端口号,因为系统占了一些,所以设置的时候,设置的大一些。

    IPAddress ipAddress = IPAddress.Parse("127.0.0.1".Trim());//将ip字符串转换为ip实例
     IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 12000);

    ip地址的设置,如果设置我本地回环地址127.0.0.1应该是只能本地访问,设置为ip的话应该的局域网可访问。

    3.socket.Listen(10);开始监听,10表示挂起的连续队列的个数。大概意思应该是只能有10个处于等待状态,其余的灰被抛掉。

    4.socket.Accept();;接收客户端的连接,每当有用户连接,就会生成一个单独的socket负责与客户端通信。这个方法会返回那个代理socket对象;

    5.socketProxy.Send(Encoding.UTF8.Getbytes(msg));

    利用代理socket发送小心给对应的客户端,这里需要把数据转换为字节,至于编码格式,只要客户端和服务端一直就行了。现在一般都是用utf8;

    6.socketProxy.Receive(buffer);

    接受客户端发送的数据,同样以字节数组的方式接受到。

    7.因为需要一直接受客户端返回的信息,所以需要开启一个线程去执行,不然主线程回卡死。

    Thread thread=new Thread(receiveMsg); 参数是一个委托,可以执行用和委托类型一直的方法代替。

    具体的看需要,构造函数提供了不同方式的委托。

    这里需要注意的是,如果是带参数的委托,是利用thread.Start(params);方法传的。

    这里是一个参数Object类型的,如果需要传递多个参数可以把他们封装成一个类,因为所有的类都直接或间接的继承自Object。

    根据里氏替换原则,子类是可以赋值给父类的,只需在方法里再转会子类类型就行了。

    这里还说一下前台线程和后台线程的区别,

    程序关闭时,所有前台线程必须执行完才能关闭,而后台线程可随时可以关闭。系统给C#程序的主线程是一个前台线程。

    程序所申请的线程默认也是前台的,可以通过IsBackground属性更改。

    因为这里所开启的线程是接受数据,而且是写了一个死循环来接受数据,所以应该后太线程。不影响程序的关闭。

    二、客户端

    1.Socket client=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    参数和服务端的一致。

    2.client.Connect(ip,port);连接服务器,这里需要提供ip地址和端口号。

    3.client.Conected属性可以判断是否连接上服务器。

    4.Thread thread=new Thread(receiveMsg);

    同样需要开启一个线程来接受服务端的数据。一样为后台线程。

    5.client.Send(bytesMsg);发送数据到服务端。

    6.client.Receive(bytesReceive);

    另外:

    1.ShutDown();终止发送和接受,发送给对方一个空消息。

    2.close();关闭连接。

    3.客服端和服务端都需要注意的问题,因为申请的线程执行了一个死循环函数,

    因为在程序关闭之前要先将线程关闭,不然连接资源已经释放了,还用socket接受数据就会引发错误。

    thread.Abort();终止线程。

    4.接受数据时,会填满指定的字节数组,即使有些数据为空。

    5.窗体的位置Location要整体赋值,单独的Location.X是只读的,原因我还没查到,

    通过反射工具查到Location属性上打有SettingsBindable属性。可能和这个有关。

  • 相关阅读:
    一个仿windows泡泡屏保的实现
    易语言中锐浪报表绿色发布指南(免COM组件DLL注册)
    服务器被攻击小记
    aidl.exe'' finished with non-zero exit value 1问题解决【转载】
    给APP增加RSA签名
    fastreport中文乱码问题
    EF join
    ActionFilter、IAuthorizationFilter 权限验证重定向跳转到其它页面
    EF 调试跟踪生成的SQL语句
    Asp.net MVC 权限验证,以及是否允许匿名访问
  • 原文地址:https://www.cnblogs.com/xiaoai123/p/6613251.html
Copyright © 2011-2022 走看看