
-----------------------------------
GhostCobra
Fri Dec 30, 2005 5:38 pm

Huge Multi-User Chat
-----------------------------------
Got Source?

Server Code:



put "Chat Server Started on ", Net.LocalAddress
put ""

const minPort := 20000
const maxPort := 65000

proc waitForChar (incomingConnection : int)
    loop
        if Net.LineAvailable (incomingConnection) then
            exit
        end if
    end loop
end waitForChar

proc acceptIncoming (clientPort : int)
    var port : int := 65
    var serverAddress : string := Net.LocalAddress
    var clientAddress : string := ""
    var incomingConnection : int := Net.WaitForConnection (port, serverAddress)
    waitForChar (incomingConnection)
    get : incomingConnection, clientAddress : *
    put "Client: ", clientAddress, " Connecting on port: ", clientPort
    put : incomingConnection, clientPort
    Net.CloseConnection (incomingConnection)
end acceptIncoming

proc serverChatConnect (clientPort : int, var clientAddr : string, var clientNick : string, var incomingConnection : int)
    var serverAddress : string := Net.LocalAddress
    incomingConnection := Net.WaitForConnection (clientPort, serverAddress)
    waitForChar (incomingConnection)
    get : incomingConnection, clientAddr
    waitForChar (incomingConnection)
    get : incomingConnection, clientNick
end serverChatConnect

var clientAddr : array minPort .. maxPort of string
var clientNick : array minPort .. maxPort of string

var text : string := ""
var incomingConnection : array minPort .. maxPort of int
for i : minPort .. maxPort
    incomingConnection (i) := 0
end for

proc relayText (clientPort : int)
    for i : minPort .. maxPort
        if incomingConnection (i) not= 1 and incomingConnection (i)  0 then
                put : outgoingConnection, clientAddress
                waitForChar (newClientPort)
                Net.CloseConnection (outgoingConnection)
                connect := true
                exit
            else
                put "Retrying Connection...", i
                connect := false
            end if
        end for
        if connect = false then
            put "Connection was not completed."
        else
            put "Connection was completed."
        end if

        exit when connect = true
    end loop
end clientConnect

proc clientChatConnect (newClientPort : int)
    var clientAddress : string := Net.LocalAddress
    outgoingConnection := Net.OpenConnection (serverAddress, newClientPort)
    put : outgoingConnection, clientAddress
    put : outgoingConnection, nickName
end clientChatConnect

proc sendToServer (text : string)
    if text = "exit" then
        put : outgoingConnection, text
        EXIT := true
    else
        put : outgoingConnection, text
        GUI.SetText (chatTextSendBox, "")
    end if
end sendToServer

proc sendToServer2
    var text : string := GUI.GetText (chatTextSendBox)
    if text = "exit" then
        put : outgoingConnection, text
        EXIT := true
    else
        put : outgoingConnection, text
        GUI.SetText (chatTextSendBox, "")
    end if
end sendToServer2

var newClientPort : int := 0

process receiveText
    var text : string
    loop
        exit when EXIT = true
        if Net.CharAvailable (outgoingConnection) then
            get : outgoingConnection, text : *
            GUI.AddLine (chatTextBox, text)
            GUI.Refresh
        end if
    end loop
end receiveText

clientConnect (newClientPort)
clientChatConnect (newClientPort)

var font1 : int := Font.New ("Arial:10")

cls

chatTextSendBox := GUI.CreateTextFieldFull (5, 5, 320, "", sendToServer, 0, font1, 0)
var chatTextSendButton : int := GUI.CreateButton (335, 1, 20, "Send", sendToServer2)
chatTextBox := GUI.CreateTextBox (5, 30, 320, 310)

fork receiveText

loop
    exit when GUI.ProcessEvent or EXIT = true
end loop

put : outgoingConnection, "exit"

Net.CloseConnection (outgoingConnection)
delay (250)

Window.Close (w1)


SERVER:

put "Created by Blake Mesdag"
put "Chat Server Started on ", Net.LocalAddress
put ""

const minPort := 20000
const maxPort := 65000

proc waitForChar (incomingConnection : int)
    loop
        if Net.LineAvailable (incomingConnection) then
            exit
        end if
    end loop
end waitForChar

proc acceptIncoming (clientPort : int)
    var port : int := 65
    var serverAddress : string := Net.LocalAddress
    var clientAddress : string := ""
    var incomingConnection : int
    var connect : boolean := false

    loop
        incomingConnection := Net.WaitForConnection (port, serverAddress)

        if incomingConnection > 0 then
            waitForChar (incomingConnection)
            get : incomingConnection, clientAddress : *
            put "Client: ", clientAddress, " Connecting on port: ", clientPort
            put : incomingConnection, clientPort
            Net.CloseConnection (incomingConnection)
            connect := true
        else
            put "Last client failed to connect."
            connect := false
        end if
        
        exit when connect = true
    end loop
end acceptIncoming

proc serverChatConnect (clientPort : int, var clientAddr : string, var clientNick : string, var incomingConnection : int)
    var serverAddress : string := Net.LocalAddress
    incomingConnection := Net.WaitForConnection (clientPort, serverAddress)
    waitForChar (incomingConnection)
    get : incomingConnection, clientAddr
    waitForChar (incomingConnection)
    get : incomingConnection, clientNick
end serverChatConnect

var clientAddr : array minPort .. maxPort of string
var clientNick : array minPort .. maxPort of string

var text : string := ""
var incomingConnection : array minPort .. maxPort of int
for i : minPort .. maxPort
    incomingConnection (i) := 0
end for

proc relayText (clientPort : int)
    for i : minPort .. maxPort
        if incomingConnection (i) not= 1 and incomingConnection (i) 