Java网络编程学习笔记(2) socket用法

Socket用法详解

构造

Socket()
          通过系统默认类型的 SocketImpl 创建未连接套接字

Socket(InetAddressaddress, int port)
          创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

Socket(InetAddresshost, int port, boolean stream)
          已过时。 UseDatagramSocket instead for UDP transport.

Socket(InetAddressaddress, int port, InetAddresslocalAddr, int localPort)
          创建一个套接字并将其连接到指定远程地址上的指定远程端口。

Socket(Proxyproxy)
          创建一个未连接的套接字并指定代理类型(如果有),该代理不管其他设置如何都应被使用。

Socket(SocketImplimpl)
          使用用户指定的 SocketImpl 创建一个未连接Socket。

Socket(Stringhost, int port)
          创建一个流套接字并将其连接到指定主机上的指定端口号。

Socket(Stringhost, int port, boolean stream)
          已过时。 使用DatagramSocket 取代 UDP 传输。

Socket(Stringhost, int port, InetAddresslocalAddr, int localPort)
          创建一个套接字并将其连接到指定远程主机上的指定远程端口。

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

a)       客户端的Socket默认会一直等待或出现异常.可以先定Socket连接请求的时间,连接时间会受网络传输速度的影响,可能会处于长时间的等待状态.但是你可以用一下方法设置连接请求时间:

Socket socket=new Socket();

SocketAdress add=newSocketAdress("ip地址",端口);

Socket.connect(add,时间(毫秒));

超时后会抛出SocketTimeOutException异常

设定服务器地址(InetAddress)

构造方法可以接受一个InetAddress类型的参数也可以接受字符串,下面介绍下InetAddress的几种用法构造自身

a)InetAddress.getLocalHost();返回本机ip

b)InetAddress.getByName("ip地址");返回代表ip地址的InetAddress

c)InetAddress.getByName("域名") 返回郁闷代表的ip地址

设定客户端的地址

默认下Socket对象中,既包含远程服务器的IP地址和端口信息,也包含本地客户端的IP地址和端口.默认情况下.客户端的IP地址来源于客户程序所在的主机,客户端的端口则由操作系统随机分配,但是一个主机可以同时属于两个以上的网络,它就可能有用2个以上的ip,可以使用

Socket(InetAddressaddress, int port, InetAddresslocalAddr, int localPort)
    构造方法前面设定要连接的ip和端口,后面是客户端的ip和端口.但是记得地址要对称 意思是说局域网ip和局域网ip,网络地址和网络地址相称.

客户连接服务器的异常:

a)   UnknownHostException,无法识别出io地址

b)   ConnectException连接异常,通常是拒绝连接

c)   SocketTimeoutException 等待连接超时

d)   BindException Socket无法绑定ip或端口

获取Socket信息

e)   getInetAddress 获得服务器的ip地址

f)   getPort 获得远程服务器端口

g)   getLocalAddress 获得客户本地IP地址

h)   getLocalPort 获得客户本地端口

i)   getInputStream 获得输入流

j)   getOutputStream 获取输出流

Socket状态:

k)   isClosed 查看是否关闭

l)   isConnected 查看Socket是否曾连接到远程主机.

m)   isBound

关闭输入输出流"

n)   使用shutdownInput关闭输入流

o)   使用shutdownOutput关闭输出流

p)   使用is(Input/Output)Shutdown方法检查是否关闭

设置Scoket

TCP_NODELAY(客户端:Negale算法)

使用set/getTcpNoDelay(boolean)设置TCP_NODELAY选项,此选项设置是否采用Negale算法,false为采用/true是不采用.采用Negale算法就会是发送的数据先放入缓冲区,然后等待缓冲区满再发出,发送完一批数据后会等待接受方对这数据的回应后才会发送下一批.

b)SO_RESUSEADDR(服务端:是否接受完数据再释放)

使用setReuseAddress(boolean)设置,

决定如果网络上仍有数据向旧  ServerSocket传输数据,是否允许新的       ServerSocket绑定到旧的ServerSocket    相同的端口上.在bind端口前用

c)SO_TIMEOUT选项(服务端:接受数据的等待超时时间)

setSoTimeout(intmillisecounds)设置Socket将此选项设为非零的超时值时,在与此 Socket 关联的 InputStream 上调用 read() 将只阻塞此时间长度。如果超过超时值,将引发 java.net.SocketTimeoutException,虽然 Socket 仍旧有效。选项必须在进入阻塞操作前被启用才能生效。超时值必须是 > 0 的数。超时值为 0 被解释为无穷大超时值。

d)SO_LINGER选项(客户端:close后检查数据发送完数据后再关闭)

setSoLinger(boolean on,int linger)设置执行close方法后,会不会立即放回,linger是如果调用close方法会阻塞的时间秒为单位.设置的阻塞时间会让客户端将未发送完的数据发送.没有发送完的数据将会被丢弃

e)SO_RCVBUF(服务端:读取缓冲区大小)

setReceiveBufferSize(int)设置Socket用于输入数据的缓冲区的大小,一般来说传输大的数据块(HTTP/FTP)可以使用较大的缓冲区,可以提高传输效率,而对于频繁传输数据块较小的数据,则使用较小的缓冲区比较好.

f)SO_SENBUF(客户端:发送缓存区大小)

setSendBufferSize(int)设置Socket用于输出数据的缓冲区的大小.其大小设定同SO_RCVBUF设定

g)SO_KEEPALIVE选项(服务端:表示是否连接空闲时断开连接)

setKeepAlive(boolean),当设置为true(默认为false)表示底层的TCP实现会件事该连接是否有效.当连接处于空闲状态(无数据传递)超过了2小时时,本地的TCP实现会发送一个数据包给远程的Socket.如果超过12分钟未收到服务器的响应,则会自动关闭本地Socket断开连接.(不同网络平台时限有所差别)

h)OOBINLINE选项(接受TCP紧急数据)

setOOBInline(boolean)设置是否接受客户端的紧急数据,sendUrgentData(i)发送紧急数据,但是接收方会将紧急数据和普通数据放在一个队列中.

(10)设定连接时间,延迟和宽带的相对重要性

setPerformancePreferences(int 1,int 2,int 3)
1- 表达短连接时间的相对重要性的 int

2- 表达低延迟的相对重要性的 int

3- 表达高带宽的相对重要性的 int

你可能感兴趣的:(java,编程,socket,Stream,网络,服务器)