Что нового

[Сеть, интернет] Сервер и клиент по средством TCP соединения

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Версия AutoIt: 3.

Описание:Как написать сервер и клиент на разных компьютерах
чтобы они работали через интернет ,допустим сервер на моём ПК
а клиент на удалённой машине?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Копипаст из справки
Сервер:
Код:
#include <GUIConstantsEx.au3>

Opt('MustDeclareVars', 1)

;==============================================
;==============================================
;SERVER!! Start Me First !!!!!!!!!!!!!!!
;==============================================
;==============================================

Example()

Func Example()
    ; Set Some reusable info
    ; Set your Public IP address (@IPAddress1) here.
;   Local $szServerPC = @ComputerName
;   Local $szIPADDRESS = TCPNameToIP($szServerPC)
    Local $szIPADDRESS = @IPAddress1
    Local $nPORT = 33891
    Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted
    Local $msg, $recv

    ; Start The TCP Services
    ;==============================================
    TCPStartup()

    ; Create a Listening "SOCKET".
    ;   Using your IP Address and Port 33891.
    ;==============================================
    $MainSocket = TCPListen($szIPADDRESS, $nPORT)

    ; If the Socket creation fails, exit.
    If $MainSocket = -1 Then Exit


    ; Create a GUI for messages
    ;==============================================
    $GOOEY = GUICreate("My Server (IP: " & $szIPADDRESS & ")", 300, 200)
    $edit = GUICtrlCreateEdit("", 10, 10, 280, 180)
    GUISetState()


    ; Initialize a variable to represent a connection
    ;==============================================
    $ConnectedSocket = -1


    ;Wait for and Accept a connection
    ;==============================================
    Do
        $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1


    ; Get IP of client connecting
    $szIP_Accepted = SocketToIP($ConnectedSocket)

    ; GUI Message Loop
    ;==============================================
    While 1
        $msg = GUIGetMsg()

        ; GUI Closed
        ;--------------------
        If $msg = $GUI_EVENT_CLOSE Then ExitLoop

        ; Try to receive (up to) 2048 bytes
        ;----------------------------------------------------------------
        $recv = TCPRecv($ConnectedSocket, 2048)

        ; If the receive failed with @error then the socket has disconnected
        ;----------------------------------------------------------------
        If @error Then ExitLoop

        ; Update the edit control with what we have received
        ;----------------------------------------------------------------
        If $recv <> "" Then GUICtrlSetData($edit, _
                $szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))
    WEnd


    If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)

    TCPShutdown()
EndFunc   ;==>Example

; Function to return IP Address from a connected socket.
;----------------------------------------------------------------------
Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet
    
    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
            "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
    If Not @error And $aRet[0] = 0 Then
        $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
        If Not @error Then $aRet = $aRet[0]
    Else
        $aRet = 0
    EndIf

    $sockaddr = 0

    Return $aRet
EndFunc   ;==>SocketToIP

Клиент:
Код:
Opt('MustDeclareVars',  1)

;==============================================
;==============================================
;CLIENT! Start Me after starting the  SERVER!!!!!!!!!!!!!!!
;==============================================
;==============================================

Example()

Func Example()
    ; Set Some  reusable info
    ;--------------------------
    Local $ConnectedSocket,  $szData
    ; Set $szIPADDRESS to wherever the SERVER is. We will change a PC name  into an IP Address
;   Local $szServerPC =  @ComputerName
;   Local $szIPADDRESS =  TCPNameToIP($szServerPC)
    Local $szIPADDRESS = @IPAddress1
     Local $nPORT = 33891

     ; Start The TCP Services
     ;==============================================
    TCPStartup()

    ; Initialize  a variable to represent a connection
    ;==============================================
    $ConnectedSocket  = -1

    ;Attempt to connect to SERVER at its IP and PORT 33891
    ;=======================================================
    $ConnectedSocket  = TCPConnect($szIPADDRESS, $nPORT)

     ; If there is an error... show it
    If @error Then
        MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
        ; If there is  no error loop an inputbox for data
        ;   to send to the SERVER.
    Else
        ;Loop  forever asking for data to send to the SERVER
         While 1
            ; InputBox  for data to transmit
            $szData = InputBox("Data for Server",  @LF & @LF & "Enter data to transmit to the SERVER:")

            ; If  they cancel the InputBox or leave it blank we exit our forever  loop
            If @error Or $szData = "" Then ExitLoop

             ; We should have data in $szData... lets attempt to send  it through our connected socket.
             TCPSend($ConnectedSocket,  $szData)

            ; If the send failed with @error then  the socket has disconnected
            ;----------------------------------------------------------------
            If @error Then ExitLoop
         WEnd
    EndIf
EndFunc    ;==>Example
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Спасибо,хороший пример,я в TCP не очень соображаю,
через интернет на разных ПК это работать будит?
И если нет,то что здесь нужно сделать?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Sergey2210 сказал(а):
Спасибо,хороший пример,я в TCP не очень соображаю, через интернет на разных ПК это работать будит? И если нет,то что здесь нужно сделать?
У меня работало. Хотя я не помню работало ли изначально или я что-то дописывал для того чтобы заставить работать, но за основу я брал именно этот пример.
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Ясно,блин дома 2 пк стоит а проверить не могу,интернет подключен только на одном,буду искать способы...
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Sergey2210 [?]
Ячно,блин дома 2 пк стоит а проверить не могу,интернет подключен только на одном,буду искать способы...
Пример рабочий. Теперь все зависит от правельной сетевой настройки конечных компьютеров. Если хотите могу запустить у себя сервер, а Вы клиент и попробуем законектится....
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Да,если можно,буду признателен
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Как зделать чтоб при закрытии клиента сервер не закрывался?
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
А это по Интернету или по Лан? я с другом проверял, нечего не получалось, мы через интернет!
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Это по интернету,просто в скрипте клиента нужно вписать вместо @IPAddress1 ip адресс компа на котором стоит сервер.

Да и ещё,есть вопрос,как организовать передачу видео потока от клиента серверу?Я так понял что нужно изображение с web камеры перевести в бинарный код и отправить серверу,а сервер принявший его создаёт файл из этого бинарного кода и выводит в форму и как это зделать с таймером в 1 сек?
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
У меня при каждом подключении к интернету меняется ip и клиент не может подсоединится к серверу,так и должно быть? Если нет,то как исправить?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
спасибо,и всё таки как организовать передачу видео потока от клиента серверу?Я так понял что нужно изображение с web камеры перевести в бинарный код и отправить серверу,а сервер принявший его создаёт файл из этого бинарного кода и выводит в форму и как это зделать с таймером в 1 сек?
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Дело в том что у меня нет постоянного модема,из-за этого ip меняется,а сервер переодически будет выходить в онлайн режим
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Ваш сервер будет привязан к постоянному доменному имени, независимо от того как часто у Вас меняется IP - адрес (если только Ваш провайдер не назначает "серые ip - адреса"). Почитайте про DynDNS...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Sergey2210 [?]
спасибо, и всё таки как организовать передачу видео потока от клиента серверу?
Не забивайте себе голову, вам это не под силу, объяснять вам очень долго, а если делать за вас, то это в другой раздел.
Мой вам совет, поставьте себе MS Windows Media Encoder и будет вам счастье. ;)
Принимать сможете на WMPlayer

Sergey2210 [?]
Дело в том что у меня нет постоянного модема,из-за этого ip меняется
IP меняется не из-за этого :smile:
 
Автор
S

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Понятно,но на счёт ip это не главное,разберусь сам,главное видео поток
 
Верх