📄 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 com.logica.smpp;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.IOException;import java.io.InterruptedIOException;import java.net.ServerSocket;import java.net.Socket;import java.net.SocketException;import com.logica.smpp.util.ByteBuffer;/** * 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 1.0.1, 1 Oct 2001 * @see Connection * @see java.net.Socket * @see java.net.ServerSocket * @see java.io.BufferedInputStream * @see java.io.BufferedOutputStream *//* 26-09-01 ticp@logica.com debug code categorized to groups 27-09-01 ticp@logica.com receive() rewritten not to consume cpu time while waiting for data on socket 27-09-01 ticp@logica.com added customizable limit on maximum received bytes in one call to receive() 27-09-01 ticp@logica.com added prealocated buffer for socket reads with customizable size 28-09-01 ticp@logica.com the io streams buffer size is customizable now 01-10-01 ticp@logica.com traces added*/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; /** * 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 = new Socket(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 = new ServerSocket(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()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -