Caros,
Estou precisando criar uma forma de comunicação entre um aplicativo harbour e um java, mas não queria ficar criando arquivos temporários em pasta e talz, mas sim algo via alguma porta, socket e etc, o aplicativo java receberia alguma requisição do aplicativo harbour e devolveria uma resposta.
Qual o melhor recurso do harbour pra isso? (Hbnetio, hbcomm serve pra isso?)
Comunicação com aplicativo em outras linguagens
Moderador: Moderadores
-
marco.prodata
- Usuário Nível 3

- Mensagens: 238
- Registrado em: 30 Nov 2018 10:07
- Localização: Caratinga
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Comunicação com aplicativo em outras linguagens
Dr Claudio Soto postou o uso de harbour dentro de uma instância do webview.
Pode-se dizer o harbour rodando como página de web, e interagindo com tudo
Inclusive, se não me engano, tem algo em java como intermediário do harbour.
Acredito que vai encontrar lá a sua resposta.
Tem post aqui no fórum, e no hmgforum.com, mas só dá pra acessar por proxy, porque direto do Brasil não acessa, não sei porque.
http://pctoledo.com.br/forum/viewtopic. ... ew#p168325
Pode-se dizer o harbour rodando como página de web, e interagindo com tudo
Inclusive, se não me engano, tem algo em java como intermediário do harbour.
Acredito que vai encontrar lá a sua resposta.
Tem post aqui no fórum, e no hmgforum.com, mas só dá pra acessar por proxy, porque direto do Brasil não acessa, não sei porque.
http://pctoledo.com.br/forum/viewtopic. ... ew#p168325
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Comunicação com aplicativo em outras linguagens
Olá!
Você usa SOCKET igual a toda linguagem.
Quem será o servidor(daemon) na porta TCP ? Em JAVA ou Harbour ?
Vc pode usar HBTIP ou HBCurl. para puxar os dados.
Ou montar seu DAEMON (Serviço) escutando pelo TCP
Na pasta test do harbour tem esse: iotcp.prg o server.prg e o client.prg para estudos.
iotcp.prg
server.prg
Saudações,
Itamar M. Lins Jr.
Você usa SOCKET igual a toda linguagem.
Quem será o servidor(daemon) na porta TCP ? Em JAVA ou Harbour ?
Vc pode usar HBTIP ou HBCurl. para puxar os dados.
Ou montar seu DAEMON (Serviço) escutando pelo TCP
Na pasta test do harbour tem esse: iotcp.prg o server.prg e o client.prg para estudos.
iotcp.prg
Código: Selecionar todos
/*
* Harbour FILE IO redirector: IOTCP
* example of IOUSR usage
*
* Copyright 2014 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file LICENSE.txt. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA (or visit https://www.gnu.org/licenses/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour. If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way. To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/
#include "hbiousr.ch"
#include "hbsocket.ch"
#include "fileio.ch"
#include "error.ch"
ANNOUNCE HB_IOTCP
#define IOTCP_SOCKET 1
#define IOTCP_EOF 2
#define IOTCP_TIMEOUT 3
#define IOTCP_ERRORBASE 10000
#define IOTCP_NEW( sd, tout ) { sd, .F., tout }
/*
* NOTE: cDefExt, cPaths and oError can be NIL
*/
STATIC FUNCTION IOTCP_Open( cFile, cDefExt, nFlags, cPaths, oError )
LOCAL nTimeout := 10000, nError, hSock := NIL, aFile := NIL
LOCAL cAddr, cRest, nPort := 0, aAddr
LOCAL nAt
HB_SYMBOL_UNUSED( cDefExt )
HB_SYMBOL_UNUSED( cPaths )
/* strip "tcp:" prefix */
cAddr := substr( cFile, 5 )
/* take host, port and timeout from "<host>:<port>[:<timeout>]" string */
IF ( nAt := At( ":", cAddr ) ) > 1
cRest := SubStr( cAddr, nAt + 1 )
cAddr := Left( cAddr, nAt - 1 )
IF ( nPort := Val( cRest ) ) > 0
WHILE IsDigit( cRest )
cRest := SubStr( cRest, 2 )
ENDDO
IF cRest = ":"
cRest := SubStr( cRest, 2 )
IF IsDigit( cRest ) .AND. ( nTimeout := Val( cRest ) ) > 0
WHILE IsDigit( cRest )
cRest := SubStr( cRest, 2 )
ENDDO
IF cRest = ":"
cRest := ""
ENDIF
ENDIF
ENDIF
IF ! cRest == ""
nPort := 0
ENDIF
ENDIF
ENDIF
IF nPort != 0
IF !Empty( aAddr := hb_socketResolveInetAddr( cAddr, nPort ) ) .AND. ;
!Empty( hSock := hb_socketOpen() )
hb_socketSetKeepAlive( hSock, .T. )
IF hb_socketConnect( hSock, aAddr, nTimeout )
IF !Empty( hSock )
SWITCH hb_bitAnd( nFlags, hb_bitOr( FO_READ, FO_WRITE, FO_READWRITE ) )
CASE FO_READ
hb_socketShutdown( hSock, HB_SOCKET_SHUT_WR )
EXIT
CASE FO_WRITE
hb_socketShutdown( hSock, HB_SOCKET_SHUT_RD )
EXIT
ENDSWITCH
aFile := IOTCP_NEW( hSock, nTimeout )
ENDIF
ENDIF
IF aFile == NIL
nError := hb_socketGetError()
hb_socketClose( hSock )
ENDIF
ENDIF
IF nError == 0 .AND. aFile == NIL
nError := hb_socketGetError()
ENDIF
ELSE
nError := HB_SOCKET_ERR_WRONGADDR
ENDIF
IOUSR_SetError( nError, IOTCP_ERRORBASE )
IF oError != NIL
oError:filename := cFile
IF aFile == NIL
oError:osCode := nError
oError:genCode := EG_OPEN
ENDIF
ENDIF
RETURN aFile /* if aFile == NIL indicates error */
STATIC FUNCTION IOTCP_Close( aFile )
hb_socketClose( aFile[ IOTCP_SOCKET ] )
IOUSR_SetError( hb_socketGetError(), IOTCP_ERRORBASE )
RETURN NIL
STATIC FUNCTION IOTCP_Read( aFile, /*@*/ cData, nLen, nTimeout )
LOCAL nRead := 0, nError
IF !aFile[ IOTCP_EOF ]
IF nTimeout == -1
nTimeout := aFile[ IOTCP_TIMEOUT ]
ENDIF
nRead := hb_socketRecv( aFile[ IOTCP_SOCKET ], @cData, nLen, 0, nTimeout )
nError := hb_socketGetError()
IF nRead <= 0
SWITCH nError
CASE HB_SOCKET_ERR_TIMEOUT
CASE HB_SOCKET_ERR_AGAIN
CASE HB_SOCKET_ERR_TRYAGAIN
EXIT
OTHERWISE
aFile[ IOTCP_EOF ] := .F.
ENDSWITCH
nRead := 0
ENDIF
IOUSR_SetError( nError, IOTCP_ERRORBASE )
ENDIF
RETURN nRead
STATIC FUNCTION IOTCP_Write( aFile, cData, nLen, nTimeout )
IF nTimeout == -1
nTimeout := aFile[ IOTCP_TIMEOUT ]
ENDIF
nLen := hb_socketSend( aFile[ IOTCP_SOCKET ], cData, nLen, 0, nTimeout )
IOUSR_SetError( hb_socketGetError(), IOTCP_ERRORBASE )
RETURN iif( nLen < 0, 0, nLen )
STATIC FUNCTION IOTCP_Eof( aFile )
RETURN aFile[ IOTCP_EOF ]
STATIC FUNCTION IOTCP_Configure( aFile, nIndex, xValue )
HB_SYMBOL_UNUSED( aFile )
HB_SYMBOL_UNUSED( nIndex )
HB_SYMBOL_UNUSED( xValue )
RETURN .F.
STATIC FUNCTION IOTCP_Handle( aFile )
IOUSR_SetError( 0, IOTCP_ERRORBASE )
RETURN hb_socketGetFD( aFile[ IOTCP_SOCKET ] )
INIT PROCEDURE CLIPINIT
LOCAL aMethods[ IOUSR_METHODCOUNT ]
aMethods[ IOUSR_OPEN ] := @IOTCP_Open()
aMethods[ IOUSR_CLOSE ] := @IOTCP_Close()
aMethods[ IOUSR_READ ] := @IOTCP_Read()
aMethods[ IOUSR_WRITE ] := @IOTCP_Write()
aMethods[ IOUSR_EOF ] := @IOTCP_Eof()
aMethods[ IOUSR_CONFIGURE ] := @IOTCP_Configure()
aMethods[ IOUSR_HANDLE ] := @IOTCP_Handle()
IOUSR_Register( aMethods, "tcp:" )
RETURN
/* test code */
REQUEST HB_IOTCP
PROCEDURE Main( cAddr )
LOCAL hFile, cData, cSend, cEOL, nLen
IF Empty( cAddr )
cAddr := "tcp:smtp.gmail.com:25:10000"
ENDIF
? "open:", cAddr
hFile := hb_vfOpen( cAddr, FO_READWRITE )
IF Empty( hFile )
? "Open error:", FError()
ELSE
cData := Space( 1024 )
cEOL := e"\r\n"
IF ( nLen := hb_vfRead( hFile, @cData,, 10000 ) ) > 0
? "<< " + StrTran( HB_BLeft( cData, nLen ), cEOL, cEOL + "<< " )
ENDIF
cSend := "EHLO" + cEOL
nLen := hb_vfWrite( hFile, cSend,, 1000 )
? ">> " + StrTran( HB_BLeft( cSend, nLen ), cEOL, cEOL + ">> " )
IF nLen != hb_BLen( cSend )
? "WRITE ERROR:", FError()
ENDIF
IF ( nLen := hb_vfRead( hFile, @cData,, 10000 ) ) > 0
? "<< " + StrTran( HB_BLeft( cData, nLen ), cEOL, cEOL + "<< " )
ENDIF
cSend := "QUIT" + cEOL
nLen := hb_vfWrite( hFile, cSend,, 1000 )
? ">> " + StrTran( HB_BLeft( cSend, nLen ), cEOL, cEOL + ">> " )
IF nLen != hb_BLen( cSend )
? "WRITE ERROR:", FError()
ENDIF
IF ( nLen := hb_vfRead( hFile, @cData,, 10000 ) ) > 0
? "<< " + StrTran( HB_BLeft( cData, nLen ), cEOL, cEOL + "<< " )
ENDIF
hb_vfClose( hFile )
? "closed, error:", FError()
ENDIF
?
WAIT
RETURN
Código: Selecionar todos
/**
* Harbour Inet demo server program
*
* Giancarlo Niccolai
*
* In this program, the server uses just one thread
* to demonstrate how to use timeout sockets.
*/
PROCEDURE Main( cPort )
LOCAL Socket, s
LOCAL nResponse, cResponse
LOCAL nTurn := 0, nTurn1 := 0
LOCAL bCont := .T.
CLS
IF Empty( cPort )
cPort := "2000"
ENDIF
hb_inetInit()
@ 1, 15 SAY "H A R B O U R - Inet Api Server Demo"
@ 2, 5 SAY "Contact this server using telnet or the Harbour Inet Client demo"
@ 3, 5 SAY "Press a [KEY] to terminate the program"
@ 5, 5 SAY "Server listening on port " + cPort + "..."
Socket := hb_inetServer( Val( cPort ) )
hb_inetTimeout( Socket, 500 )
DO WHILE bCont
@ 6, 5 SAY Space( 70 )
@ 7, 5 SAY Space( 70 )
@ 8, 5 SAY Space( 70 )
@ 9, 5 SAY Space( 70 )
@ 6, 5
// Accepting a connection
DO WHILE bCont
Progress( @nTurn, 5, 39 )
s := hb_inetAccept( Socket )
IF hb_inetErrorCode( Socket ) == 0
EXIT
ENDIF
IF Inkey() != 0
bCont := .F.
ENDIF
ENDDO
IF ! bCont
EXIT
ENDIF
hb_inetTimeout( s, 500 )
@ 6, 5 SAY "Connection from: " + hb_inetAddress( s ) + ":" + Str( hb_inetPort( s ), 5 )
@ 7, 5 SAY "Receiving: "
@ 8, 5
nResponse := hb_inetSend( s, "Welcome to my server!" + hb_eol() )
DO WHILE bCont
// This timeout ...
hb_inetTimeout( s, 250 )
// ... will trigger this periodic callback,
hb_inetPeriodCallback( s, { @Progress(), @nTurn, 6, 39 } )
// that will be called each TIMEOUT Milliseconds.
cResponse := hb_inetRecvLine( s, @nResponse )
// hb_inetRecvLine won't return until the periodic callback returns .F.,
// or the Timelimit has been reached. Timelimit is currently -1, so
// hb_inetRecvLine will wait forever.
DO CASE
CASE hb_inetErrorCode( s ) == 0
IF Lower( cResponse ) == "quit"
bCont := .F.
ENDIF
@ 8, 5 SAY Space( 70 )
@ 8, 5 SAY cResponse
cResponse := "Count: " + Str( nResponse ) + " characters" + hb_eol()
hb_inetSend( s, cResponse )
CASE hb_inetErrorCode( s ) == -1
// idle (timed out)
Progress( @nTurn1, 7, 17 )
OTHERWISE
@ 7, 5 SAY "Received Error " + Str( hb_inetErrorCode( s ) ) + ": " + hb_inetErrorDesc( s )
@ 8, 5 SAY Space( 70 )
@ 9, 5 SAY Space( 70 )
@ 9, 5 SAY "Press a key to continue"
Inkey( 0 )
EXIT
ENDCASE
IF Inkey() != 0
bCont := .F.
ENDIF
ENDDO
ENDDO
hb_inetCleanup()
RETURN
PROCEDURE Progress( nProgress, nDrow, nDcol )
LOCAL nRow := Row(), nCol := Col()
@ nDrow, nDcol SAY "[ ]"
DO CASE
CASE nProgress == 0
@ nDrow, nDcol + 1 SAY "-"
CASE nProgress == 1
@ nDrow, nDcol + 1 SAY "\"
CASE nProgress == 2
@ nDrow, nDcol + 1 SAY "|"
CASE nProgress == 3
@ nDrow, nDcol + 1 SAY "/"
ENDCASE
nProgress++
IF nProgress == 4
nProgress := 0
ENDIF
@ nRow, nCol
RETURN
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
-
marco.prodata
- Usuário Nível 3

- Mensagens: 238
- Registrado em: 30 Nov 2018 10:07
- Localização: Caratinga
Comunicação com aplicativo em outras linguagens
Isso aqui me serve, o aplicativo java que será o server, preciso pra coisas simples como checar pra ver se está rodando e etc, obrigado.Itamar M. Lins Jr. escreveu:Olá!
Você usa SOCKET igual a toda linguagem.
Quem será o servidor(daemon) na porta TCP ? Em JAVA ou Harbour ?
Vc pode usar HBTIP ou HBCurl. para puxar os dados.
Ou montar seu DAEMON (Serviço) escutando pelo TCP
Na pasta test do harbour tem esse: iotcp.prg o server.prg e o client.prg para estudos.
iotcp.prgserver.prgCódigo: Selecionar todos
/* * Harbour FILE IO redirector: IOTCP * example of IOUSR usage * * Copyright 2014 Przemyslaw Czerpak <druzus / at / priv.onet.pl> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file LICENSE.txt. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA (or visit https://www.gnu.org/licenses/). * * As a special exception, the Harbour Project gives permission for * additional uses of the text contained in its release of Harbour. * * The exception is that, if you link the Harbour libraries with other * files to produce an executable, this does not by itself cause the * resulting executable to be covered by the GNU General Public License. * Your use of that executable is in no way restricted on account of * linking the Harbour library code into it. * * This exception does not however invalidate any other reasons why * the executable file might be covered by the GNU General Public License. * * This exception applies only to the code released by the Harbour * Project under the name Harbour. If you copy code from other * Harbour Project or Free Software Foundation releases into a copy of * Harbour, as the General Public License permits, the exception does * not apply to the code that you add in this way. To avoid misleading * anyone as to the status of such modified files, you must delete * this exception notice from them. * * If you write modifications of your own for Harbour, it is your choice * whether to permit this exception to apply to your modifications. * If you do not wish that, delete this exception notice. * */ #include "hbiousr.ch" #include "hbsocket.ch" #include "fileio.ch" #include "error.ch" ANNOUNCE HB_IOTCP #define IOTCP_SOCKET 1 #define IOTCP_EOF 2 #define IOTCP_TIMEOUT 3 #define IOTCP_ERRORBASE 10000 #define IOTCP_NEW( sd, tout ) { sd, .F., tout } /* * NOTE: cDefExt, cPaths and oError can be NIL */ STATIC FUNCTION IOTCP_Open( cFile, cDefExt, nFlags, cPaths, oError ) LOCAL nTimeout := 10000, nError, hSock := NIL, aFile := NIL LOCAL cAddr, cRest, nPort := 0, aAddr LOCAL nAt HB_SYMBOL_UNUSED( cDefExt ) HB_SYMBOL_UNUSED( cPaths ) /* strip "tcp:" prefix */ cAddr := substr( cFile, 5 ) /* take host, port and timeout from "<host>:<port>[:<timeout>]" string */ IF ( nAt := At( ":", cAddr ) ) > 1 cRest := SubStr( cAddr, nAt + 1 ) cAddr := Left( cAddr, nAt - 1 ) IF ( nPort := Val( cRest ) ) > 0 WHILE IsDigit( cRest ) cRest := SubStr( cRest, 2 ) ENDDO IF cRest = ":" cRest := SubStr( cRest, 2 ) IF IsDigit( cRest ) .AND. ( nTimeout := Val( cRest ) ) > 0 WHILE IsDigit( cRest ) cRest := SubStr( cRest, 2 ) ENDDO IF cRest = ":" cRest := "" ENDIF ENDIF ENDIF IF ! cRest == "" nPort := 0 ENDIF ENDIF ENDIF IF nPort != 0 IF !Empty( aAddr := hb_socketResolveInetAddr( cAddr, nPort ) ) .AND. ; !Empty( hSock := hb_socketOpen() ) hb_socketSetKeepAlive( hSock, .T. ) IF hb_socketConnect( hSock, aAddr, nTimeout ) IF !Empty( hSock ) SWITCH hb_bitAnd( nFlags, hb_bitOr( FO_READ, FO_WRITE, FO_READWRITE ) ) CASE FO_READ hb_socketShutdown( hSock, HB_SOCKET_SHUT_WR ) EXIT CASE FO_WRITE hb_socketShutdown( hSock, HB_SOCKET_SHUT_RD ) EXIT ENDSWITCH aFile := IOTCP_NEW( hSock, nTimeout ) ENDIF ENDIF IF aFile == NIL nError := hb_socketGetError() hb_socketClose( hSock ) ENDIF ENDIF IF nError == 0 .AND. aFile == NIL nError := hb_socketGetError() ENDIF ELSE nError := HB_SOCKET_ERR_WRONGADDR ENDIF IOUSR_SetError( nError, IOTCP_ERRORBASE ) IF oError != NIL oError:filename := cFile IF aFile == NIL oError:osCode := nError oError:genCode := EG_OPEN ENDIF ENDIF RETURN aFile /* if aFile == NIL indicates error */ STATIC FUNCTION IOTCP_Close( aFile ) hb_socketClose( aFile[ IOTCP_SOCKET ] ) IOUSR_SetError( hb_socketGetError(), IOTCP_ERRORBASE ) RETURN NIL STATIC FUNCTION IOTCP_Read( aFile, /*@*/ cData, nLen, nTimeout ) LOCAL nRead := 0, nError IF !aFile[ IOTCP_EOF ] IF nTimeout == -1 nTimeout := aFile[ IOTCP_TIMEOUT ] ENDIF nRead := hb_socketRecv( aFile[ IOTCP_SOCKET ], @cData, nLen, 0, nTimeout ) nError := hb_socketGetError() IF nRead <= 0 SWITCH nError CASE HB_SOCKET_ERR_TIMEOUT CASE HB_SOCKET_ERR_AGAIN CASE HB_SOCKET_ERR_TRYAGAIN EXIT OTHERWISE aFile[ IOTCP_EOF ] := .F. ENDSWITCH nRead := 0 ENDIF IOUSR_SetError( nError, IOTCP_ERRORBASE ) ENDIF RETURN nRead STATIC FUNCTION IOTCP_Write( aFile, cData, nLen, nTimeout ) IF nTimeout == -1 nTimeout := aFile[ IOTCP_TIMEOUT ] ENDIF nLen := hb_socketSend( aFile[ IOTCP_SOCKET ], cData, nLen, 0, nTimeout ) IOUSR_SetError( hb_socketGetError(), IOTCP_ERRORBASE ) RETURN iif( nLen < 0, 0, nLen ) STATIC FUNCTION IOTCP_Eof( aFile ) RETURN aFile[ IOTCP_EOF ] STATIC FUNCTION IOTCP_Configure( aFile, nIndex, xValue ) HB_SYMBOL_UNUSED( aFile ) HB_SYMBOL_UNUSED( nIndex ) HB_SYMBOL_UNUSED( xValue ) RETURN .F. STATIC FUNCTION IOTCP_Handle( aFile ) IOUSR_SetError( 0, IOTCP_ERRORBASE ) RETURN hb_socketGetFD( aFile[ IOTCP_SOCKET ] ) INIT PROCEDURE CLIPINIT LOCAL aMethods[ IOUSR_METHODCOUNT ] aMethods[ IOUSR_OPEN ] := @IOTCP_Open() aMethods[ IOUSR_CLOSE ] := @IOTCP_Close() aMethods[ IOUSR_READ ] := @IOTCP_Read() aMethods[ IOUSR_WRITE ] := @IOTCP_Write() aMethods[ IOUSR_EOF ] := @IOTCP_Eof() aMethods[ IOUSR_CONFIGURE ] := @IOTCP_Configure() aMethods[ IOUSR_HANDLE ] := @IOTCP_Handle() IOUSR_Register( aMethods, "tcp:" ) RETURN /* test code */ REQUEST HB_IOTCP PROCEDURE Main( cAddr ) LOCAL hFile, cData, cSend, cEOL, nLen IF Empty( cAddr ) cAddr := "tcp:smtp.gmail.com:25:10000" ENDIF ? "open:", cAddr hFile := hb_vfOpen( cAddr, FO_READWRITE ) IF Empty( hFile ) ? "Open error:", FError() ELSE cData := Space( 1024 ) cEOL := e"\r\n" IF ( nLen := hb_vfRead( hFile, @cData,, 10000 ) ) > 0 ? "<< " + StrTran( HB_BLeft( cData, nLen ), cEOL, cEOL + "<< " ) ENDIF cSend := "EHLO" + cEOL nLen := hb_vfWrite( hFile, cSend,, 1000 ) ? ">> " + StrTran( HB_BLeft( cSend, nLen ), cEOL, cEOL + ">> " ) IF nLen != hb_BLen( cSend ) ? "WRITE ERROR:", FError() ENDIF IF ( nLen := hb_vfRead( hFile, @cData,, 10000 ) ) > 0 ? "<< " + StrTran( HB_BLeft( cData, nLen ), cEOL, cEOL + "<< " ) ENDIF cSend := "QUIT" + cEOL nLen := hb_vfWrite( hFile, cSend,, 1000 ) ? ">> " + StrTran( HB_BLeft( cSend, nLen ), cEOL, cEOL + ">> " ) IF nLen != hb_BLen( cSend ) ? "WRITE ERROR:", FError() ENDIF IF ( nLen := hb_vfRead( hFile, @cData,, 10000 ) ) > 0 ? "<< " + StrTran( HB_BLeft( cData, nLen ), cEOL, cEOL + "<< " ) ENDIF hb_vfClose( hFile ) ? "closed, error:", FError() ENDIF ? WAIT RETURNSaudações,Código: Selecionar todos
/** * Harbour Inet demo server program * * Giancarlo Niccolai * * In this program, the server uses just one thread * to demonstrate how to use timeout sockets. */ PROCEDURE Main( cPort ) LOCAL Socket, s LOCAL nResponse, cResponse LOCAL nTurn := 0, nTurn1 := 0 LOCAL bCont := .T. CLS IF Empty( cPort ) cPort := "2000" ENDIF hb_inetInit() @ 1, 15 SAY "H A R B O U R - Inet Api Server Demo" @ 2, 5 SAY "Contact this server using telnet or the Harbour Inet Client demo" @ 3, 5 SAY "Press a [KEY] to terminate the program" @ 5, 5 SAY "Server listening on port " + cPort + "..." Socket := hb_inetServer( Val( cPort ) ) hb_inetTimeout( Socket, 500 ) DO WHILE bCont @ 6, 5 SAY Space( 70 ) @ 7, 5 SAY Space( 70 ) @ 8, 5 SAY Space( 70 ) @ 9, 5 SAY Space( 70 ) @ 6, 5 // Accepting a connection DO WHILE bCont Progress( @nTurn, 5, 39 ) s := hb_inetAccept( Socket ) IF hb_inetErrorCode( Socket ) == 0 EXIT ENDIF IF Inkey() != 0 bCont := .F. ENDIF ENDDO IF ! bCont EXIT ENDIF hb_inetTimeout( s, 500 ) @ 6, 5 SAY "Connection from: " + hb_inetAddress( s ) + ":" + Str( hb_inetPort( s ), 5 ) @ 7, 5 SAY "Receiving: " @ 8, 5 nResponse := hb_inetSend( s, "Welcome to my server!" + hb_eol() ) DO WHILE bCont // This timeout ... hb_inetTimeout( s, 250 ) // ... will trigger this periodic callback, hb_inetPeriodCallback( s, { @Progress(), @nTurn, 6, 39 } ) // that will be called each TIMEOUT Milliseconds. cResponse := hb_inetRecvLine( s, @nResponse ) // hb_inetRecvLine won't return until the periodic callback returns .F., // or the Timelimit has been reached. Timelimit is currently -1, so // hb_inetRecvLine will wait forever. DO CASE CASE hb_inetErrorCode( s ) == 0 IF Lower( cResponse ) == "quit" bCont := .F. ENDIF @ 8, 5 SAY Space( 70 ) @ 8, 5 SAY cResponse cResponse := "Count: " + Str( nResponse ) + " characters" + hb_eol() hb_inetSend( s, cResponse ) CASE hb_inetErrorCode( s ) == -1 // idle (timed out) Progress( @nTurn1, 7, 17 ) OTHERWISE @ 7, 5 SAY "Received Error " + Str( hb_inetErrorCode( s ) ) + ": " + hb_inetErrorDesc( s ) @ 8, 5 SAY Space( 70 ) @ 9, 5 SAY Space( 70 ) @ 9, 5 SAY "Press a key to continue" Inkey( 0 ) EXIT ENDCASE IF Inkey() != 0 bCont := .F. ENDIF ENDDO ENDDO hb_inetCleanup() RETURN PROCEDURE Progress( nProgress, nDrow, nDcol ) LOCAL nRow := Row(), nCol := Col() @ nDrow, nDcol SAY "[ ]" DO CASE CASE nProgress == 0 @ nDrow, nDcol + 1 SAY "-" CASE nProgress == 1 @ nDrow, nDcol + 1 SAY "\" CASE nProgress == 2 @ nDrow, nDcol + 1 SAY "|" CASE nProgress == 3 @ nDrow, nDcol + 1 SAY "/" ENDCASE nProgress++ IF nProgress == 4 nProgress := 0 ENDIF @ nRow, nCol RETURN
Itamar M. Lins Jr.