zoukankan      html  css  js  c++  java
  • .NET socket 简单开发

    socket是套接字的英文名称,主要是用于网络编程,在以前vb6时要想使用socket进行程序开发最麻烦的是要自己声明socket动态库中的相关函数,而这些函数的参数多不说,还是用c语言编写的,要让它门在vb中运行最头痛的就是要进行函数参数的转换。经常是为了测试一个参数的转换是否正确而花上大半天的功夫。

      不过现在不同了有了.net的System.Net.Sockets 命名空间包含 Windows 套接字接口的托管实现。而System.Net 命名空间中的所有其他网络访问类都建立在该套接字实现之上,有就是说使用System.Net.Sockets和System.Net 命名空间中类可以完成通过socket动态库中的几乎全部功能,但是又避免了参数转化的麻烦。(.NET Framework的 Socket 类是 Winsock32 API 提供的套接字服务的托管代码版本。大多数情况下,Socket 类方法只是将数据封送到它们的本机 Win32 副本中并处理任何必要的安全检查。)

      Socket 类支持两种基本模式:同步和异步。在同步模式中,对执行网络操作的函数(如 Send 和 Receive)的调用一直等到操作完成后才将控制返回给调用程序。在异步模式中,这些调用立即返回。本文将讨论同步模式,因为同步模式是基础。

      程序说明:(本文中的程-序需要用户编写两个实例才可以完成。)

      发送方:在使用套接字通信之前,必须使用协议和网络地址信息初始化套接字。Socket 类的构造函数具有指定套接字用来建立连接的地址族、套接字类型和协议类型的参数。然后指定要发送到目标机器的ip地址和端口号。在将要发送数据发送的字节数组传递到 Socket 类的数据发送方法Send 和 SendTo之一本文使用send方法。最后关闭socket终止发送。

    '发送端代码
    Public Class Form1
        Inherits System.Windows.Forms.Form
    Private Sub Button1_Click(ByVal sender As System.Object,
      ByVal e As System.EventArgs) Handles Button1.Click
            Dim bytes(1024) As Byte'声明字节数组
            Dim sender1 As New System.Net.Sockets.Socket
       (Net.Sockets.AddressFamily.InterNetwork,
       Net.Sockets.SocketType.Stream,
       Net.Sockets.ProtocolType.Tcp)
       '初始化socket
            Dim msg As Byte() =
       System.Text.Encoding.ASCII.GetBytes(TextBox1.Text)
         '对发送的数据进行编码
    '***************************
    '指定ip和端口
            Dim ipHostInfo As System.Net.IPHostEntry =
       System.Net.Dns.Resolve("d")
            Dim ipAddress As System.Net.IPAddress =
       ipHostInfo.AddressList(0)
            Dim ipe As New System.Net.IPEndPoint(ipAddress, 11000)
    '**********************
            sender1.Connect(ipe)'建立连接
            Dim bytesSent As Integer = sender1.Send(msg)'发送数据

    '关闭socket
            sender1.Shutdown(Net.Sockets.SocketShutdown.Both)
            sender1.Close()

    End Sub
    End Class

     

      接收端:和发送端一样先需要初始化套接字,指定接收方ip和端口号(必须与发送方相同),通过Listen方法监听指定的接收方ip和端口号,申请连接,使用Receive接收数据,在将数据传给字节数组,最后关闭socket。

    接收端
    Public Class Form1
        Inherits System.Windows.Forms.Form
        Dim listener As New System.Net.Sockets.Socket
          (Net.Sockets.AddressFamily.InterNetwork,
          Net.Sockets.SocketType.Stream,
          Net.Sockets.ProtocolType.Tcp)
          '初始socket
    Private Sub Form1_Load(ByVal sender As System.Object,
      ByVal e As System.EventArgs) Handles MyBase.Load
    '指定ip和端口
            Dim ipHostInfo As System.Net.IPHostEntry =
       System.Net.Dns.Resolve(System.Net.Dns.GetHostName())
            Dim ipAddress As System.Net.IPAddress =
       ipHostInfo.AddressList(0)
            Dim localEndPoint As New System.Net.IPEndPoint(ipAddress, 11000)
            listener.Bind(localEndPoint)
            listener.Listen(10)
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object,
            ByVal e As System.EventArgs) Handles Button1.Click
            Dim bytes() As Byte = New [Byte](1024) {}
            Dim handler As System.Net.Sockets.Socket =
       listener.Accept()'建立连接请求
            Dim data As String = Nothing
            bytes = New Byte(1024) {}
            Dim bytesRec As Integer = handler.Receive(bytes)'接收数据
            data += System.Text.Encoding.ASCII.GetString(bytes, 0, bytesRec)
            TextBox1.Text = data
            Dim msg As Byte() = System.Text.Encoding.ASCII.GetBytes(data)
            handler.Shutdown(Net.Sockets.SocketShutdown.Both)
            handler.Close()
        End Sub
    End Class

     

      说明:本程序未进行异常处理,所以不可以连续点"接收"键,其原因是让读者快速掌握.net中的socket编程基础(如要进行异常处理,请加入try块,详情见msdn)。由于本代码的中数据编码使用的是英文编码,所以不支持中文字体(通过对编码的修改可以发送中文,见msdn)。本文的目的不是教各位编写聊天程序,所以在看本文时请从socket方面进行思考。本程序在局域网和internet中测试时都通过了,如果是想在internet中使用本程序,需要将文中的接收和发送方的Dim ipe As New System.Net.IPEndPoint(ipAddress, 11000)语句中的ipaddress修改为真的ip地址并分别将发送和接收安装于不同ip地址的计算机上。

     

    ===========================================================================

    上次讲了在.net中使用socket类进行字符串的传输,从而编写一个聊天程序。这次还是用.net中的socket来,但是不是编写聊天程序了,而是一个文本文件发送接收程序。此程序将使用到filestream类和socket类。在发送端的作用是将文本文件中的文字读取出来,然后通过socket中send给发送出去。在接收端其作用是将发送到缓存中的数据读取出来,然后写到一个新的文本文件中去。

      为了更好的理解本程序,着里对filestream类做一个简单的讲解:filestream类是从stream派生出来的,它与stream类最大的不同是简化了对文件的操作。Filestream中的read方法的作用是将文件中的数据按字节的方式来读取。

      其中的第一个参数是相当特别的,因为它不是传入型,而是传出型的。它将从文件读取的数据保存在这个参数中。以后就可以同过多总方法来操作这个参数了。

      要编写此代码需要启动两个vb.net的ide。

      发送端程序:

    Public Class Form1
        Inherits System.Windows.Forms.Form
    Private Sub Button1_Click(ByVal sender As System.Object,
      ByVal e As System.EventArgs) Handles Button1.Click
     Dim socsend As New Net.Sockets.Socket
       (Net.Sockets.AddressFamily.InterNetwork,
       Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp)
     Dim ipendp As New Net.IPEndPoint
       (Net.IPAddress.Parse("192.168.0.1"), 9999)
      '用一个远程ip地址和端口号来初试终节点以次来帮定一个socket通道
     Dim filestream As New IO.FileStream("c:\j.txt",
       IO.FileMode.OpenOrCreate)
       '利用c盘下的j.txt文件来初始化filestream
            Dim msg(filestream.Length) As Byte
            Dim msgs As String
            filestream.Read(msg, 0, msg.Length - 1)
       '读取文件中的数据,然后保存到msg中
            socsend.Connect(ipendp)'连接
            socsend.Send(msg)'发送
            filestream.Close()'关闭文件流
            socsend.Shutdown(Net.Sockets.SocketShutdown.Both)
            socsend.Close()
        End Sub
    End Class

      接收端程序

    Public Class Form1
        Inherits System.Windows.Forms.Form
        Dim soclis As New Net.Sockets.Socket
          (Net.Sockets.AddressFamily.InterNetwork,
          Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp)
    Private Sub Button1_Click(ByVal sender As System.Object,
      ByVal e As System.EventArgs) Handles Button1.Click
            Dim bytes(99999) As Byte
            Dim str As String = Nothing
            Dim newfile As New IO.FileStream("kk.txt",
       IO.FileMode.OpenOrCreate)
         '建立一个新的kk.txt文本文件,用来将c:\j.txt中的内容写到kk.txt中
            Dim newsock As Net.Sockets.Socket = soclis.Accept()'同意连接
            newsock.Receive(bytes)'读取缓存中的数据
            str = System.Text.Encoding.UTF8.GetString(bytes)
            RichTextBox1.Text = str
            newfile.Write(bytes, 0, bytes.Length - 1)'将数据写到kk.txt中
            newfile.Close()'流关
            newsock.Shutdown(Net.Sockets.SocketShutdown.Both)
            newsock.Close()
        End Sub
        Private Sub Form1_Load(ByVal sender As System.Object,
          ByVal e As System.EventArgs) Handles MyBase.Load
            Dim ipendp As New Net.IPEndPoint
       (Net.IPAddress.Parse("192.168.0.1"), 9999)
            soclis.Bind(ipendp)'帮定socket
            soclis.Listen(10)'开始监听socket通道
        End Sub   
    End Class

      程序说明:发送端:

      "Dim ipendp As New Net.IPEndPoint(Net.IPAddress.Parse("192.168.0.1"), 9999)"这条语句需要注意的是:192.168.0.1是目标机器的ip地址,你也可以用其他ip地址代替,但是必须保证发送和接收代码中的ip为相同地址。9999是目标机器的端口,意思是说打开192.168.0.1上的9999端口进行通信。

      "filestream.Read(msg, 0, msg.Length - 1)"是将文本文件的数据保存到msg中。

      接收端:

      "Dim ipendp As New Net.IPEndPoint(Net.IPAddress.Parse("192.168.0.1"), 9999)"在本台机器上打开9999端口进行通信。

      "Dim newsock As Net.Sockets.Socket = soclis.Accept()"建立与源计算机中的socket通道。

  • 相关阅读:
    IE6中布局常见问题
    -bash: grunt-cli: command not found
    字符长度
    Mac下safari、chrome打开开发者工具快捷键
    line-height:150%和line-height:1.5的区别
    JavaScript中的apply()、call()、bind()
    JavaScript中的 this
    JavaScript中的var与作用域
    onload与ready的区别
    浏览器的同源策略
  • 原文地址:https://www.cnblogs.com/xxaxx/p/2055966.html
Copyright © 2011-2022 走看看