Socket接口用法详解java
在Java中,基于TCP协议实现网络通讯的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是创建一个Server,并经过accept()方法随时监听客户端的链接请求。程序员
扩展:编程
ServerSocket中经常使用的构造函数及方法数组
构造函数:ServerSocket(intport) 这是一个构造方法,用于在当前的服务器默认的IP地址上监听一个指定的端口,即在指定的IP和端口建立一个ServerSocket对象服务器
方法:微信
Socket accept()产生阻塞,监听指定的端口,直至有客户端发来链接请求网络
void close() 关闭当前ServerSocket并发
InetAddressgetInetAddress() 返回ServerSocket监听的,本机的IP地址socket
intgetLocalPort() 返回ServerSocket监听的,本机的IP地址上指定的端口号函数
intgetSoTimeout();void setSoTimeout(int timeout) 设置链接过程当中没有获得相应的等待期限时间(TimeOut)
StringtoString() 以字符串的方式返回ServerSocket监听的,本机的IP地址及其端口号
Socket类中经常使用的构造函数和方法
构造函数:Socket(InetAddressaddress,int port) 用于建立一个连接,向指定的IP地址上指定的端口的服务器端程序发送链接请求
Socket(Stringhost,int port) 同上,但该方法容许经过主机名字符串向服务器发送链接请求
方法:
void close()关闭当前的Socket 链接
InetAddressgetInetAddress() 返回Socket创建了链接的服务器的IP地址
InputStreamgetInputStream() 返回当前Socket的输入流
OutputStreamgetOutStream() 返回当前Socket的输出流
InetAddressgetLocalAddress() 返回和Socket进行链接的本地的IP地址
intgetLocalPort() 返回和Socket进行链接的本地的端口号
int getPort() 返回和Socket创建了链接的服务器的端口号
intgetSoTimeOut();void setSoTimeOut(int timeout) 设置链接过程当中没有获得相应的等待期限时间
String toString() 以字符串的方式返回Socket的属性信息
Socket类的构造方法包括如下几种:
public Socket(String host,int port)
public Socket(InetAddress address,int port)
public Socket(String host,int port,InetAddresslocalAddr,int localPort)
public Socket(InetAddress host,int port, InetAddress,localAddr,intlocalPort)
在JDK1.1之前,Socket类可同时用于TCP/UDP通讯:
public Socket(String host,int port,Booleanstream)
public Socket(InetAddress host,int port, Booleanstream)
Socket类的输入/输出流管理包括如下方法:
public InputStream getInputStream()
public void shutdowmInput()
public OutputStream get OutputStream ()
public void shutdowmOutput()
以上这些方法都将抛出IOException异常,程序中须要捕获并处理。
关闭Socket的方法为:
public void close() throws IOException
设置/获取Socket数据的方法为:
public InetAddress getInetAddress()
public int getPort()
public void setSoTimeout(int timeout)
这些方法都将抛出SocketException异常,程序中须要捕获并处理。
ServerSocket类的构造方法包括如下几种:
public ServerSocket (int Port)
public ServerSocket (int Port,int backlog):支持指定数目的链接
public ServerSocket (int Port,intbacklog,InetAddress bindAddr)
这些方法都将抛出IOException异常,程序中须要捕获并处理。
public Socket accept():等待客户端的链接
public void close():关闭Socket
设置/获取Socket数据的方法包括:
public InetAddress get InetAddress ()
public int getLocalPort()
public void setSoTimeout(int timeout)
这些方法都将抛出SocketException异常,程序中须要捕获并处理。
Socket的基本概念
1.创建链接
当须要创建网络链接时,必须有一台机器运行一个程序,随时等候链接,而另外一端的程序这对其发出链接请求。这一点同电话系统相似——必须有一方拨打电话,而另外一方必须等候电话连通。创建链接的过程为:
(1)如今服务器端生成一个ServerSocket实例对象,随时监听客户端的链接请求。
(2)当客户端须要链接时,相应地要生成一个Socket实例对象,并发出链接请求,其中host参数指明该主机名,port#参数指明该主机端口号。
(3)服务器端经过accept()方法接收到客户端的请求后,开辟一个接口与之进行链接,并生成所需的I/O数据流。
(4)客户端和服务器端的通讯都是经过一对InputStream和OutputStream进行的,通讯结束后,两端分别关闭对应的Socket接口。
2.链接地址
打电话时,呼叫方必须事先知道所需拨打的号码,而程序创建网络链接时,也一样须要知道地址或主机名称。另外,网络链接还须要一个端口号(能够将其看成电话的分机号),链接到正确的主机以后,须要对该链接确认特定口令。某些状况下,还须要使用一个扩展号码与网络计费系统相连,因而相应地要有一个特定端口号用于链接计费程序。
3.端口号
在TCP/IP系统中,端口号由16位二进制整数组成,即在0-65535之间。实际应用中,前1024个端口号已经预先定义为一些特定服务,所以通常不能使用,除非想同这些服务器进行链接(如Telnet,SMTP,mail,ftp等)。在两个程序链接以前,彼此之间必须达成一致,即由客户端负责初始化链接,而服务器随时等候请求。只有客户端和服务器端指定端口号一致时链接才会创建。若是系统中两个程序所用端口号不一致,这链接没法创建。
4.网络链接模式
在Java中,TCP/IP接口的链接是由java.net包中的类实现的。如图表示的是Socket链接过程当中客户端和服务器端的工做原理。
每一个server端都拥有一个端口号,一台机器上若是运行多个服务,这可能对应多个端口号。通讯结束后,两端分别关闭对应的Socket接口,而不影响其余的端口。
Socket通讯的基本步骤
使用Socket方式进行网络通讯的程序基本结构都是相似的,不管一个Socket通讯程序的功能多么齐全、程序多么复杂,其基本结构都是同样的。客户端与服务器端进行通讯的过程都包括如下四个基本步骤:
(1)在服务器端指定一个用来等待链接的端口号,在客户端规定一个主机和端口号,从而在客户端和服务器端建立Socket/ServerSocket实例。
(2)打开链接到Socket的输入输出流。
(3)利用输入输出流,按照必定的协议对Socket进行读写操做。
(4)关闭输入输出流和Socket
一般,程序员的主要工做时针对所要完成的功能砸器第(3)步进行编程,第(1)、(2)、(4)步对全部的通讯程序来讲几乎都是同样的。
Socker通讯的程序设计
1.服务器端程序
TCP/IP服务器端应用程序是经过Java语言中提供的ServerSocket和Socket这两个有关网络的类来实现的。而ServerSocket类除了创建一个Server以外,还经过accept()方法提供了随时监听客户端链接请求的功能,它的构造方法有如下两种。
ServerSocket(int port)
ServerSocket(int port,int backlog)
其中port是指链接中对方的端口号,backlog则表示服务器端所能支持的最大链接数。下面的程序用来监听客户端应用程序创建链接的请求,并在链接创建后向客户端发送信息。
/**
* 功能:这是服务器端程序,用来监听客户端应用程序创建链接的请求,并在链接创建后向客户端发送信息
*/
package com.xushouwei;
//引入相应的包
import java.net.*;
import java.io.*;
public class TServer
{
public static void main(String[] args)
{
//定义ServerSocket类
ServerSocket s=null;
//定义Socket类
Socket s1;
//定义发送字符串
String sendString="你好!我是徐守威...";
//获得发送字符串的长度
int s1lenth=sendString.length();
//定义OutputStream类
OutputStream s1out;
//定义DataOutputStream类
DataOutputStream dos;
//经过1314端口创建链接
try
{
//建立ServerSocket并把传入端口号
s=new ServerSocket(1314);
} catch (Exception e)
{
e.printStackTrace();
}
//循环运行监听程序,以监视链接请求
while(true)
{
try
{
//监听端口请求,等待链接
s1=s.accept();
//获得与socket相链接的数据流对象
s1out=s1.getOutputStream();
dos=new DataOutputStream(s1out);
//发送字符串
dos.writeUTF(sendString);
//关闭数据流(但不是关闭Socket链接)
dos.close();
s1out.close();
s1.close();
} catch (Exception e)
{
e.printStackTrace();
}
}
}
}
2.客户端程序
TCP/IP服务器端应用程序是经过Java语言中提供的Socket类来实现的。一样,Socket类提供了包括创建网络链接在内的许多功能,它的构造方法有如下几种:
Socket(InetAddress address,int port)
Socket(InetAddress address,int port,Booleanstream)
Socket(String host,int port)
Socket(String host,int port, InetAddresslocalAddr,int localPort)
其中,address、host和port分别指链接另外一方的IP地址、主机名称和端口号,stream这表示该Socket是不是支持流的Socket,localAddr和localPort是本机的地址和端口号。下面程序用来与前面的服务器端程序创建链接,并将服务器端送来的信息显示在标准输出上。
/**
* 功能:这是客户端程序,用来与前面的服务器端程序创建链接,并将服务器端送来的信息显示在标准输出上
*/
package com.xushouwei;
//引入相应的包
import java.net.*;
import java.io.*;
public class TClint
{
public static void main(String[] args)
{
//定义Socket类
Socket s1;
//定义InputStream类
InputStream s1In;
//定义DataInputStream类
DataInputStream dis;
try
{
//在端口1314打开链接
s1=new Socket("127.0.0.1",1314);
//得到socket端口的输入句柄,并从中读取数据
s1In=s1.getInputStream();
dis=new DataInputStream(s1In);
String st=new String(dis.readUTF());
System.out.println(st);
//操做结束,关闭数据流及socket链接
dis.close();
s1In.close();
s1.close();
} catch (Exception e)
{
e.printStackTrace();
}
}
}
了解更多详情请登陆超人学院网站http://www.crxy.cn或者关注CRXY大数据微信号:CRXY-CN