Написание Java-кода в Matlab? - PullRequest
1 голос
/ 20 апреля 2010

Я пытаюсь использовать Java-команды pw.println () и br.readLine () в Matlab, потому что я установил сокет (input_socket2) между Matlab и программой командной строки, которой хочу управлять с помощью классов Java BufferedReader и PrintWriter. Перед следующим фрагментом кода я реализовал еще один сокет, который идет между двумя компьютерами. Это прекрасно работает, и я также знаю, что следующий фрагмент кода успешно открывает линию связи между Matlab и другой программой. Однако Matlab выдает ошибку в pw.println ('noop'). Я думаю, что это как-то связано с синтаксисом, но я не уверен, как написать команду в синтаксисе Matlab:

try
    input_socket2 = Socket(host2,port2);
    input_stream2   = input_socket2.getInputStream;
    d_input_stream2 = DataInputStream(input_stream2);
    br = BufferedReader(InputStreamReader(input_stream2));
    pw = PrintWriter(input_socket2.getOutputStream,true);
    pw.println('noop')
    br.read
end

Есть идеи?

Ответы [ 2 ]

7 голосов
/ 20 апреля 2010

Поскольку вы не указали фактическую ошибку, трудно точно определить проблему.

В любом случае, вот простая реализация, демонстрирующая концепцию (протестирована и работает просто отлично!):

Server.java

import java.net.*;
import java.io.*;

public class Server
{
    public static void main(String[] args) throws IOException
    {
        System.out.println("Listening on port...");
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(4444);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 4444.");
            System.exit(1);
        }

        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
            System.out.println("Received connection!");
        } catch (IOException e) {
            System.err.println("Accept failed.");
            System.exit(1);
        }

        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader( new InputStreamReader(clientSocket.getInputStream()) );
        String inputLine;

        while ( (inputLine = in.readLine()) != null ) {
            System.out.println("Client says: " + inputLine);
            out.println(inputLine);
        }

        out.close();
        in.close();
        clientSocket.close();
        serverSocket.close();
    }
}

Client.m

import java.io.*;
import java.net.*;

%# connect to server
try
    sock = Socket('localhost',4444);
    in = BufferedReader(InputStreamReader(sock.getInputStream));
    out = PrintWriter(sock.getOutputStream,true);
catch ME
    error(ME.identifier, 'Connection Error: %s', ME.message)
end

%# get input from user, and send to server
userInput = input('? ', 's');
out.println(userInput);

%# get response from server
str = in.readLine();
disp(['Server says: ' char(str)])

%# cleanup
out.close();
in.close();
sock.close();
0 голосов
/ 23 апреля 2010

Спасибо за помощь! Больше думая о вещах и читая ваши комментарии, я получил правильный ответ! Amro, ваш код великолепен, но я не могу реализовать Java-код, потому что программа, с которой я пытаюсь установить связь, - это не то, что я написал - это программа с именем c-gate и программа, которая может управлять Clipsal Система освещения Square D Тип команд, которые он принимает, имеет вид «на 254/56/26» - это включает свет, указанный этим путем.

Так что для всех тех, кому интересно, как выглядит мой финальный код:

функциональное сообщение = клиент (хост, порт, number_of_retries)

импорт java.io.BufferedReader; импорт java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; импорт java.net.Socket; import java.net.ServerSocket; импорт java.net.UnknownHostException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; импорт java.util.Map; импорт java.io. ; import java.util. ;

if (nargin < 3)
    number_of_retries = -1; % set to -1 for infinite
end

retry        = 0;
input_socket = [];
message      = [];

while true

    retry = retry + 1;
    if ((number_of_retries > 0) && (retry > number_of_retries))
        fprintf(1, 'Too many retries\n');
        break;
    end

    try
        fprintf(1, 'Retry %d connecting to %s:%d\n', ...
                retry, host, port);

        % throws if unable to connect
        input_socket = Socket(host, port);

        % get a buffered data input stream from the socket
        input_stream   = input_socket.getInputStream;
        d_input_stream = DataInputStream(input_stream);

        fprintf(1, 'Connected to server\n');

        % read data from the socket - wait a short time first
        pause(0.5);
        bytes_available = input_stream.available;
        fprintf(1, 'Reading %d bytes\n', bytes_available);

        message = zeros(1, bytes_available, 'uint8');
        for i = 1:bytes_available
            message(i) = d_input_stream.readByte;
        end

        message = char(message);

        % cleanup
        input_socket.close;
        break;

    catch
        if ~isempty(input_socket)
            input_socket.close;
        end

        % pause before retrying
        pause(1);
    end
end

% set up a socket between client and c-gate
host2        = 'localhost';
port2        = 20023;

try
    input_socket2 = Socket(host2,port2);
    input_stream2   = input_socket2.getInputStream;
    d_input_stream2 = DataInputStream(input_stream2);
    br = BufferedReader(InputStreamReader(input_stream2));
    pw = PrintWriter(input_socket2.getOutputStream,true);
    read = readLine(br)
    disp('I read the line')
    pw.println('get 254/56/26 level')
    disp('I entered the command')
    read2 = readLine(br)
end

конец

Еще раз спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...