Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2014, 08:19   #1
Даниил_глазко
Форумчанин
 
Аватар для Даниил_глазко
 
Регистрация: 25.10.2010
Сообщений: 155
По умолчанию Клиент-серверное взаимодействие Delphi и Java

Всем привет. Есть два приложения: одно на delphi(клиентское), другое на Java(серверное). Для теста так-же были написаны delphi-серверное и java-клиентское. Delphi-delphi отлично взаимодействуют, так-же как и Java-Java. Однако, при отправки сообщения с помощью Socket.SendText(), Java получает его уже после разрыва соединения.

Вот примеры логов:

Цитата:
Starting server...
Server started
Connection accepted...
Thread execution started
Wait for messages
Client processing finished
ТестированиеТестированиеТестировани еТестированиеТестированиеТестирован иеТестированиеТестированиеТестирова ниеТестирование
Код Java:
SocketServer :
Код:
package socketserver;

import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {

    public static int timeout = 5;

    public static void log(String str) {
        System.err.println(str);
    }

    public static void main(String[] args) throws Throwable {
        log("Starting server...");
        ServerSocket ss = new ServerSocket(8298);
        log("Server started");
        while (true) {
            Socket s = ss.accept();
            log("Connection accepted...");
            new ClientProcessingThread(s).start();
        }

    }
}
ClientProcessingThread:
Код:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package socketserver;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import static socketserver.SocketServer.log;

/**
 *
 * @author Daniil
 */
public class ClientProcessingThread extends Thread {

    private Socket fromclient;
    private BufferedReader in = null;
    private PrintWriter out = null;

    public ClientProcessingThread(Socket s) throws Throwable {
        this.fromclient = s;

        in = new BufferedReader(new InputStreamReader(fromclient.getInputStream()));
        out = new PrintWriter(fromclient.getOutputStream(), true);
    }

    public static long getMillisconds() {
        return System.currentTimeMillis();
    }

    public void run() {
        try {
            log("Thread execution started");

            String input, output;

            System.out.println("Wait for messages");
            while ((input = in.readLine()) != null) {
                if (input.equalsIgnoreCase("exit")) {
                    break;
                }
                out.println("S ::: " + input);
                System.out.println(input);
            }
            out.close();
            in.close();
            fromclient.close();
            log("Client processing finished");
        } catch (IOException ex) {
            Logger.getLogger(ClientProcessingThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
P.S. Я не знаю, куда создавать темы подобного рода
Даниил_глазко вне форума Ответить с цитированием
Старый 06.06.2014, 08:22   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Java получает его уже после разрыва соединения.
Код на Делфи в студию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.06.2014, 08:29   #3
Даниил_глазко
Форумчанин
 
Аватар для Даниил_глазко
 
Регистрация: 25.10.2010
Сообщений: 155
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls, ExtCtrls;

type
TByteArr = array of byte;


  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    Button3: TButton;
    ClientSocket1: TClientSocket;
    Button4: TButton;
    Timer1: TTimer;
    Button5: TButton;
    Button6: TButton;
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Connecting(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Write(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure log(str: string);
begin
  form1.Memo1.Lines.Add(str);
end;

procedure disconnected();
begin
with form1 do begin
Button1.Enabled:=true;
  Button2.Enabled:=false;
  Button3.Enabled:=false;
  edit1.Enabled:=false;
end;
end;
procedure connected();
begin
with form1 do begin
Button1.Enabled:=false;
  Button2.Enabled:=true;
  Button3.Enabled:=true;
  edit1.Enabled:=true;
end;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
log('Êëèåíò ïîäêëþ÷åí ê ñåðâåðó');
connected();
end;

procedure TForm1.ClientSocket1Connecting(Sender: TObject;
  Socket: TCustomWinSocket);
begin
log('Ñîåäèíåíèå...');
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
log('Ñîåäèíåíèå ïîòåðÿíî');
disconnected;
ClientSocket1.Active:=false;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
log('Îøèáêà ñîêåòà');
disconnected;
ClientSocket1.Active:=false;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
log('Ñåðâåð: '+Socket.ReceiveText);
end;

procedure TForm1.ClientSocket1Write(Sender: TObject;
  Socket: TCustomWinSocket);
begin
log('Êëèåíò: '+Socket.ReceiveText);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Port:=5885;
ClientSocket1.Active:=true;
log('Ïîäêëþ÷åíèå');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Active:=false;
end;

function ArrOfByte(AStr: String): TByteArr;
var
   j: integer;
begin
   SetLength( Result, Length(AStr)) ;
   for j := 0 to Length(AStr) - 1 do
     Result[j] := ord(AStr[j + 1]) - 48;
end;

procedure TForm1.Button3Click(Sender: TObject);
  var arr: TByteArr;
begin
ClientSocket1.Socket.sendText(edit1.Text);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
ClientSocket1.Port:=8298;
ClientSocket1.Active:=true;
log('Ïîäêëþ÷åíèå');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
button3.Click;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
timer1.Enabled:=true;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
timer1.Enabled:=false;
end;

end.
Даниил_глазко вне форума Ответить с цитированием
Старый 06.06.2014, 08:51   #4
Даниил_глазко
Форумчанин
 
Аватар для Даниил_глазко
 
Регистрация: 25.10.2010
Сообщений: 155
По умолчанию

Кстати, если сервер delphi разрывает соединение с delphi клиентом, то клиент просто пишет "Соединение разорвано", а если java сервере разрывает, то delphi выдает ошибку http://screenshot.su/show.php?img=9f...15257e55f0.jpg
Даниил_глазко вне форума Ответить с цитированием
Старый 06.06.2014, 09:49   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... Пусть мои коллеги поправят меня, но по-моему у ClientSocket была такая особенность, что после передачи данных соединение нужно было закрывать для того чтоб принимающая сторона знала, что передача окончена.
Вообще это не болячка этого конкретно компонета, видимо Джавовский класс просто так работает - требует дисконнекта для того чтоб отработать правильно.

Кстати вопрос: А почему именно эти компоненты? Я бы например использовал более современные типа HTTP компонент. По крайней мере из пакета INDI они поудобнее будут для обмена данными.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.06.2014, 15:04   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Если из Java-клиент в Delphi-server слать, то нормально? Если да, то проблема у Java.
Человек_Борща вне форума Ответить с цитированием
Старый 06.06.2014, 16:10   #7
Даниил_глазко
Форумчанин
 
Аватар для Даниил_глазко
 
Регистрация: 25.10.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Кстати вопрос: А почему именно эти компоненты? Я бы например использовал более современные типа HTTP компонент. По крайней мере из пакета INDI они поудобнее будут для обмена данными.
1) Нужно отслеживать конец потока
2) Нужно шифровать его

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Если из Java-клиент в Delphi-server слать, то нормально? Если да, то проблема у Java.
Если так, то нормально. НО смериться с невозможностью этого я не могу(. Клиент - это Windows сервис, а сервер должен быть на чём-то кроссплатформенном

Всем спасибо! Я допёр!!! Нужно отправлять #10 в конце пакета

Последний раз редактировалось Stilet; 06.06.2014 в 19:11.
Даниил_глазко вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Java. Реализовать клиент-серверное приложение virt117 Фриланс 0 13.05.2012 19:32
Элементарное клиент-серверное приложение (Winsock)(Delphi) Recart Помощь студентам 9 28.11.2011 23:05
ms sql+delphi, клиент-серверное приложение denis_stell БД в Delphi 4 03.11.2011 20:06
Простейшее клиент-серверное приложение в Delphi 2009 RNT Работа с сетью в Delphi 15 21.11.2010 19:08
Клиент-серверное взаимодействие посредством использования сокетов Cantana Компоненты Delphi 2 18.02.2008 19:27