/*
* Copyright 2015-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package sockslib.server;
import sockslib.common.SocksException;
import sockslib.common.net.NetworkMonitor;
import sockslib.server.msg.ReadableMessage;
import sockslib.server.msg.WritableMessage;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.Map;
/**
* The class <code>Session</code> represents a session between client with SOCKS server.
* This class is simple encapsulation of java.net.Socket.
*
* @author Youchao Feng
* @version 1.0
* @date Apr 5, 2015 10:21:28 AM
*/
public interface Session {
/**
* Returns socket.
*
* @return socket that connected remote host.
*/
Socket getSocket();
/**
* Writes bytes in output stream.
*
* @param bytes Bytes
* @throws SocksException If a SOCKS protocol error occurred.
* @throws IOException If an I/O error occurred.
*/
void write(byte[] bytes) throws SocksException, IOException;
/**
* Writes bytes in output stream.
*
* @param bytes Bytes
* @param offset Offset
* @param length Bytes length.
* @throws SocksException If a SOCKS protocol error occurred.
* @throws IOException If an I/O error occurred.
*/
void write(byte[] bytes, int offset, int length) throws SocksException, IOException;
/**
* Writes <code>Message</code> in output stream.
*
* @param message {@link WritableMessage} instance.
* @throws SocksException If a SOCKS protocol error occurred.
* @throws IOException If an I/O error occurred.
*/
void write(WritableMessage message) throws SocksException, IOException;
/**
* Read a buffer.
*
* @param bytes Buffer which read in.
* @return Read length
* @throws SocksException If a SOCKS protocol error occurred.
* @throws IOException If an I/O error occurred.
*/
int read(byte[] bytes) throws SocksException, IOException;
/**
* Reads a message.
*
* @param message a readable message.
* @return Read bytes size.
* @throws SocksException If a SOCKS protocol error occurred.
* @throws IOException If an I/O error occurred.
*/
int read(ReadableMessage message) throws SocksException, IOException;
/**
* Gets session ID.
*
* @return session ID.
*/
long getId();
/**
* Closes connection and removes itself from managed sessions.
*/
void close();
/**
* Gets input stream.
*
* @return Input stream.
*/
InputStream getInputStream();
/**
* Gets output stream.
*
* @return Output stream.
*/
OutputStream getOutputStream();
/**
* Gets all sessions that be managed.
*
* @return All sessions.
*/
Map<Long, Session> getManagedSessions();
/**
* Get remote host's IP address and port.
*
* @return Remote host's IP address and port.
*/
SocketAddress getClientAddress();
void setAttribute(Object key, Object value);
Object getAttribute(Object key);
/**
* Returns all attributes.
*
* @return All attributes.
*/
Map<Object, Object> getAttributes();
/**
* Clear all attributes in session.
*/
void clearAllAttributes();
/**
* Returns <code>true</code> if the session is closed.
*
* @return If the session is closed, it returns <code>true</code>.
*/
boolean isClose();
/**
* Returns <code>true</code> if the session is connected.
*
* @return If the session is connected returns <code>true</code>.
*/
boolean isConnected();
NetworkMonitor getNetworkMonitor();
}