InetAddress类
InetAddress常用方法
|
|
public static InetAddress getLocalHost() |
返回本地主机。 |
public static InetAddress getByName(String host) |
根据ip和主机名获取InetAddress |
public String getHostAddress() |
获取ip地址 |
public String getHostName() |
获取主机名 |
代码实现
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Demo {
public static void main(String[] args) throws UnknownHostException {
//获取本地主机InetAddress对象
InetAddress inetAddress=InetAddress.getLocalHost();
//获取本地IP地址
System.out.println(inetAddress.getHostAddress());
//获取本地主机名
System.out.println(inetAddress.getHostName());
System.out.println("------------------------");
//根据主机名获取InetAddress
InetAddress inetAddress1=InetAddress.getByName("shishuo");
System.out.println(inetAddress1);
}
}
UDP通信程序
DatagramSocket类
这类代表一个发送和接收数据包的插座。该类是遵循 UDP协议实现的一个Socket类。数据报套接字发送或者接收点的分组传送服务。每个发送的数据包或数据报套接字上接收单独寻址和路由。从一台机器发送到另一台机器的多个数据包可能会被不同的路由,并可以以任何顺序到达。在可能的情况下,一个新建的DatagramSocket有SO_BROADCAST套接字选项已启用,以便允许广播数据报传输。为了收到广播包应该将DatagramSocket绑定到通配符地址。在一些实施方案中,广播包,也可以接受当一个DatagramSocket绑定到一个更具体的地址。
构造方法
|
|
DatagramSocket() |
构建一个数据报套接字 ,绑定到 |
DatagramSocket(int port) |
构建一个数据报套接字,绑定到 |
DatagramSocket(int port, InetAddress laddr) |
创建一个数据报套接字,绑定到 |
DatagramSocket(SocketAddress bindaddr) |
创建一个数据报套接字,绑定到 |
protected DatagramSocket(DatagramSocketImpl impl) |
创建一个绑定的数据报套接字, 与指定的datagramsocketimpl相关(一般不使用) |
DatagramSocket常用方法
|
|
void send(DatagramPacket p) |
发送数据报包 |
void close() |
关闭数据报套接字 |
void receive(DatagramPacket p) |
接受数据报包 |
代码实现
客户端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
/**
*UDP网络编程发送端
*/
public class SendDemo {
public static void main(String[] args) throws IOException {
//DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口
DatagramSocket d = new DatagramSocket();
while(true) {
System.out.println("请输入:");
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
//使数据用字节数组存放
byte[] bytes = s.getBytes();
//创建对象包
DatagramPacket p = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 10086);
//发送数据包
d.send(p);
}
// //关闭发送端
// d.close();
}
}
服务端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
*UDP网络编程接收端
*/
public class ReceviceDemo {
public static void main(String[] args) throws IOException {
//创建Socket接收端对象,并指明端口号为10086,与发送端保持一致
DatagramSocket d=new DatagramSocket(10086);
while(true){
//使用字节数组接收数据
byte[] bytes=new byte[1024];
//
DatagramPacket p=new DatagramPacket(bytes,bytes.length);
//接收数据包
d.receive(p);
System.out.println("发送方信息:"+p.getAddress().getHostAddress()+"时间为"+getDate());
//解析数据
System.out.println("数据是:"+new String(p.getData(),0,p.getLength()));
}
}
public static String getDate(){
Date d = new Date();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = dateFormat.format(d);
return format;
}
}
TCP通信程序
-
客户端:
java.net
.Socket 类表示。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。
-
服务端:
java.net
.ServerSocket 类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。
Socket类构造方法
|
|
Socket(InetAddress address,int port) |
创建流套接字并将其连接到指定IP指定端口号 |
Socket(String host, int port) |
创建流套接字并将其连接到指定主机上的指定端口号 |
Socket类常用方法
|
|
InputStream getInputStream() |
返回此套接字的输入流 |
OutputStream getOutputStream() |
返回此套接字的输出流 |
代码实现
先启动服务端,再启动客户端。
客户端:
package TCP;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class TCPDemo {
public static void main(String[] args) throws IOException {
//获取当前主机ip
String hostAddress = InetAddress.getLocalHost().getHostAddress();
//创建发送端对象(客户端) 指定主机上的端口号
Socket socket = new Socket(hostAddress, 10086);
while(true){
System.out.println("请输入");
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
//获取输出流对象写数据
OutputStream outputStream = socket.getOutputStream();
outputStream.write(s.getBytes());
//获取到服务器端发的回溯信息
InputStream intput = socket.getInputStream();
byte[] bytes=new byte[1024];
int len = intput.read(bytes);
System.out.println("收到回执信息:"+new String(bytes,0, len));
//关闭资源
// socket.close();
}
}
}
服务端:
package TCP;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPReceviceDemo {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(10086);
//接收数据
Socket accept = serverSocket.accept();
while (true) {
//创建字节数组接收
byte[] bytes = new byte[1024];
//获取字节输入流读数据
InputStream inputStream = accept.getInputStream();
int read = inputStream.read(bytes);
//回溯信息
OutputStream outputStream = accept.getOutputStream();
outputStream.write("我已经收到信息!".getBytes());
//输出数据
System.out.println(new String(bytes, 0, read));
//关闭资源
// accept.close();
}
}
}