?? tcpipconnection.java
字號:
/*
* Copyright (c) 1996-2001
* Logica Mobile Networks Limited
* All rights reserved.
*
* This software is distributed under Logica Open Source License Version 1.0
* ("Licence Agreement"). You shall use it and distribute only in accordance
* with the terms of the License Agreement.
*
*/
package org.smpp;
import org.smpp.util.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InterruptedIOException;
import javax.net.ServerSocketFactory;
import javax.net.SocketFactory;
/**
* Implementation of TCP/IP type of communication.
* Covers both client (peer-to-peer) connection and server (new connections
* from clients accepting and creating) type of connections.
*
* @author Logica Mobile Networks SMPP Open Source Team
* @version $Revision: 1.3 $
* @see Connection
* @see java.net.Socket
* @see java.net.ServerSocket
* @see java.io.BufferedInputStream
* @see java.io.BufferedOutputStream
*/
public class TCPIPConnection extends Connection {
/**
* The IP address of the remote end of the <code>socket</code>.
*/
private String address = null;
/**
* The port number on the remote host to which the <code>socket</code>
* is connected or port number where <code>receiverSocket</code>
* is acception connections.
*/
private int port = 0;
/**
* The TCP/IP (client) socket.
*
* @see java.net.Socket
*/
private Socket socket = null;
/**
* An input stream for reading bytes from the <code>socket</code>.
*
* @see java.io.BufferedInputStream
*/
private BufferedInputStream inputStream = null;
/**
* An output stream for writting bytes to the <code>socket</code>.
*
* @see java.io.BufferedOutputStream
*/
private BufferedOutputStream outputStream = null;
/**
* Indication if the <code>socket</code> is opened.
*/
private boolean opened = false;
/**
* The server socket used for accepting connection on <code>port</code>.
*
* @see #port
* @see java.net.ServerSocket
*/
private ServerSocket receiverSocket = null;
/**
* Indicates if the connection represents client or server socket.
*/
private byte connType = CONN_NONE;
/**
* Indicates that the connection type hasn't been set yet.
*/
private static final byte CONN_NONE = 0;
/**
* Indicates that the connection is client type connection.
* @see #socket
*/
private static final byte CONN_CLIENT = 1;
/**
* Indicates that the connection is server type connection.
* @see #receiverSocket
*/
private static final byte CONN_SERVER = 2;
/**
* Default size for socket io streams buffers.
* @see #initialiseIOStreams(Socket)
*/
private static final int DFLT_IO_BUF_SIZE = 2 * 1024;
/**
* Default size for the receiving buffer.
*/
private static final int DFLT_RECEIVE_BUFFER_SIZE = 4 * 1024;
/**
* The default maximum of bytes received in one call to
* the <code>receive</code> function.
* @see #maxReceiveSize
* @see #receive()
*/
private static final int DFLT_MAX_RECEIVE_SIZE = 128 * 1024;
/**
* The size for IO stream's buffers. Used by the instances of
* <code>BufferedInputStream</code> which are used as sreams for accessing
* the socket.
* @see #setIOBufferSize(int)
*/
private int ioBufferSize = DFLT_IO_BUF_SIZE;
/**
* The receiver buffer size. Can be changed by call to the function
* <code>setReceiveBufferSize</code>. This is the maximum count of bytes
* which can be read from the socket in one call to the socket's
* input stream's <code>read</code>.
* @see #setReceiveBufferSize(int)
* @see #receive()
*/
private int receiveBufferSize;
/**
* The buffer for storing of received data in the <code>receive</code>
* function.
* @see #setReceiveBufferSize(int)
* @see #receive()
*/
private byte[] receiveBuffer;
/**
* Max count of bytes which can be returned from one call
* to the <code>receive</code> function. If the returned data seems
* to be incomplete, you might want to call the <code>receive</code> again.
* @see #setMaxReceiveSize(int)
* @see #receive()
*/
private int maxReceiveSize = DFLT_MAX_RECEIVE_SIZE;
/**
* Instanciate a SocketFactory which will be used to create sockets later.
* Subclasses can override this field with e.g. a SSLSocketFactory
*/
protected SocketFactory socketFactory = SocketFactory.getDefault();
/**
* Instanciate a ServerSocketFactory which will be used to create server sockets later.
* Subclasses can override this field with e.g. a SSLServerSocketFactory
*/
protected ServerSocketFactory serverSocketFactory = ServerSocketFactory.getDefault();
/**
* Initialises the connection with port only, which means that
* the connection will serve as connection receiving server.
* The accepting of the connection must be invoked explicitly by
* calling of <code>accept</code> method.
*
* @param port the port number to listen on
*/
public TCPIPConnection(int port) {
if ((port >= Data.MIN_VALUE_PORT) && (port <= Data.MAX_VALUE_PORT)) {
this.port = port;
} else {
debug.write("Invalid port.");
}
connType = CONN_SERVER;
}
/**
* Initialises the connection for client communication.
*
* @param address the address of the remote end
* of the <code>socket</code>
* @param port the port number on the remote host
*/
public TCPIPConnection(String address, int port) {
if (address.length() >= Data.MIN_LENGTH_ADDRESS) {
this.address = address;
} else {
debug.write("Invalid address.");
}
if ((port >= Data.MIN_VALUE_PORT) && (port <= Data.MAX_VALUE_PORT)) {
this.port = port;
} else {
debug.write("Invalid port.");
}
connType = CONN_CLIENT;
setReceiveBufferSize(DFLT_RECEIVE_BUFFER_SIZE);
}
/**
* Initialises the connection with existing socket.
* It's intended for use with one server connection which generates
* new sockets and creates connections with the sockets.
*
* @param socket the socket to use for communication
* @see #accept()
*/
public TCPIPConnection(Socket socket) throws IOException {
connType = CONN_CLIENT;
this.socket = socket;
address = socket.getInetAddress().getHostAddress();
port = socket.getPort();
initialiseIOStreams(socket);
opened = true;
setReceiveBufferSize(DFLT_RECEIVE_BUFFER_SIZE);
}
/**
* Opens the connection by creating new <code>Socket</code> (for client
* type connection) or by creating <code>ServerSocket</code> (for
* server type connection). If the connection is already opened,
* the method is not doing anything.
*
* @see #connType
* @see java.net.ServerSocket
* @see java.net.Socket
*/
public void open() throws IOException {
debug.enter(DCOM, this, "open");
IOException exception = null;
if (!opened) {
if (connType == CONN_CLIENT) {
try {
socket = socketFactory.createSocket(address, port);
initialiseIOStreams(socket);
opened = true;
debug.write(DCOM, "opened client tcp/ip connection to " + address + " on port " + port);
} catch (IOException e) {
debug.write("IOException opening TCPIPConnection " + e);
event.write(e, "IOException opening TCPIPConnection");
exception = e;
}
} else if (connType == CONN_SERVER) {
try {
receiverSocket = serverSocketFactory.createServerSocket(port);
opened = true;
debug.write(DCOM, "listening tcp/ip on port " + port);
} catch (IOException e) {
debug.write("IOException creating listener socket " + e);
exception = e;
}
} else {
debug.write("Unknown connection type = " + connType);
}
} else {
debug.write("attempted to open already opened connection ");
}
debug.exit(DCOM, this);
if (exception != null) {
throw exception;
}
}
/**
* Closes the client or server connection.
*
* @see #connType
* @see #open()
*/
public void close() throws IOException {
debug.enter(DCOM, this, "close");
IOException exception = null;
if (connType == CONN_CLIENT) {
try {
if(inputStream != null)
inputStream.close();
if(outputStream != null)
outputStream.close();
if(socket != null)
socket.close();
inputStream = null;
outputStream = null;
socket = null;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -