中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > .NET > 临时文章
.Net中的socket编程—聊天程序
作者:张悦 时间:2006-09-30 13:36 出处:ccidnet.com 责编:月夜寒箫
              摘要:.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地址的计算机上。

  本程序开发环境vb.net,os是windows 2000。不过在微软最新的vs.net2003中也可以编写和编译本程序。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有