繁体中文
设为首页
加入收藏
当前位置:.Net技术首页 >> Asp.Net开发 >> 一个SDK里做聊天室的例子(1)

一个SDK里做聊天室的例子(1)

2004-10-01 08:26:10  作者:  来源:互联网  浏览次数:8  文字大小:【】【】【
简介:Option Explicit On Option Strict On Imports System Imports System.IO Imports System.Text Imports System.Threading Imports System.Net Imports System.Net.Sockets Imports System.Drawing Imports Sys...
关键字:聊天室 例子 一个 SDK

Option Explicit On

Option Strict On

Imports System

Imports System.IO

Imports System.Text

Imports System.Threading

Imports System.Net

Imports System.Net.Sockets

Imports System.Drawing

Imports System.Windows.Forms

Imports Microsoft.VisualBasic

Class App

'Entry point which delegates to C-style main Private Function

Public Overloads Shared Sub Main()

Main(System.Environment.GetCommandLineArgs())

End Sub

' Entry point

Overloads Public Shared Sub Main(args() As String)

' If the args parse in known way then run the app

If ParseArgs(args) Then

' Create a custom Talker object

Dim talkerObj As New Talker(endPoint, client)

' Pass the object reference to a new form object

Dim form As New TalkForm(talkerObj)

' Start the talker "talking"

talkerObj.Start()

' Run the applications message pump

Application.Run(form)

End If

End Sub 'Main

' Parsed Argument Storage

Private Shared endPoint As IPEndPoint

Private Shared client As Boolean

' Parse command line arguments

Private Shared Function ParseArgs(args() As String) As Boolean

Try

If args.Length = 1 Then

client = False

endPoint = New IPEndPoint(IPAddress.Any, 5150)

Return True

End If

Dim port As Integer

Select Case Char.ToUpper(args(1).ToCharArray()(1))

Case "L"c

port = 5150

If args.Length > 2 Then

port = Convert.ToInt32(args(2))

End If

endPoint = New IPEndPoint(IPAddress.Any, port)

client = False

Case "C"c

port = 5150

Dim address As String = "127.0.0.1"

client = True

If args.Length > 2 Then

address = args(2)

port = Convert.ToInt32(args(3))

End If

endPoint = New IPEndPoint(Dns.Resolve(address).AddressList(0), port)

Case Else

ShowUsage()

Return False

End Select

Catch

End Try

Return True

End Function 'ParseArgs

' Show sample usage

Private Shared Sub ShowUsage()

MessageBox.Show("WinTalk [switch] [parameters...]" & ControlChars.CrLf & ControlChars.CrLf & _

" /L [port]" & ControlChars.Tab & ControlChars.Tab & "-- Listens on a port. Default: 5150" & ControlChars.CrLf & _

" /C [address] [port]" & ControlChars.Tab & "-- Connects to an address and port." & ControlChars.CrLf & ControlChars.CrLf & _

"Example Server - " & ControlChars.CrLf & _

"Wintalk /L" & ControlChars.CrLf & ControlChars.CrLf & _

"Example Client - " & ControlChars.CrLf & _

"Wintalk /C ServerMachine 5150", "WinTalk Usage")

End Sub 'ShowUsage

End Class 'App

' UI class for the sample

Class TalkForm

Inherits Form

Public Sub New(talkerObj As Talker)

' Associate for method with the talker object

Me.talkerObj = talkerObj

AddHandler talkerObj.Notifications, AddressOf HandleTalkerNotifications

' Create a UI elements

Dim talkSplitter As New Splitter()

Dim talkPanel As New Panel()

receiveText = New TextBox()

sendText = New TextBox()

'we'll support up to 64k data in our text box controls

receiveText.MaxLength = 65536

sendText.MaxLength = 65536

statusText = New Label()

' Initialize UI elements

receiveText.Dock = DockStyle.Top

receiveText.Multiline = True

receiveText.ScrollBars = ScrollBars.Both

receiveText.Size = New Size(506, 192)

receiveText.TabIndex = 1

receiveText.Text = ""

receiveText.WordWrap = False

receiveText.ReadOnly = True

talkPanel.Anchor = AnchorStyles.Top Or AnchorStyles.Bottom Or AnchorStyles.Left Or AnchorStyles.Right

talkPanel.Controls.AddRange(New Control() {sendText, talkSplitter, receiveText})

talkPanel.Size = New Size(506, 371)

talkPanel.TabIndex = 0

talkSplitter.Dock = DockStyle.Top

talkSplitter.Location = New Point(0, 192)

talkSplitter.Size = New Size(506, 6)

talkSplitter.TabIndex = 2

talkSplitter.TabStop = False

statusText.Dock = DockStyle.Bottom

statusText.Location = New Point(0, 377)

statusText.Size = New Size(507, 15)

statusText.TabIndex = 1

statusText.Text = "Status:"

sendText.Dock = DockStyle.Fill

sendText.Location = New Point(0, 198)

sendText.Multiline = True

sendText.ScrollBars = ScrollBars.Both

sendText.Size = New Size(506, 173)

sendText.TabIndex = 0

sendText.Text = ""

sendText.WordWrap = False

AddHandler sendText.TextChanged, AddressOf HandleTextChange

sendText.Enabled = False

AutoScaleBaseSize = New Size(5, 13)

ClientSize = New Size(507, 392)

Controls.AddRange(New Control() {statusText, talkPanel})

Me.Text = "WinTalk"

Me.ActiveControl = sendText

End Sub 'New

' When the app closes, dispose of the talker object

Protected Overrides Sub OnClosed(e As EventArgs)

If Not (talkerObj Is Nothing) Then

RemoveHandler talkerObj.Notifications, AddressOf HandleTalkerNotifications

talkerObj.Dispose()

End If

MyBase.OnClosed(e)

End Sub 'OnClosed

' Handle notifications from the talker object

Private Sub HandleTalkerNotifications(notify As Talker.Notification, data As Object)

Select Case notify

Case Talker.Notification.Initialized

' Respond to status changes

Case Talker.Notification.StatusChange

Dim statusObj As Talker.Status = CType(data, Talker.Status)

statusText.Text = String.Format("Status: {0}", statusObj)

If statusObj = Talker.Status.Connected Then

sendText.Enabled = True

End If

' Respond to received text

Case Talker.Notification.Received

receiveText.Text = data.ToString()

receiveText.SelectionStart = Int32.MaxValue

receiveText.ScrollToCaret()

' Respond to error notifications

Case Talker.Notification.ErrorNotify

Close(data.ToString())

' Respond to end

Case Talker.Notification.EndNotify

MessageBox.Show(data.ToString(), "Closing WinTalk")

Close()

Case Else

Close()

End Select

End Sub 'HandleTalkerNotifications

' Handle text change notifications and send talk

Private Sub HandleTextChange(sender As Object, e As EventArgs)

If Not (talkerObj Is Nothing) Then

talkerObj.SendTalk(CType(sender, TextBox).Text)

End If

End Sub 'HandleTextChange

' Close with an explanation

Private OverLoads Sub Close(message As String)

MessageBox.Show(message, "Error!")

Close()

End Sub 'Close

' Private UI elements

Private receiveText As TextBox

Private sendText As TextBox

Private statusText As Label

Private talkerObj As Talker

Private Sub TalkForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

Private Sub InitializeComponent()

'

'TalkForm

'

Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)

Me.ClientSize = New System.Drawing.Size(292, 273)

Me.Name = "TalkForm"

End Sub

End Class 'TalkForm

' An encapsulation of the Sockets class used for socket chatting

Class Talker

Implements IDisposable

' Construct a talker

Public Sub New(endPoint As IPEndPoint, client As Boolean)

Me.endPoint = endPoint

Me.client = client

socket = Nothing

reader = Nothing

writer = Nothing

statusText = String.Empty

prevSendText = String.Empty

prevReceiveText = String.Empty

End Sub 'New

' Finalize a talker

Overrides Protected Sub Finalize()

Dispose()

MyBase.Finalize()

End Sub 'Finalize

' Dispose of resources and surpress finalization

Public Sub Dispose() Implements IDisposable.Dispose

GC.SuppressFinalize(Me)

If Not (reader Is Nothing) Then

reader.Close()

reader = Nothing

End If

If Not (writer Is Nothing) Then

writer.Close()

writer = Nothing

End If

If Not (socket Is Nothing) Then

socket.Close()

socket = Nothing

End If

End Sub 'Dispose

' Nested delegate class and matchine event

Delegate Sub NotificationCallback(notify As Notification, data As Object)

Public Event Notifications As NotificationCallback

' Nested enum for notifications

Public Enum Notification

Initialized = 1

StatusChange

Received

EndNotify

ErrorNotify

End Enum 'Notification<

责任编辑:admin
相关文章