2012-12-23 2 views
0

네트워크 OOP와 관련하여 명확한 설명을 원합니다. 예를 들어 메신저처럼 클라이언트 - 서버 모델을 사용하면 두 가지 프로그램을 사용할 수 있습니다. 클라이언트 프로그램이 실행되면 객체가 인스턴스화됩니다. 그런 다음 Socket은 클라이언트 프로그램 내에서 인스턴스화되고 ServerSocketaccept() 메소드를 사용하여 서버 프로그램 ServerSocket에 연결됩니다. 서버 프로그램 안에 새로운 Socket을 만드는 설명서에 따르면. 내 경험에 의하면 자바에서 생성되는 단어는 객체에 대한 참조이므로 언제든지 하나의 클라이언트에 두 개의 객체가 존재합니다 Socket? 하나는 클라이언트 프로그램에, 다른 하나는 서버에 있습니까? 서버 프로그램이나 다른 방법으로 클라이언트 프로그램의 객체를 인스턴스화 할 수 있습니까?JavaEE 객체 지향 네트워킹

내가 클라이언트 프로그램 내 Socket를 만들 static 수정을 사용하면 마지막으로 일반적으로 그게 단 하나의 오브젝트가 작성 될 수 있도록 할 클라이언트 프로그램에서 SocketSocket 일반적으로 같은 Socket로하지 않은 경우 그래서 서버 프로그램에서 생성 된 객체를 참조하면 두 프로그램간에 공유되는 객체가 하나만 존재합니까?

그냥 여러 클라이언트 연결에 대해 이야기하는 것이 아니라 클라이언트의 기본 메커니즘을 이해하려고 노력하고 있습니다. 서버의 에 연결된 클라이언트의 Socket 연결을 이해하고있을뿐만 아니라 통해 수행 할 수있는 작업을 파악합니다. 그 연결을 이해하지만, 일단 나는 그것을 내 시간에 실험 할 수 있습니다.

나는 이것을 생각하지 않았 으면 좋겠다. 당신의 도움에 미리 감사드립니다 :-).

+0

Java EE에 대한 참조를 제거하고 일부 단락에서 예외를 발생했습니다. –

답변

1

우선, 귀하의 질문은 Java EE와 아무 관련이 없습니다. 소켓은 Java SE의 일부입니다.

static의 의미를 이해하지 못할 수도 있습니다. static 변수를 변수의 범위로 지정하는 대신 클래스의 인스턴스로 범위를 지정합니다. 그것은 생성 된 객체의 수를 제한하지 않습니다. 그리고 각 JVM에는 네트워크를 통해 다른 JVM과 공유되지 않는 자체 객체와 클래스가 있습니다. 객체를 클라이언트 JVM의 클래스 A의 정적 변수 foo에 저장하면 서버의 A.foo에 저장된 내용에 아무런 영향을 미치지 않습니다.

생성 된 소켓 개체의 수에 대해 왜 그렇게 우려하는지 이해할 수 없습니다. 소켓은 바로 그것입니다 : 두 당사자 사이의 통신을위한 종단점. 각 당사자는 상대방의 종점에 연결된 자체 종단점을가집니다. 친구에게 전화를 걸 때와는 조금 : 전화를 사용하고 친구도 하나를 사용하고 두 전화가 서로 연결되어 있습니다.

+0

클라이언트 프로그램이 연결되어 있지 않습니다. 각각은 서버를 통해 연결되어 있으며 클라이언트 간의 통신을 처리 할 수있는 최적의 위치를 ​​파악하려고합니다. –

1

첫째, 예, 클라이언트 프로그램과 서버에 하나씩 동일한 연결에 대해 두 개의 Socket 개체로 끝나는 것이 맞습니다. 그러나, 이것들을 어떤 식 으로든 '같은'대상으로 생각하는 것은 실수 일 것입니다. 일반적인 언어에서 '소켓'은 연결이 무언가에 연결되는 곳입니다. 두 가지 사이의 연결에는 양 끝에 각각 하나씩 두 개의 소켓이 있습니다. 네트워킹 Socket은 동일합니다. 하나는 클라이언트 프로그램에 있고 다른 하나는 서버 프로그램에 있습니다.

또한 서버 프로그램에 ServerSocket이 있지만 꽤 다른 것입니다. 소켓이 아니라 소켓을 만드는 장치입니다. 원래의 Berkeley 소켓 API에서 이것은 일종의 소켓으로 모델링되었으므로 (실수로?) Java에 따라 이름이 지정되었습니다.

서버 프로그램이 클라이언트 프로그램에서 개체를 만들 수 있는지 여부를 묻습니다. 소켓이있는 비즈니스가 서버 프로그램에서 객체를 만드는 클라이언트의 예라고 암시합니다. 그런 것들도 마찬가지입니다.서버 프로그램의 Socket은 전적으로 서버 코드로 작성됩니다.

이제는 하나의 프로그램에서 개체를 가져 와서 소켓으로 네트워크를 통해 보내도록 바이트로 인코딩 한 다음 다른 끝에서 해당 바이트의 새 개체를 다시 구성 할 수있는 기능이 있습니다 (serialization). 이것은 한 프로그램이 다른 프로그램을 원격으로 조작하는 것을 허용하지 않으며 두 프로그램에 동시에있는 오브젝트를 작성하지 않지만 두 개의 협력 프로그램이 오브젝트를 다른 프로그램으로 복사하도록합니다.

예 : JB가 말했듯이 static에 대해 오해했습니다. 변수 static을 선언하면 선언 된 클래스의 인스턴스가 아니라 선언 된 클래스에 속한다는 것을 의미하므로 클래스의 인스턴스 당 하나가 아닌 해당 프로그램에 변수 복사본이 하나만 있습니다 . 그러나 프로그램에 영향을 미치지는 않습니다. 서로 다른 프로그램에는 변수의 유니버스가 완전히 별도로 있으므로 각 변수에 static 개의 변수가 있습니다.

+0

죄송합니다. 정적 인 것을 설명하는 것이 좋지 않다고 생각합니다. 죄송합니다. 예를 들어 클래스에서 List를 만든 다음 여러 개체를 만들고 해당 개체를 생성 할 때 생성자가 같은 양의 개체를 가질 경우 추가합니다. 내가 어디에서 참조했는지 상관없이, 맞습니까? 그리고 그 주석이 매우 유익했기 때문에 감사합니다, 나는 이것이 교육을받을 곳이 아니라는 것을 이해하지만, 아마도 좋은 책을 추천 할 수 있을까요? –

+0

예를 들어 정적에 대해 말하는 것을 이해하지 못합니다. 당신의 문장은 기형입니다. 그리고 저는 그것의 머리도 꼬리도 만들 수 없습니다. –

+0

읽을 거리는 네트워킹에 대한 확실한 소개가 필요하다고 생각합니다. Java 네트워킹 자습서에서 [All About Sockets] (http://docs.oracle.com/javase/tutorial/networking/sockets/index.html) 강의를 볼 수 있습니다. 좋은 입문 자바 서적의 네트워킹 섹션도 트릭을해야한다. 나는 [Just Java] (http://www.amazon.com/Just-Java%C2%BF-6th-Peter-Linden/dp/0131482114/)를 좋아한다.) 내가 그것을 읽을 때, 그러나 그것은 10 년 전에 지금이었다! –