저는 네트워크 프로그래밍에 익숙하지 만 여기에 내 문제에 대한 해결책을 찾고 있지만 찾지 못했습니다. 내가 원하는 것은 동시에 여러 소켓에서 파일을 수신 할 수있는 서버를 갖는 것입니다. 서버가 새로운 연결 소켓을 받아들이면 소켓을 ClientThread 클래스로 래핑합니다. 다음은 코드입니다.한 번에 여러 소켓에서 데이터 받기 (멀티 스레딩)
public class Server extends Thread {
private ServerSocket server;
private Vector<ClientThread> clients;
@Override
public void run() {
listen();
}
private void listen() {
new Thread("Listening Thread") {
@Override
public void run() {
while (true) {
try {
Socket socket = server.accept();
ClientThread newClient = new ClientThread(socket);
newClient.start();
clients.addElement(newClient);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}.start();
}
ClientThread는 Server 클래스 내부의 개인 클래스입니다. ObjectInputStream에서 Object를 항상 청취하고 있지만 객체 뒤에 하나의 큰 파일을받을 수 있기를 원합니다. 그래서 멀티 스레딩을 사용해야한다고 생각합니다. 여기에 코드입니다 : (? 내가 추측)
private class ClientThread extends Thread {
public Socket socket;
private boolean loggedIn;
private ObjectInputStream ois;
private BufferedInputStream bis;
public ClientThread(Socket socket) {
this.socket = socket;
loggedIn = true;
InputStream is = socket.getInputStream();
ois = new ObjectInputStream(is);
bis = new BufferedInputStream(is);
}
@Override
public void run() {
receive();
}
private void receive() {
while (loggedIn) {
try {
// this method blocks i guess
Object object = ois.readObject();
// after the object comes the large file
byte[] bytes = new byte[SOME_SIZE];
int bytesRead;
int totalRead = 0;
// reading the large file into memory
while ((bytesRead = bis.read(bytes, totalRead, bytes.length - totalRead)) > -1) {
totalRead += bytesRead;
}
// rest of the code for handling received bytes.......
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
}
}
}
모든 클라이언트 소켓이 서버에 동일한 포트로 데이터를 전송하기 때문에이 같은 데이터를 수신하는 경우에도 가능하면 잘 모르겠어요. 그리고 클라이언트가 동시에 데이터를 보내는 경우 서버는 어떤 데이터가 어떤 클라이언트에 해당하는지 알아야합니다. 이미 처리되었거나 완전히 다른 접근 방식이 필요합니까?
나는 이것이 어리석은 질문인지는 모르겠다.하지만 나는이 재료를 배우기 시작했다고 말했다. 또한 나는 아직 클라이언트에 대한 코드가 없기 때문에 내 프로그램을 테스트 할 수 없었다. 내가 처음부터 잘못하지 않았는지 확인하고 싶습니다. 이것이 잘못된 경우 몇 가지 아이디어를 게시하십시오. :) 감사!
작년에 유사한 요청을 추가하고 Netty http://netty.io/를 사용하여 끝내 었으며 소켓이 telnet인지 또는 몇 가지 예제가있는 http://netty.io/wiki/가 있습니다. udp. – Deceiver
"이 모든 클라이언트 소켓이이 서버의 동일한 포트에 데이터를 보내고 있기 때문에 이와 같은 데이터를 수신하는 것이 가능할 지 모르겠습니다."- 클라이언트가 하나의 단일 포트에 연결됩니다. 그러나 그들은 ** 고유 한 ** local ** 포트를 제공받습니다. 그래서 예, 실제로 동일한 (공개 서버) 포트에 연결된 많은 클라이언트로부터 동시에받을 수 있습니다. – Fildor
분명히 말하자면, 그들이 모두 동일한 클라이언트 호스트에 있다면 고유 한 로컬 포트가 주어집니다. 유일한 로컬 포트가 필요한 유일한 시간입니다. – EJP