Java 客户端Socket

Socket进行的操作步骤为:
1.连接远程服务器
2.本地和远程主机从socket取得输入流和输出流.
3.数据传输完毕,一端(Http)或者两端关闭连接.


构造函数Socket(String host,int port)throws UnknownHostException,IOExceptionm
的作用是 1.创建Socket对象 2尝试连接远程主机的socket
可以用此来确定端口是否占用,代码如下:

String host="localhost";
for(int i=0;i<1024;i++)
{
try {
Socket s=new Socket(host,i);
System.out.println("There is a server on port "+i);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
break;
} catch (IOException e) {

}

}


public Socket(InetAddress host,int port) throws IOException:与上面类似

public Socket(String host,int port,InetAddress interface ,int localPort)throws IOException,UnknwonHostException
:前两个参数指定远程主机和端口 后两个参数是指定从本地的主机网络接口和端口进行连接

Socket的常用方法:
public InetAddress getInetAddress():socket连接哪台远程主机
public int getPort():socket连接远程主机的端口号
public int getLocalPort():socket连接本地主机的端口号
public InetAddress getLocalAddress():socket邦定哪个网络接口
如下面代码所示:
try
{
Socket theSocket=new Socket("www.sina.com.cn",80);
InetAddress host=theSocket.getInetAddress();
int port=theSocket.getPort();
int localPort=theSocket.getLocalPort();
InetAddress localAddr=theSocket.getLocalAddress();
System.out.println("host="+host);
System.out.println("port="+port);
System.out.println("localport="+localPort);
System.out.println("localAddr="+localAddr);

}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{

}

执行结果为:
host=www.sina.com.cn/221.130.29.18
port=80
localport=4206
localAddr=/192.168.1.104


关闭Socket:
使用完一个socket之后应该将其关闭,一般在finally里面处理。
关闭一个socket之后,其InetAddress,端口号、本地地址、本地端口号,输入流、输出流 仍然可以访问,但是读取输入流数据或者向输出流写数据都会抛出一个IOException异常。

关闭Socket之前要判断socket的状态,
isClosed()方法只会对连接的socket返回正确结果,如果一个socket从未连接过,isClosed仍然返回false.

因而关闭socket的条件为boolean connected=socket.isConnected()&&!socket.isClosed()


Socket的选项:
TCP_NODELAY:设置为true,可确保包尽可能快的发送
SO_TIMEOUT:正常情况下,当读取socket时 read()会阻塞尽可能长的时间,已得到足够的字节。 0:表示无限超时
SO_RCVBUF setReceiveBufferSize()方法可设置socket输入缓冲所使用的字节数。

SO_KEEPALIVE: 客户端会偶尔通过一个空闲连接发送一个数据包(一般2个小时),确保服务器未崩溃。如果服务器没能相应此包,客户端会连续尝试11分钟时间,知道收到相应为止,如果在12分钟内仍未收到相应,客户端就关闭socket,没有SO_KEEPALIVE,不活动的客户端可能会永远存在下去,而不会注意到服务器已经崩溃


SO_REUSEADDR:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值