0

ProducerConsumer이 각각 동일한 소켓을 사용하여 서버와 통신하도록하려면 어떻게해야합니까? 아니면 다른 클래스가 소켓 연결을 처리해야합니까? 생산자와 소비자는 이고고객은입니다.생산자와 소비자간에 단일 소켓을 공유하려면 어떻게합니까?

소켓 연결은 마치 ProducerConsumer에 묶여있는 것처럼 보입니다. 외관상으로는 풀리지 않을 수 없으므로 세 번째 클래스에 연결하고 싶습니다. 어떻게 보이지 않습니다. 그렇게하려면.

난 아주 많이 ProducerConsumer의 패턴처럼 만 나는 서버와의 모든 소켓 통신은 단일 소켓을 통해 들어가도록 클라이언트 코드의 제약 이내에 implment하는 방법을 모르겠어요.

고유 한 식별자를 보내고 가져 오는 것이 가능하지만 서버가 지나치게 복잡해질 수 있습니다.

코드 :

package net.bounceme.dur.client; 

import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.net.Socket; 
import java.util.concurrent.BlockingQueue; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import net.bounceme.dur.data.State; 
import net.bounceme.dur.data.Title; 

public class Producer implements Runnable { 

    private final BlockingQueue<Title> queue; 
    private final String server = "localhost"; 
    private final int portNumber = 8080; 

    public Producer(BlockingQueue<Title> q) { 
     this.queue = q; 
    } 

    private Title connect() throws IOException, ClassNotFoundException { 
     Socket socket = new Socket(server, portNumber); 
     Title title = null; 
     State state = State.undefined; 
     ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); 
     title = (Title) objectInputStream.readObject(); 
     return title; 
    } 

    @Override 
    public void run() { 
     try { 
      connect(); 
     } catch (IOException | ClassNotFoundException ex) { 
      Logger.getLogger(Producer.class.getName()).log(Level.SEVERE, null, ex); 
      //exit? 
     } 
    } 
} 

소비자 :
패키지 net.bounceme.dur.client; 당신은 하나의 Socket를 작성하고 InputStreamOutputStream 각 한 (된 사람이 읽고 어느 한 것은 쓰기에 따라 다름을 공유 할 필요가

http://www.journaldev.com/1034/java-blockingqueue-example-implementing-producer-consumer-problem

답변

1

:

import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.net.Socket; 
import java.util.concurrent.BlockingQueue; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import net.bounceme.dur.data.State; 
import net.bounceme.dur.data.Title; 

public class Consumer implements Runnable { 

    private final BlockingQueue<Title> queue; 
    private final String server = "localhost"; 
    private final int portNumber = 8080; 

    public Consumer(BlockingQueue<Title> q) { 
     this.queue = q; 
    } 

    private void consume() throws IOException, ClassNotFoundException, InterruptedException { 
     Socket socket = new Socket(server, portNumber); 
     Title title = queue.take(); 
     title.setState(State.x); 
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 
     objectOutputStream.writeObject(title); 
    } 

    @Override 
    public void run() { 
     try { 
      consume(); 
     } catch (IOException | ClassNotFoundException | InterruptedException ex) { 
      Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex); 
      //exit? 
     } 

    } 
} 

가에서 적응 섬기는 사람).

consume() 메서드는 아무 것도 초기화하지 않아야합니다. 데이터를 읽고 처리 할 수 ​​있도록 모든 것이 준비되어 있어야합니다. 예제 코드는 메소드가 실제로 새로 작성되는 Socket과 새로운 ObjectOutputStream을 한 번만 작성해야 할 때 보여줍니다.

Socket s = new Socket(server, port); 
InputStream in = s.getInputStream(); 
OutputStream out = s.getOutputStream(); 

consumer.setStream(in);  // Or vice-versa 
producer.setStream(out); // You can also provide it as a constructor argument 
+0

감사합니다. 그런 소켓을 통과하는 것이 가능하다는 것을 몰랐습니다. 오류가 발생한다고 생각했습니다. – Thufir

관련 문제