Bir tcp sunucusu gibi davranmaktan sorumlu bir TcpServer sınıfına sahibim. Aşağıdaki sınıf bulabilirsiniz:İki farklı soket örneği aynı TCP bağlantı noktasını dinleyebilir (Bağlantı noktası zaten kullanılıyor)
public class TcpServer {
private ServerSocket serverSocket;
private Socket socket;
private int locallyBoundPort;
public TcpServer() {
}
public TcpServer(int locallyBoundPort) {
try {
this.serverSocket = new ServerSocket(locallyBoundPort);
serverSocket.setReuseAddress(true);
} catch (IOException e) {
System.out.println("Error at binding to port TCP : " + locallyBoundPort + "...cause : " + e.getMessage());
}
socket = null;
}
public void accept() {
try {
socket = serverSocket.accept();
socket.setReuseAddress(true);
} catch (IOException e) {
System.out.println("Error at accept : " + locallyBoundPort);
}
}
public void send(Data data) throws IOException {
if(socket != null) {
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.writeObject(data);
}
}
public Data receive() throws ClassNotFoundException, IOException {
if(socket != null) {
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
return (Data) in.readObject();
} else {
return null;
}
}
public boolean bind(int port) throws IOException {
try {
this.serverSocket = new ServerSocket(port);
this.locallyBoundPort = port;
} catch(IOException e) {
return false;
}
return true;
}
public void close() {
try {
serverSocket.close();
socket.close();
} catch (IOException e) {
OzumUtils.print("IOException in close, TcpServer");
}
}
public int getLocallyBoundPort() {
return locallyBoundPort;
}
public Socket getSocket() {
return socket;
}
public ServerSocket getServerSocket() {
return serverSocket;
}
}
Ve bunu yapan bir kod parçası var:
Ben kullanım hatası zaten bir port alıyorum AncakTcpServer tcpServer = new TcpServer(LocalPort);
while(1)
{
tcpServer.accept();
Thread thread = new Thread(new runnable(tcpServer));
thread.start();
tcpServer = new TcpServer(LocalPort);
}
. Bağlantının farklı ip veya portu olduğunda, aynı port üzerinden iki bağlantıya izin veren iki farklı soket örneğinin aynı portu dinleyebileceğini düşündüm. Neyi eksik?
Hayır, zaten dinleme durumunda olan bir bağlantı noktasını kullanamazsınız. Bununla birlikte, herhangi bir sayıda müşteri aynı bağlantı noktasına bağlanabilir. – m0skit0