1、网络编程
InetAddress类用于封装一个IP地址,其方法有:
方法
|
说明
|
InetAddress getByName(String host)
|
参数 host 表示指定的主机,该方法用于在给定主机名的情况下确定主机的 IP 地址。
|
InetAddress getLocalHost()
|
创建一个表示本地主机的 InetAddress 对象
|
Sitring getHostName
|
得到 IP 地址的主机名,如果是本机则是计算机名,如果不是本机则是主机名,如果没有域名则是 IP 地址
|
boolean isReachable(int timeout)
|
判断在指定的时间内地址是否可以到达
|
String getHostAddress
|
得到字符串格式的原始 IP 地址
|
InetAddress的简单用法
public static void main(String[] args) throws IOException {
InetAddress localAddress = InetAddress.getLocalHost();
InetAddress remoteAddress = InetAddress.getByName("www.baidu.com");
System.out.println("本机IP:"+localAddress.getHostAddress());
System.out.println("badu的IP地址:"+remoteAddress.getHostAddress());
System.out.println("3s是否可达:"+remoteAddress.isReachable(3000));
System.out.println("baidu的主机名为:"+remoteAddress.getHostName());
}
2、TCP编程
1、ServerSocket
(1) ServerSocket()
使用该构造方法在创建 ServerSocket 对象时并没有绑定端口号,这样的对象创建的服务器端没有监听任何端口,不能直接使用,还需要继续调用 bind(SocketAddress endpoint)方法将其绑定到指定的端口号上,才可以正常使用。
(2) ServerSocket(int port)
使用该构造方法在创建 ServerSocket 对象时可以将其绑定到一个指定的端口号上(参数 port 就是端口号)。端口号可以指定为 0,此时系统就会分配一个还没有被其他网络程序使用的端口号。由于客户端需要根据指定的端口号来访问服务器端程序,因此端口号随机分配的情况并不常用,通常都会让服务器端程序监听一个指定的端口号。
(3) ServerSocket(int port, int backlog)
该构造方法是在第二个构造方法的基础上增加了 backlog 参数。该参数用于指定在服务器忙时可以与之保持连接请求的等待客户数量,如果没有指定这个参数,默认为 50。
(4) ServerSocket(int port, int backlog, InetAddress bindAddr)
该构造方法是在第三个构造方法的基础上增加了 bindAddr 参数,该参数用于指定相关的 IP 地址。该构造方法适用于计算机上有多块网卡和多个 IP 的情况,使用时可以明确规定 ServerSocket 在哪块网卡或 IP地址上等待客户的连接请求。显然,对于只有一块网卡的情况,就不用专门的指定了。
方法
|
说明
|
Socket accept()
|
用于等待客户端的连接,在客户端连接之前会一直处于阻塞状态,如果有客户端连接,就会返回一个与之对应的 Socket 对象
|
InetAddress getInetAddress()
|
用于返回一个 InetAddress 对象,该对象中封装了 ServerSocket 绑定的 IP 地址
|
Boolean isClosed()
|
用于判断 ServerSocket 对象是否为关闭状态,如果是关闭状态则返回 true,反之则返回 false
|
Void bind(SocketAddress endpoint)
|
用于将 ServerSocket 对象绑定到指定的 IP 地址和端口号,其中参数 endpoint 封装了 IP 地址和端口号
|
服务器端程序
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TCP_Test {
public static void main(String[] args) {
ServerSocket server_socket = null;
Socket socket = null;
DataInputStream in = null;
DataOutputStream out = null;
int port = 5050;
try{
server_socket = new ServerSocket(port);
}catch(IOException e){
System.out.println(e);
}
try{
System.out.println("服务器启动");
socket = server_socket.accept();
//监听并接受到此Socket的连接
in= new DataInputStream(socket.getInputStream()); //创建输入流
out=new DataOutputStream(socket.getOutputStream()); //创建输出流
String str = in.readUTF(); //从输入流读取字符串,读取结束之前处于阻塞状态
} catch (IOException e) {
System.out.println(e);
}
finally{
try{
//关闭网络连接
out.close();
in.close();
socket.close();
server_socket.close();
} catch (IOException e) {}
}
}
}
2、socket
(1) Socket()
使用该构造方法在创建 Socket 对象时并没有指定 IP 地址和端口号,也就意味着只创建了客户端对象,并没有连接任何服务器。通过该构造方法创建对象后还需调用 connect(SocketAddress endpoint)方法,才能完成与指定服务器端的连接,其中参数 endpoint 用于封装 IP 地址和端口号。
(2) Socket(String host, int port)
使用该构造方法在创建 Socket 对象时会根据参数去连接在指定地址和端口上运行的服务器程序,其中参数 host 接收的是一个字符串类型的 IP 地址。
(3) Socket(InetAddress address, int port)
该构造方法在使用上与第二个构造方法类似,参数 address 用于接收一个 InetAddress 类型的对象,该对象用于封装一个 IP 地址。
方法
|
说明
|
int getPort()
|
返回一个 int 类型对象,该对象是 Socket 对象与服务器端连接的端口号
|
InetAddress getLocalAddress()
|
获取 Socket 对象绑定的本地 IP 地址,并将 IP 地址封装成 InetAddress 类型的对象返回
|
void close()
|
关闭 Socket 连接,结束本次通信。在关闭 Socket 之前,应将与 Socket 相关的所有输入输出流全部关闭,这是因为一个良好的程序应该在执行完毕时释放所有的资源
|
InputStream getinputStream()
|
返回一个 ImputStream 类型的输入流对象。如果该对象是由服务器端的 Socket 返回的,就用于读取客户端发送的数据;反之,就用于读取服务器端发送的数据
|
OutputStream
getOutputStream()
|
返回一个OutputStream 类型的输出流对象。如果该对象是由服务器端的Socket返回的,就用于向客户端发送数据;反之,就用于向服务器端发送数据
|
客户端程序
import javax.sound.sampled.Port;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCP_Test {
public static void main(String[] args) {
Socket client_socket = null;
DataInputStream in = null;
DataOutputStream out = null;
String IP = "39.156.66.14";
int port = 5050;
try{
client_socket = new Socket(IP, port);
in = new DataInputStream(client_socket.getInputStream());
out = new DataOutputStream(client_socket.getOutputStream());
out.writeUTF("客户机");
System.out.println("客户机启动");
String str = in.readUTF();
System.out.println("服务器端的响应信息:"+str);
} catch (Exception e) {
System.out.println(e);
}
finally{
try{
in.close();
out.close();
client_socket.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
}
3、UDP编程
UDP和TCP实现的功能类似,要求服务器端和客户端能正常进行网络通信,所以程序也分为服务器端和客户端两部分
服务器端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;
public class UDP_Test {
public static void main(String[] args) {
DatagramSocket socket = null;
DatagramPacket packet_send = null;
DatagramPacket packet_receive = null;
int port = 5151;
try{
socket = new DatagramSocket(port);
System.out.println("服务器启动");
byte[] r = new byte[1024];
packet_receive = new DatagramPacket(r,r.length);
socket.receive(packet_receive);
InetAddress client_ip = packet_receive.getAddress();
int client_port = packet_receive.getPort();
byte[] data = packet_receive.getData();
int len = packet_receive.getLength();
String str1 = new String(data,0,len);
System.out.println("客户机"+client_ip+"\n发送的信息是:"+str1);
String response = "Hello,I am server B";
byte[] s = response.getBytes();
packet_send = new DatagramPacket(s,s.length,client_ip,client_port);
socket.send(packet_send);
} catch (Exception e) {
System.out.println(e);
}
finally {
socket.close();
}
}
}
客户端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDP_Test {
public static void main(String[] args) {
DatagramSocket socket = null;
DatagramPacket packet_send = null;
DatagramPacket packet_receive = null;
String server = "127.0.0.1";
int port = 5151;
String str = "Hello,I am Client A";
byte[] data = str.getBytes();
try{
socket = new DatagramSocket(port);
InetAddress addr = InetAddress.getByName(server);
packet_send = new DatagramPacket(data,data.length,addr,port);
socket.send(packet_send);
byte[] r = new byte[1024];
packet_receive = new DatagramPacket(r,r.length);
socket.receive(packet_receive);
byte[] response = packet_receive.getData();
int len = packet_receive.getLength();
String str1 = new String(response,0,len);
System.out.println("服务器的响应是:"+str1);
} catch (Exception e) {
System.out.println(e);
}
finally {
socket.close();
}
}
}