Ошибка java.net.SocketException. Что я делаю неправильно? - PullRequest
0 голосов
/ 28 апреля 2019

Я создал сервис SOA с Socket Adapter на JDeveloper, и мне нужно запустить / протестировать его с помощью Java. Итак, я создал класс сервера и класс клиента, но я получаю сообщение об ошибке

Я провел некоторое исследование о том, как создать этот сервис и протестировать его, и наткнулся на несколько полезных материалов в Интернете, но все же я получаю сообщение об ошибке и не знаю, как это исправить. Я очень новичок в создании сокет-серверов и прочего.

вот мой класс сервера

package client;

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

public class Class1 {

      try {

        ServerSocket socket = new ServerSocket(12110);
    Socket s=socket.accept();

          System.out.println("Connected!");

      } catch (Exception e) {
        e.printStackTrace();
      }

    }
}

и вот мой клиентский класс

package client;

import java.io.BufferedReader;

import java.io.InputStreamReader;
import java.io.OutputStream;

import java.net.Socket;

public class Client{

    public static void main(String[] args) {

        try {
              Socket socket = new Socket("localhost", 12110);
              OutputStream os = socket.getOutputStream();
              os.write("FirstName,LastName\nWaslley,Souza\nJohn,Snow".getBytes());
              os.flush();
              socket.shutdownOutput();
              BufferedReader soc_in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
              String response = soc_in.readLine();
              System.out.println("Response: " + response);
              socket.close();

            } catch (Exception e) {
              e.printStackTrace();
            }

    }
}

вот ошибка, которую я получаю:

java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.io.BufferedReader.readLine(BufferedReader.java:324)
    at java.io.BufferedReader.readLine(BufferedReader.java:389)
    at client.Client.main(Client.java:23)

Ответы [ 4 ]

0 голосов
/ 28 апреля 2019

эй @ Майк, извини, не было понятно, в прошлый раз копайся в этом полный код сервера

import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;
public class Serv1 {
    public static void main(String[] args) {
        new Serv1().start();
    }
    public void start(){
        String input = "";
            try(ServerSocket socket = new ServerSocket(12110)) {
                System.out.println("Connected!");
                while (true) {
                try(Socket server = socket.accept()){
                    BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream(), "UTF-8"));
                    PrintStream echo = new PrintStream(server.getOutputStream());
                    while ((input = in.readLine()) != null && !input.equals(".")) {
                        System.out.println(input);
                        echo.println("Echoed: " + input);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
0 голосов
/ 28 апреля 2019

Код сервера:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class Class1 {

    //static ServerSocket variable
    private static ServerSocket server;
    //socket server port on which it will listen
    private static int port = 12110;

    public static void main(String args[]) throws IOException, ClassNotFoundException {
        //create the socket server object
        server = new ServerSocket(port);
        //keep listens indefinitely until receives 'exit' call or program terminates
        while (true) {
            System.out.println("Waiting for the client request");
            //creating socket and waiting for client connection
            Socket socket = server.accept();
            //read from socket to ObjectInputStream object
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            //convert ObjectInputStream object to String
            String message = (String) ois.readObject();
            System.out.println("Message Received: " + message);
            //create ObjectOutputStream object
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            //write object to Socket
            oos.writeObject("Hi Client " + message);
            //close resources
            ois.close();
            oos.close();
            socket.close();
            //terminate the server if client sends exit request
            if (message.equalsIgnoreCase("exit")) {
                break;
            }
        }
        System.out.println("Shutting down Socket server!!");
        //close the ServerSocket object
        server.close();
    }

}

Код клиента:

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

public class Client {

    public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException, InterruptedException {
        //get the localhost IP address, if server is running on some other IP, you need to use that
        InetAddress host = InetAddress.getLocalHost();
        Socket socket = null;
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;

        //establish socket connection to server
        socket = new Socket(host.getHostName(), 12110);
        //write to socket using ObjectOutputStream
        oos = new ObjectOutputStream(socket.getOutputStream());
        System.out.println("Sending request to Socket Server");

        oos.writeObject("SEND SOME DATA");
        //read the server response message
        ois = new ObjectInputStream(socket.getInputStream());
        String message = (String) ois.readObject();
        System.out.println("Message: " + message);
        //close resources
        ois.close();
        oos.close();
        Thread.sleep(100);

    }
}

сделать таким образом.

0 голосов
/ 28 апреля 2019

Это должно сделать это

        String input= "";
        Socket server=socket.accept();
        BufferedReader  in = new BufferedReader(new InputStreamReader(server.getInputStream(), "UTF-8"));
        PrintStream echo = new PrintStream(server.getOutputStream());
        while((input = in.readLine()) != null && !input.equals(".")) {
            System.out.println(input);
            echo.println("echo: "+input);
        }
0 голосов
/ 28 апреля 2019

Это происходит потому, что код вашего сервера завершается после принятия подключения к сокету. Следовательно, JVM этого сервера выйдет и (среди прочего) закроет все соединения с сокетами, которые он содержит. Это приводит к SocketException на стороне клиента.

Чтобы исправить это, вы должны предотвратить выход JVM сервера, например, вложив вызов accept() в цикл while:

public class Server {
  public static void main(String[] args) {
    try {
      ServerSocket socket = new ServerSocket(12110);
      while (true) {
        Socket s = socket.accept();
        System.out.println("Connected! to " + s);
      }
    } catch (final Exception e) {
      e.printStackTrace();
    }
  }
}
...