TCP 소켓을 통해 큐 또는 스택에서 객체를 보내는 Java

Matt1993

TCP를 사용하여 클라이언트 / 서버간에 12 개의 객체를 송수신하고 싶습니다. 개체는 고유하지만 순서는 항상 동일합니다. 예 : 클라이언트는 항상 "object 1"을 전송하여 시작하고 서버는 항상 "object 2"로 응답합니다. 이를 위해 큐 또는 스택을 설정하고 Java 표준 라이브러리만을 사용하여 객체의 송수신을 동기화하려면 어떻게해야합니까? 나는 아래 코드 (1 패키지의 3 클래스 파일)에서 작업했지만 작동하지 않지만 (파일 끝 오류) 내가 현재 위치를 보여줍니다.

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

class SimpleClient {
    public static void main(String args[]){
        int counter = 0;
        try{
            Socket s = new Socket("localhost",2002);
            OutputStream os = s.getOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(os);
            testobject to = new testobject(1,"object 1","field1","field2","field3","field4");
            System.out.println("sending object 1"); //debug
            oos.writeObject(to);
            //Socket ss = s.accept();
            InputStream is = s.getInputStream();
            ObjectInputStream ois = new ObjectInputStream(is);
            testobject too = (testobject)ois.readObject();
            while (counter != 2) {
                while ( too.value != 3 ) {
                    if (to==null) {
                        System.out.println("object is null!");
                    } else if (to.value==1){
                        System.out.println("receiving object 2"); //debug
                        System.out.println(to.id);
                        os = s.getOutputStream();
                        oos = new ObjectOutputStream(os);
                        testobject to0 = new testobject(2,"object 3","field1","field2","field3","field4");
                        oos.writeObject(to0);
                        System.out.println("object 3 sent!");
                    } else if (to.value==2){
                        System.out.println("receiving object 4"); //debug
                        System.out.println(to.id);
                        os = s.getOutputStream();
                        oos = new ObjectOutputStream(os);
                        testobject to0 = new testobject(3,"object 5","field1","field2","field3","field4");
                        oos.writeObject(to0);
                        System.out.println("sending object 5");
                    }
                }
                is.close();
                s.close();
                //System.out.println((String)ois.readObject());
                counter = counter + 1;
            }
            oos.close();
            os.close();
            s.close();
        } catch(Exception e) {
            System.out.println(e);
        }
    }
}

class SimpleServer {
    public static void main(String args[]) {
        int port = 2002;
        int counter = 0;
        try {
            ServerSocket ss = new ServerSocket(port);
            while (counter != 1) {
                Socket s = ss.accept();
                InputStream is = s.getInputStream();
                ObjectInputStream ois = new ObjectInputStream(is);
                testobject to = (testobject)ois.readObject();
                while ( to.value != 1 ) {
                    if (to==null) {
                        System.out.println("object is null!");
                    } else if (to.value==1){
                        System.out.println("receiving object 1"); //debug
                        System.out.println(to.id);
                        OutputStream os = s.getOutputStream();
                        ObjectOutputStream oos = new ObjectOutputStream(os);
                        testobject to0 = new testobject(2,"object 2","field1","field2","field3","field4");
                        oos.writeObject(to0);
                        System.out.println("sending object 2");
                    } else if (to.value==2){
                        System.out.println("receiving object 3"); //debug
                        System.out.println(to.id);
                        OutputStream os = s.getOutputStream();
                        ObjectOutputStream oos = new ObjectOutputStream(os);
                        testobject to0 = new testobject(4,"object 4","field1","field2","field3","field4");
                        oos.writeObject(to0);
                        System.out.println("sending object 4");
                    }
                }
                is.close();
                s.close();
                counter = counter + 1;
            }
            ss.close();
        } catch(Exception e) {
            System.out.println(e);
        }
    }
}

class testobject implements Serializable {
    int value;
    String id;
    String field1;
    String field2;
    String field3;
    String field4;
    public testobject(int v, String s, String s1, String s2, String s3, String s4) {
        this.value=v;
        this.id=s;
        this.field1 = s1;
        this.field2 = s2;
        this.field3 = s3;
        this.field4 = s4;
    }
}
친애하는

코드의 EOFException

문제는 귀하의 while (to.value != 1). 서버는 값이 1 인 첫 번째 개체를받습니다. while 루프를 전혀 실행하지 않고 대신 소켓을 즉시 닫습니다. 따라서 클라이언트가 ObjectInputStream해당 소켓의 입력 스트림에서 를 만들려고 할 때 개체 스트림 헤더를 예상하는 닫힌 연결이 발생합니다. 따라서 EOFException.

대화 구현

대화를 구현하는 가장 쉬운 방법은 루프를 완전히 피하는 것입니다. 결국 루프를 수행하지만 루프 내에서 대소 문자 구분을 수행하여 각 패스에서 특수 코드를 실행합니다. 선형 프로그램을 작성하고 필요한 경우 공통 코드를 메서드 호출에 포함 할 수 있습니다. 예제에는 공통 코드가 거의 없습니다.

class SimpleClient {
    public static void main(String args[]) throws Exception {

        // Connection setup
        Socket s = new Socket("localhost",2002);
        OutputStream os = s.getOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(os);
        InputStream is = s.getInputStream();
        ObjectInputStream ois = new ObjectInputStream(is);
        testobject to;

        // Conversation

        System.out.println("sending object 1");
        to = new testobject(1,"object 1","field1","field2","field3","field4");
        oos.writeObject(to);

        System.out.println("receiving object 2");
        to = (testobject)ois.readObject();
        System.out.println(to.id);

        System.out.println("sending object 3");
        to = new testobject(2,"object 3","field1","field2","field3","field4");
        oos.writeObject(to);

        System.out.println("receiving object 4");
        to = (testobject)ois.readObject();
        System.out.println(to.id);

        // Connection shutdown
        ois.close();
        oos.close();
        s.close();
    }
}

class SimpleServer {
    public static void main(String args[]) throws Exception {

        // Connection setup
        ServerSocket ss = new ServerSocket(2002);
        Socket s = ss.accept(); // only handle a single connection
        ss.close(); // so we can immediately stop listening for more
        OutputStream os = s.getOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(os);
        InputStream is = s.getInputStream();
        ObjectInputStream ois = new ObjectInputStream(is);
        testobject to;

        // Conversation

        System.out.println("receiving object 1");
        to = (testobject)ois.readObject();
        System.out.println(to.id);

        System.out.println("sending object 2");
        to = new testobject(2,"object 2","field1","field2","field3","field4");
        oos.writeObject(to);

        System.out.println("receiving object 3");
        to = (testobject)ois.readObject();
        System.out.println(to.id);

        System.out.println("sending object 4");
        to = new testobject(4,"object 4","field1","field2","field3","field4");
        oos.writeObject(to);

        // Connection shutdown
        ois.close();
        oos.close();
        s.close();
    }
}

큐 보내기 및 받기

큐에서 항목을 정말로 보내고 싶다면 간단히 반복 할 수 있습니다.

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

class SimpleClient {
    public static void main(String args[]) throws Exception {

        // Preparing the queues
        List<testobject> sendQueue = Arrays.asList(
            new testobject(1,"object 1","field1","field2","field3","field4"),
            new testobject(2,"object 3","field1","field2","field3","field4"));
        List<testobject> receiveQueue = new ArrayList<testobject>();

        // Connection setup
        Socket s = new Socket("localhost",2002);
        OutputStream os = s.getOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(os);
        InputStream is = s.getInputStream();
        ObjectInputStream ois = new ObjectInputStream(is);
        testobject to;

        // Conversation, we start by sending
        for (testobject toSend: sendQueue) {
            System.out.println("Sending " + toSend.id);
            oos.writeObject(toSend);
            testobject received = (testobject)ois.readObject();
            System.out.println("Received " + received.id);
            receiveQueue.add(received);
        }

        // Connection shutdown
        ois.close();
        oos.close();
        s.close();
    }
}

class SimpleServer {
    public static void main(String args[]) throws Exception {

        // Preparing the queues
        List<testobject> sendQueue = Arrays.asList(
            new testobject(2,"object 2","field1","field2","field3","field4"),
            new testobject(4,"object 4","field1","field2","field3","field4"));
        List<testobject> receiveQueue = new ArrayList<testobject>();

        // Connection setup
        ServerSocket ss = new ServerSocket(2002);
        Socket s = ss.accept(); // only handle a single connection
        ss.close(); // so we can immediately stop listening for more
        OutputStream os = s.getOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(os);
        InputStream is = s.getInputStream();
        ObjectInputStream ois = new ObjectInputStream(is);
        testobject to;

        // Conversation, we start by receiving
        for (testobject toSend: sendQueue) {
            testobject received = (testobject)ois.readObject();
            System.out.println("Received " + received.id);
            receiveQueue.add(received);
            System.out.println("Sending " + toSend.id);
            oos.writeObject(toSend);
        }

        // Connection shutdown
        ois.close();
        oos.close();
        s.close();
    }
}

그러나이 경우 모든 데이터가 미리 알려지기 때문에 인터리빙하지 않고 모든 데이터를 별도의 스레드를 사용하여 즉시 전송하여 네트워크 왕복 시간을 절약 할 수 있습니다. 그러나 그것은 당신의 예에서 훨씬 멀어 질 것이므로 이에 대한 코드를 포함하지 않을 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Java에서 소켓을 통해 객체를 보내고받는 방법

DB Seq 객체에 대해 Java에서 큐 또는 스택을 관리하는 가장 좋은 방법

소켓을 통해 C ++에서 Java로 Mat 객체 보내기

Dart TCP 소켓을 통해 원시 바이트를 보내는 방법

Java에서 소켓을 사용하여 객체를 보내고받는 방법

Java의 소켓을 통해 개체를 보내는 예기치 않은 동작

클라이언트 또는 서버에 하트 비트를 보내기 위해 Boost asio tcp 소켓을 스레드에 전달하는 방법

Java에서 소켓을 통해 일반 텍스트를받는 방법

VB.Net을 사용하여 TCP를 통해 파일을 보내고 Python3.6에서 소켓으로 수신하는 동안 파일 인코딩 오류

소켓을 여는 파이썬 스크립트, 소켓을 통해 데이터를 보내는 스크립트

C에서 tcp 소켓을 통해 HTTP를 통해 파일을 어떻게 보내나요?

LUA는 tcp 소켓을 통해 16 진수 변수를 보냅니다.

파이썬에서 TCP 소켓을 통해 파일 보내기

Python에서 TCP 소켓을 통해 목록 보내기

소켓 tcp를 통해 공백이있는 문자열 보내기

c의 tcp 소켓을 통해 구조체 보내기

Ruby에서 TCP를 통해 메시지 또는 파일을 보내기위한 코드

Python 소켓을 통해 튜플 데이터 (서명)를 보내는 방법

자바에서 소켓을 통해 객체 보내기

Dart에서 소켓을 통해 파일을 보내는 방법

C #에서 소켓을 통해 파일을 보내는 방법

TCP / IP 소켓 (웹 서버)을 통해 파일 보내기

Nodejs에서 TCP를 통해 한 번에 파일을 보내는 방법

Swift에서 tcp 소켓을 통해 문자열을 읽는 방법

Android 소켓을 통해 Java 서버에 입력 된 문자를 얻는 방법

Android 소켓을 통해 Java 서버에 입력 된 문자를 얻는 방법

Android에서 Java 서버로 소켓을 통해 객체를 전달하고 수신하는 방법은 무엇입니까?

Rust에서 유닉스 소켓을 통해 데이터를 보내고 듣는 방법은 무엇입니까?

소켓을 통해 변수를 보내는 파이썬

TOP 리스트

  1. 1

    PrematureCloseException : 연결이 너무 일찍 닫혔습니다.

  2. 2

    MDRotatingPieChart를 회전하면 각도 대신 x / y 위치가 변경됩니다.

  3. 3

    c # 웹 사이트에서 텍스트를 복사하는 방법 (소스 코드 아님)

  4. 4

    jfreecharts에서 x 및 y 축 선을 조정하는 방법

  5. 5

    ArrayBufferLike의 typescript 정의의 깊은 의미

  6. 6

    Ionic 2 로더가 적시에 표시되지 않음

  7. 7

    복사 / 붙여 넣기 비활성화

  8. 8

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    QT Designer를 사용하여 GUI에 이미지 삽입

  11. 11

    java Apache POI Word 기존 테이블 셀 스타일 및 서식이있는 행 삽입

  12. 12

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

  13. 13

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  14. 14

    C # HttpWebRequest 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다.

  15. 15

    어떻게 같은 CustomInfoWindow 다른 이벤트를 할 수 있습니다

  16. 16

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  17. 17

    dataSnapShot.getValue () 반환 데이터베이스에 그겁니다 데이터 종료 널 (null)

  18. 18

    ORA-12557 TNS : 프로토콜 어댑터를로드 할 수 없습니다

  19. 19

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  20. 20

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  21. 21

    C # Asp.net 웹 API-JSON / XML 변환기 API 만들기

뜨겁다태그

보관