Ascultați portul prin intermediul unui socket Java (Programare, Java, Prize)

Jhourlad Estrella a intrebat.

Un software de server cu care comunică clientul meu trimite în mod regulat mesaje de tranzacție pe portul 4000. Trebuie să tipăresc aceste mesaje pe consolă, linie cu linie. (În cele din urmă va trebui să scriu acele valori într-un tabel, dar păstrez asta pentru mai târziu).

Am încercat acest cod, dar nu scoate nimic:

package merchanttransaction;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.ClassNotFoundException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class MerchantTransaction {
    public static void main(String[] args) {
        try {
            InetAddress host = InetAddress.getLocalHost();
            Socket socket = new Socket("192.168.1.104", 4000);
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            String message = (String) ois.readObject();
            System.out.println("Message: " + message);

            ois.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

Apropo, trebuie să pot monitoriza acel port până când programul se termină. Nu sunt sigur dacă codul de mai sus va putea face acest lucru, deoarece nu văd nicio iterație a codului.

Folosesc Java versiunea 1.6.0_24, SE Runtime Environment (build 1.6.0_24-b07) care rulează pe Ubuntu.

Comentarii

  • Tu citești un Object, dar poate că serverul trimite text simplu, trebuie să știi exact ce este trimis pentru a-l citi ca fiind același tip de date, mult noroc –  > Por Hernán Eche.
  • Da, cred că mesajele de capturat sunt în text simplu. –  > Por Jhourlad Estrella.
3 răspunsuri
Howard

Trebuie să folosiți un ServerSocket. Poți găsi o explicație aici.

Tomasz Nurkiewicz

Ce doriți să obțineți de fapt? Ceea ce face codul tău este să încerce să se conecteze la un server situat la adresa 192.168.1.104:4000. Este aceasta adresa unui server care trimite mesajele (pentru că pare a fi un cod de client)? Dacă execut un server fals la nivel local:

$ nc -l 4000

…și schimb adresa socket-ului în localhost:4000, , acesta va funcționa și va încerca să citească ceva de la ncserverul -creat.

Ceea ce doriți probabil este să creați un ServerSocket și să ascultați pe acesta:

ServerSocket serverSocket = new ServerSocket(4000);
Socket socket = serverSocket.accept();

A doua linie se va bloca până când un alt software se va conecta la mașina dvs. pe portul 4000. Apoi puteți citi de pe socket-ul returnat. Uitați-vă la acest tutorial, acesta este de fapt un subiect foarte amplu (threading, protocoale…)

Comentarii

  • Mulțumesc, Tomasz. Nu sunt foarte sigur ce terminologii să folosesc. Sunt foarte nou în acest domeniu. Dar, în termeni simpli, ceea ce am nevoie este o bucată de cod care va asculta un port unde un alt program pre-făcut trimite mesaje. Nu trebuie să trimită nimic. Trebuie doar să-l asculte. –  > Por Jhourlad Estrella.
  • Ascultarea este în mod tradițional un rol al unui server, așa că aveți nevoie de un ServerSocket așa cum am sugerat. Clientul are nevoie de un socket client pentru a se conecta la acest server într-un mod similar cu cel pe care l-ați făcut în exemplul dvs. (totuși, în codul dvs. ar trebui să trimiteți mai degrabă decât să primiți mesaje; codul dvs. de recepție merge la ServerSocket parte). Deci, practic, aveți toate piesele (codul dvs. și al meu) de completat. –  > Por Tomasz Nurkiewicz.
  • +1 Ah, eu am înțeles invers. Acest lucru este cu adevărat lămuritor, Tomasz. Voi încerca să pregătesc ceva și voi reveni pentru mai multe întrebări (sper că nu). Vă mulțumesc foarte mult! –  > Por Jhourlad Estrella.
LouwHopley

Încercați această bucată de cod, în loc de ObjectInputStream.

BufferedReader in = new BufferedReader (new InputStreamReader (socket.getInputStream ()));
while (true)
{
    String cominginText = "";
    try
    {
        cominginText = in.readLine ();
        System.out.println (cominginText);
    }
    catch (IOException e)
    {
        //error ("System: " + "Connection to server lost!");
        System.exit (1);
        break;
    }
}

Comentarii

  • „Cannot find symbol. Symbol: class BufferedReader” Îmi pare rău. Total, sunt un noob total la Java 🙁 –  > Por Jhourlad Estrella.
  • Trebuie să import java.io.*; –  > Por LouwHopley.
  • Nici o problemă! Funcționează această soluție? Poate folosiți acest lucru împreună cu ceea ce a spus celălalt despre utilizarea unui ServerSocket –  > Por LouwHopley.
  • Nu primesc niciun răspuns de la client. Voi verifica mai departe –  > Por Jhourlad Estrella.

Tags:,