记一下笔记
常用的API:
Socket(String host, int post):创建一个套接字,用来连接给点的主机和端口
Socket():创建一个还未被连接的套接字
void connect(SocketAddress address):将套接字连接到指定的地址
void setSoTimeout(int timeoutInMilliseconds):设置套接字上读请求的阻塞时间
boolean isConnected():如果套接字已经连接,则返回true
boolean isClosed():如果套接字已经关闭,则返回true
因为Socket(String host, int post)会一直无期限阻塞下去,直到建立了到达主机的初始连接为止。所以可以通过先构建无连接的套接字,然后再使用一个超时来进行连接的方式解决这个问题:
Socket s = new Socket();
s.connect(new InetSocketAddress(host,port),timeout);
static InetAddress getByName(String host)
static InetAddress[] getAllByName(String host):为给定的主机名创建一个InetAddress对象,或者一个包含了该主机名所对应的所有因特网地址的数组
static InetAddress getLocalHost():为本地主机创建一个InetAddress对象
byte[] getAddress():返回一个包含数字型地址的字节数组
String getHostAddress():返回主机地址
String getHostName():返回主机名
ServerSocket(int port):创建一个监听端口的服务器套接字
Socket accept():等待连接。该方法阻塞当前线程知道建立连接为止。该方法返回一个Socket对象,程序可以通过这个对象与连接中的客户端进行通信
void close():关闭服务器套接字
如果有多个客户端同时连接到服务器上,常常有以下代码:
while(true)
{
Socket incoming = s.accept();
Runnable r = new ThreadedEchoHandler(incoming);
Thread t = new Thread(r);
t.start();
}
其中ThreadedEchoHandler类实现了Runnable接口,而且在它的run方法里包含了很多与客户端通信的代码。
半关闭:套接字连接的一端可以终止其输出,同时仍旧可以接受来自另一端的数据。可以通过关闭一个套接字的输出流来表示发生给服务器的请求数据已经结束,但必须保持输入流处于打开状态。
void shutdownOutput():将输出流设置为“流结束”
void shutdownInput():将输入流设为“流结束”
boolean isOutputShutdown():如果输出已经被关闭,则返回true
boolean isInputShutdown():如果输入已经被关闭,则返回true
InetSocketAddress(String hostname,int port):用给定的主机和参数创建一个地址对象,并在创建过程中解析主机名
boolean isUnresolved():如果不能解析该地址对象,则返回true
static SocketChannel open(SocketAddress address):打开一个套接字通道,并连接到远程地址
static InputStream newInputStream(ReadableByteChannel channel):创建一个输入流,用以从指定的通道读取数据
static OutputStream newOutputStream(WritableByChannel channel):创建一个输出流,用以向指定的通道写入数据
用通道套接字类SocketChannel可以创建一个可中断的套接字,当线程正在执行打开、读取或写入操作时,如果线程发送中断,那么这些操作将不会陷入阻塞,而是抛出异常。