TCP服务端
服务端的工作就是一个通信终端,并被动等待客户端的链接。
package network;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
public class TCPEchoServer {
private static final int BUFSIZE = 32;
/**
* @param args
*/
public static void main(String[] args) {
int servPort = Integer.parseInt(args[0]);
try {
// 创建一个ServerSocket实例并指定本地端口。此套接字的功能是侦听该指定端口收到的连接。
ServerSocket servSock = new ServerSocket(servPort);
int recvMsgSize;
byte[] receiveBuf = new byte[BUFSIZE];
//重复执行
while (true) {
//调用 ServerSocket 的 accept()方法以获取下一个客户端连接,
//基于新建立的客户端连接,创建一个 Socket 实例,并由 accept()方法返回。
Socket clntSock = servSock.accept();
SocketAddress clientAddress = clntSock.getRemoteSocketAddress();
System.out.println("Handling client at " + clientAddress);
//使用所返回的 Socket实例的 InputStream和 OutputStream与客户端进行通信
InputStream in = clntSock.getInputStream();
OutputStream out = clntSock.getOutputStream();
while ((recvMsgSize = in.read(receiveBuf)) != -1) {
out.write(receiveBuf, 0, recvMsgSize);
}
//使用 Socket 类的 close()方法关闭该客户端套接字连接
clntSock.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ServerSocket的唯一目的是新的TCP链接请求创建一个已链接的socket实例。当服务器准备好处理请求时,调用accept(),该方法阻塞等待,直到有向 ServerSocket 实例指定端口的新的连接请求到来。accept()方法返回一个socket实例,该实例链接到客户端的套接字,并且准备好了数据。
ServerSocket: 创建
ServerSocket(int localPort)
ServerSocket(int localPort, int queueLimit)
ServerSocket(int localPort, int queueLimit, InetAddress localAddr)
ServerSocket()
端口号的有效范围是 0-65535,连接队列的大小以及本地地址也可以选择设置,最大队列长度不是一个严格的限制,也不能用来控制客户端的总数。
ServerSocket: 操作
void bind(int port)
void bind(int port, int queuelimit)
Socket accept()
void close()
ServerSocket: 获取属性
InetAddress getInetAddress()
SocketAddress getLocalSocketAddress()
int getLocalPort()
以上方法将返回服务器端套接字的本地地址和端口号。
与 Socket 类不同的是,ServerSocket 没有相关联的 I/O 流。然而,它有另外一些称为选项(options)的属性,并能通过多种方法对选项进行控制。