Java에서는 Sockets
이라는 객체를 사용하여 네트워크를 통해 특정 IP 및 포트로 데이터를 보낼 수 있습니다. 해당 데이터는 포트에서 수신 대기중인 ServerSocket
에 의해 수신됩니다.
소켓은 서버 소켓과 연결되면 원격 연결을 받아 들일 것입니다 ServerSocket#accept
, 를 호출 (호출이 응답 할 당신이 호출 할 경우 모든 호출을 대기 전에 accept
, 그것은 것입니다 허용 할 때까지 모든 발신 전화를 큐에 돌아 오기 전에 요청을 기다리십시오). accept
메서드는 데이터를 보내고 받기위한 입력 및 출력 스트림을 모두 가진 일반 소켓 객체를 반환합니다.
참고 : 같은 시간에 전화를 대기 할 수 여러 소켓마다 당신이 이 accept()
서버가 다음중인 소켓을 받아 호출합니다. accept 메서드는 Scanner
의 next()
메서드와 매우 유사하게 작동합니다. 은 혼란 스럽지만 여기에 대해 자세히 알아볼 수 있습니다 : ServerSocket listens without accept().
내가 (accept
에서 얻은) 서버 소켓의 입력 스트림에서 ObejctInputStream
를 구성 제안, 클라이언트 소켓의 출력 스트림에서 ObjectOutputStream
.
및 수신 데이터를 전송하는 두 소켓을해야 할 경우, 단순히 서버 측에 ObjectOutputStream
, 클라이언트 측의 ObjectInputStream
을 만들 수 있습니다. 루프를 사용하거나 두 유형의 스트림을 청취하려면 어떤 유형의 Runnable
을 사용해야합니다 (할당이 다중 스레드이므로 Runnable
이 가장 좋습니다).
일반적으로 한이 유사한 방식으로 클라이언트 소켓에 접근하는 것입니다 : 당신이 소켓을 사용하여 완료 할 때 shutdown
메소드를 호출하는 것이 중요하다
public class ObjectSocket{
private Socket socket;
private ObjectOutputStream streamOut;
private ObjectInputStream streamIn;
public ObjectSocket(String IP, int port) throws UnknownHostException, IOException {
//Request connection.
this.socket = new Socket(InetAddress.getByName(IP), port);
}
public void sendObject(Object obj) throws IOException {
if(this.streamOut == null) this.streamOut = new ObjectOutputStream(this.socket.getOutputStream());
//Make sure the connection is still there and the socket is still open.
if(this.socket.isConnected() && !this.socket.isClosed())
//Send it!
this.streamOut.writeObject(obj);
}
public Object recieveObject() throws IOException, ClassNotFoundException {
if(this.streamIn == null) this.streamIn = new ObjectInputStream(this.socket.getInputStream());
//Cast appropriately.
return this.streamIn.readObject();
}
public void shutdown() throws IOException {
//End the connection
this.socket.close();
}
}
. 포트를 열어두면 위험 할 수 있습니다.
서버 측 소켓은 거의 같은 방식으로 접근하고 있습니다 :
public class ServerObjectSocket {
private ServerSocket servSocket;
private Socket socket;
private ObjectOutputStream streamOut;
private ObjectInputStream streamIn;
public ServerObjectSocket(int port) throws IOException {
//Listen on this port : 0 will listen on a random port.
this.servSocket = new ServerSocket(port);
}
public void acceptConnectionRequest() throws IOException {
//Connect with any client socket that is trying this port
this.socket = servSocket.accept();
}
public Object recieveObject() throws IOException, ClassNotFoundException {
if(this.streamIn == null) this.streamIn = new ObjectInputStream(this.socket.getInputStream());
//Cast appropriately.
return this.streamIn.readObject();
}
public void sendObject(Object obj) throws IOException {
if(this.streamOut == null) this.streamOut = new ObjectOutputStream(this.socket.getOutputStream());
//Make sure the connection is still there and the socket is still open.
if(this.socket.isConnected() && !this.socket.isClosed())
//Send it!
this.streamOut.writeObject(obj);
}
public void shutdown() throws IOException {
//Close the port and end the connection : never leave a port open.
this.servSocket.close();
}
}
염두에 유지, 서로 다른 네트워크에 소켓 사이의 연결은 가능한 경우 전달 된 포트에서 실행에서 서버 소켓. LAN에서 실행중인 소켓은이 문제에 직면하지 않지만 방화벽에는 어려움이있을 수 있습니다.
더 나은 이해 또는 예제가 필요한 경우 인터넷에서 Java 소켓 자습서를 검색하십시오. 웹을 둘러싼 유용한 자습서가 많이 있으며 찾기가 어렵지 않습니다.
신청서를 어떻게 보내시겠습니까? – Stultuske
'별도의 프로그램이 아니라 객체로'란 의미는 무엇입니까? – EJP
@EJP 질문 제목으로 판단하면, 그는 서버 측에서만 프로그램을 실행하려고하고, 다른 방법은 서버 측 프로그램을 사용하여 원격 컴퓨터에서 클라이언트 소켓을 열 것이라고합니다. (어느 쪽이 가능하지 않습니까) –