第二章 Socket用法详解

2.1 构造Socket

  Socket构造方法如下:

 1 Socket()
 2 //Creates an unconnected socket, with the system-default type of SocketImpl.
 3
 4 Socket(InetAddress address, int port)
 5 //Creates a stream socket and connects it to the specified port number at the
 6 //specified IP address.
 7
 8 Socket(InetAddress host, int port, boolean stream)
 9 //Deprecated.
10 //Use DatagramSocket instead for UDP transport.
11
12 Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
13 //Creates a socket and connects it to the specified remote address on the
14 //specified remote port.
15
16 Socket(Proxy proxy)
17 //Creates an unconnected socket, specifying the type of proxy, if any, that
18 //should be used regardless of any other settings.
19
20 Socket(SocketImpl impl)
21 //Creates an unconnected Socket with a user-specified SocketImpl.
22
23 Socket(String host, int port)
24 //Creates a stream socket and connects it to the specified port number on the
25 named host.
26
27 Socket(String host, int port, boolean stream)
28 //Deprecated.
29 //Use DatagramSocket instead for UDP transport.
30
31 Socket(String host, int port, InetAddress localAddr, int localPort)
32 //Creates a socket and connects it to the specified remote host on the specified
33 //remote port. 

  除了第一个无参,其余构造方法都试图建立与服务器的连接,如果成功则返回Socket对象,否在抛出异常。

  根据以上构造方法来创建一个类,用于扫描主机上1-1024之间的端口是否被服务器程序监听(如果被监听,就可以返回Socket对象)。代码如下:

import java.io.IOException;
import java.net.Socket;

public class PortScanner {

    public static void main(String[] args) {
        String host="localhost";
        new PortScanner().scan(host);

    }
    public void scan(String host){
        Socket socket=null;
        for(int port=1;port<=1024;port++){
            try{
                socket=new Socket(host,port);
                System.out.println("There is a server on port "+port);
            }catch(IOException e){
                System.out.println("Can‘t connect to port "+port);
            }finally{
                if(socket!=null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}

  

  2.1.1 设定等待建立连接的超时时间

    当需要设定连接超时时间时,则需要调用Socket的无参构造函数。

    

Socket socket = new Socket();
//SocketAddress 提供不可变对象,供套接字用于绑定、连接或用作返回值。
SocketAddress remoteAddr = new InetSocketAddress("localhost",8000);
//超时未连接时,会抛出超时异常。
socket.connect(remoteAddr,60000);//毫秒为单位,0表示用于不超时

  2.1.2 设定服务器地址

    除了第一个无参构造函数,其余都需要提供服务器IP或主机名,以及端口号。

    

1 Socket(InetAddress address,int port)  //第一个参数表示主机IP地址
2 Socket(String host,int port)  //第一个表示主机名

    InetAddress类表示服务器的IP地址,详情查看这里

  2.1.3 设定客户端地址

  一个socket对象应该包含远程服务器的IP和端口信息,也包含本地客户机的IP地址和端口信息。默认情况下,客户机的IP来自于本地主机,端口有操作系统自动分配。也可以显式的设置客户端的IP和端口。

   

 Socket(InetAddress address,int port,InetAddress localAddress,int localPort)
 Socket(String host,int port,int port,InetAddress localAddress,int localPort)

  2.1.4 客户机连接服务器可能出现的异常

   

UnKnownHostException 无法识别主机的名字或IP地址
ConnectException 服务器没有对应的端口或服务器拒绝连接
SocketTimeoutException 等待连接超时
BindException 无法与指定的本地IP或端口绑定
   
   
   
   

2.2 获取Socket信息

  以下方法可获得Socket相关信息:

 1 InetAddress getInetAddress()
 2 //Returns the address to which the socket is connected.
 3
 4 InputStream getInputStream()
 5 //Returns an input stream for this socket.
 6
 7 OutputStream getOutputStream()
 8 //Returns an output stream for this socket.
 9
10 int getPort()
11 //Returns the remote port number to which this socket is connected.
12
13 InetAddress getLocalAddress()
14 //Gets the local address to which the socket is bound.
15
16 int getLocalPort()
17 //Returns the local port number to which this socket is bound. 

2.3关闭Socket

  部分代码如下:

if(socket!=null){
    try {
        socket.close();
    } catch (IOException e) {
        e.printStackTrace();
        }
    }}

  Socket提供了3个状态测试方法:

boolean isBound()
//Returns the binding state of the socket.

boolean isClosed()
//Returns the closed state of the socket.

boolean isConnected()
//Returns the connection state of the socket.

2.4 半关闭Socket

  进程A与进程B通信时,A传输数据到B,如何告知B所有数据已经传输完毕呢?以下几个方法:

  (1) 发送一行特殊的字符串,如前一章使用的“bye”,告知输出完毕。

  (2) A先告诉B字符串的长度,在向B传输数据。

  (3) A发送完成后,关闭Socket。此时B读完数据后,在此执行read()时,该方法返回-1,如果执行BufferedReader的readLine()方法,则返回null。以此表示到达输入流末尾。

  (4) 关闭Socket的输入输出流

shutdownInput():关闭输入流

shutdownOutput():关闭输出流

对应两个状态测试方法:

  isInputShutdown()

  isOutputShutdown()

时间: 2024-10-18 09:36:00

第二章 Socket用法详解的相关文章

java Socket用法详解(转)

在客户/服务器通信模式中, 客户端需要主动创建与服务器连接的 Socket(套接字), 服务器端收到了客户端的连接请求, 也会创建与客户连接的 Socket. Socket可看做是通信连接两端的收发器, 服务器与客户端都通过 Socket 来收发数据. 这篇文章首先介绍Socket类的各个构造方法, 以及成员方法的用法, 接着介绍 Socket的一些选项的作用, 这些选项可控制客户建立与服务器的连接, 以及接收和发送数据的行为. 一. 构造Socket Socket的构造方法有以下几种重载形式:

java.net.Socket用法详解

一.Socket构造方法 Socket() Socket(InetAddress address, int port) throws UnknowHostException, IOException Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException Socket(String host, int port) throws UnknowHostExceptio

第三章 ServerSpcket用法详解

3.1 构造ServerSocket ServerSocket的构造方法如下: 1 ServerSocket() 2 //Creates an unbound server socket. 3 4 ServerSocket(int port) 5 //Creates a server socket, bound to the specified port. 6 7 ServerSocket(int port, int backlog) 8 //Creates a server socket an

SOCKET用法详解

在客户/服务器通信模式中,客户端需要主动创建与服务器的Socket(套接字),服务端收到了客户端的请求,也会创建与客户端连接的Socket. Scoket可以看作两端通信的收发器,服务端和客户端都通过Scoket收发数据~~~ 一:首先介绍Scoket的构造方法: 构造方法的重载: Socket() Socket(InetAddress address, int port) throws UnknowHostException, IOException Socket(InetAddress ad

第二章struts核心组件详解

2.1Struts2的配置文件Struts.xml 例2-1 struts.xml配置文件的基本结构 1.Action按模块配置 到多个配置文件中.--> 2. <include file="example.xml"/> 3. <!-- 所有的Action配置都应该放在package下 ,name定义包名,extends定义继承包空间struts-default.--> 4. <package name="zzf" extends

Java语言Socket接口用法详解

Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Server,并通过accept()方法随时监听客户端的连接请求. 扩展: ServerSocket中常用的构造函数及方法 构造函数:ServerSocket(int port) 这是一个构造方法,用于在当前的服务器默认的IP地址上监听一个指定的端口,即在指定的IP和端口创建一个ServerSocket对象

linux cp命令参数及用法详解---linux 复制文件命令cp

linux cp命令参数及用法详解---linux 复制文件命令cp [[email protected]Linux ~]# cp [-adfilprsu] 来源档(source) 目的檔(destination)[[email protected]linux ~]# cp [options] source1 source2 source3 -. directory参数:-a :相当于 -pdr 的意思:-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身:-

53 kvm及libvirt、使用virsh管理kvm虚拟机、网络虚拟化技术基础、网络名称空间netns用法详解

01 kvm及libvirt [[email protected] ~]# yum install libvirt libvirt-client python-virtinst virt-manager virt-install -y [[email protected] ~]# yum -y install qemu-kvm [[email protected] ~]# systemctl start libvirtd.service #创建桥 [[email protected] ~]# v

Node.js开发入门—Stream用法详解

Stream是Node.js中非常重要的一个模块,应用广泛.一个流是一个具备了可读.可写或既可读又可写能力的接口,通过这些接口,我们可以和磁盘文件.套接字.HTTP请求来交互,实现数据从一个地方流动到另一个地方的功能. 所有的流都实现了EventEmitter的接口,具备事件能力,通过发射事件来反馈流的状态.比如有错误发生时会发射"error"事件,有数据可被读取时发射"data"事件.这样我们就可以注册监听器来处理某个事件,达到我们的目的. Node.js定义了R