TCP相关类通常使用读写流的方式来接受、发送网络数据。
UDP则需要创建byte数组存储要接受和发送的文件。
构造方法:
常使用静态方法创建InetAddress对象。
1.
static InetAddress getByName(String host)
在给定主机名的情况下确定主机的 IP 地址,基于DNS服务器解析。主机名也可以是IP地址。
2.
static InetAddress getLocalHost()
返回本地主机IP和主机名,返回一个InetAddress对象。
3.
static InetAddress getByAddress(byte[] addr)
在给定原始 IP 地址的情况下,返回 InetAddress 对象。
4.
static InetAddress getByAddress(String host, byte[] addr)
根据提供的主机名和 IP 地址创建 InetAddress。
5.
static InetAddress getAllByName(String host)
根据主机名,返回其所有IP地址。大型网站的主机名对应多个IP地址,例如:百度
实例方法:
1.
String getHostAddress()
以字符串形式,返回 IP 地址。
2.
String getHostName()
以字符串形式返回,此 IP 地址的主机名,一般来说在远端主机上只能获得IP地址。
3.
String toString()
将此 IP 地址转换为 String。
具体代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8888);
//8888表示服务器要监听的端口,等待客户端连接。
//如果8888端口已经被其他进程占用,则会抛出异常IOException。
System.out.println("启动服务器....");
Socket s = ss.accept();
//接受客户端连接,Socket套接口对象。
System.out.println("客户端:"+s.getInetAddress().getLocalHost()+"已连接到服务器");
//getInetAddress()返回客户端IP地址,getLocalHost()返回域名和IP地址。
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//读取客户端发送来的消息。
String mess = br.readLine();
System.out.println("客户端:"+mess);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//向客户端发送消息。
bw.write(mess+"\n");
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ServerSocket不是一种Socket,它可以监听服务器端口(端口号对应着某个应用程序),来获取客户端的连接情况,通过接收客户端连接来建立Socket。如果监听端口已经被其他进程占用,则会抛出异常IOException。
具体代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
try {
Socket s = new Socket("127.0.0.1",8888);
//127.0.0.1为要进行通讯的服务器IP,8888为要客户端连接到的服务器端口
//客户端发起Https通讯要走传输层端口号443,而http通讯则是80端口。
//而服务器端端口号是指定的,不是固定的。
//构建IO
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
//向服务器端发送一条消息
bw.write("测试客户端和服务器通信,服务器接收到消息返回到客户端\n");
bw.flush();
//读取服务器返回的消息
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String mess = br.readLine();
System.out.println("服务器:"+mess);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Socket建立TDP连接,绑定服务器IP地址和指定服务器端口,与服务器建立连接。当服务器地址不正确或无法识别时,会抛出UnknownHostException异常,当Socket等待连接超时会抛出SocketTimeoutException异常,当服务器端代码口被占用无法绑定端口时,会抛出BindException异常,当服务器没有启动,没有监听对应端口或拒绝连接时,会抛出ConnectException异常,它们都是IOException的直接或间接子类。
SocketAddress是一个抽象类,通过InetSocketAddress实例化,是用于标识网络套接字地址的类,它提供了连接所需的目标地址信息,不提供连接服务。
构造方法:
public InetSocketAddress(InetAddress addr, int port)
通过给定ip地址和端口创建套接字地址标记
例:SocketAddress socketAddress = new InetSocketAddress(address, 80);
address是InetAddress对象,可以通过getByName获取
构造方法:
public Socket(String host, int port) throws IOException
创建一个流套接字并将其连接到指定主机上的指定端口号。
例:Socket s = new Socket("127.0.0.1",8888);
常用方法:
以下方法均为Socket对象的内部方法,可以通过.号来使用该方法。
例如:s.close()//s为Socket对象
1.
public void close() throws IOException
关闭套接字。
2.
public InetAddress getInetAddress()
返回套接字连接的地址,为InetAddress对象。
3.
public int getPort()
返回此套接字连接到的远程端口
4.
public int getLocalPort()
返回此套接字绑定到的本地端口。
5.
public InputStream getInputStream() throws IOException
返回此套接字的输入流,返回一个InputStream对象。
6.
public OutputStream getOutputStream() throws IOException
返回此套接字的输出流,返回一个OutputStream对象。
7.
public void connect(SocketAddress host, int timeout) throws IOException
将此套接字连接到服务器,并指定一个超时值。
若时间超过timeout还没有连接到服务端,则抛出异常SocketTimeoutException。
8.
public void bind(SocketAddress bindpoint) throws IOException
Socket绑定SocketAddress提供的IP地址和端口。
如果bindpoint为null,则系统会去寻找一个空闲的端口和一个有效的ip地址。
构造方法:
public ServerSocket(int port) throws IOException
监听服务器端口port
例: ServerSocket ss = new ServerSocket(8888);
常用方法:
1.
public int getLocalPort()
返回此套接字在其上侦听的端口。
2
public Socket accept() throws IOException
侦听并接受到此套接字的连接。
3
public void setSoTimeout(int timeout)
通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位。
通过Socket与HTTP服务器通讯,相对繁琐,用户必须掌握HTTP协议,但使用URL可以使Java程序更方便的访问http服务器。
URL统一资源定位符:定位资源位置。
URL组成:协议部分+资源名称部分。
构造方法:
如果URL对不支持的协议,或者未知的协议,则会抛出MalformedURLException异常。
public URL(String spec) throws MalformedURLException
通过解析url来创建新的URL对象
例子:
public final InputStream openStream() throws java.io.IOException
打开URL连接,并返回一个用于该连接读取的InputStream流。
它是openConnection().getInputStream()的缩写。
它可以作为客户端发送数据,也可以作为服务器端接受数据,当要发送或接收UDP数据时,首先要创建一个DatagramSocket对象。
在发送或接收UDP数据时,要创建一个DatagramPacket对象。DatagramPacket使用byte数组来存放发送和接受的数据。
具体代码:
import java.io.IOException;
import java.net.*;
public class Main {
public static void main(String[] args) {
try {
InetAddress address;
byte[]add="172.28.4.0".getBytes();
address= InetAddress.getByAddress(add);
DatagramSocket socket =new DatagramSocket(8091,address);
//创建DatagramSocket对象。
byte[]message="hello".getBytes();
//String类转byte[]数组的内部方法。
DatagramPacket dp=new DatagramPacket(message, message.length);
socket.send(dp);
//发送数据,要提前建立byte[]数组。
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}