计算机IP获取
- InetAddress.getByName(host) 获取IP/计算机名称为host的InetAddress对象
- getHostName() 获取该InetAddress对象的IP地址
- getHostAddress() 获取该InetAddress对象的计算机名称 ```java import java.net.InetAddress; import java.net.UnknownHostException;
public class MyThreadDemo { public static void main(String[] args) throws InterruptedException, UnknownHostException { InetAddress in = InetAddress.getByName(“10.30.67.19”); System.out.println(“计算机名称”+in.getHostName()); System.out.println(“计算机IP”+in.getHostAddress()); } }
<a name="ncuaW"></a>
## UDP
- 无连接:仅仅知道接收一方的IP地址和和端口号就可以进行发送
- 不可靠:没有确认的机制,没有重传的机制
- 面向数据报:不能够灵活的控制读写数据的次数和数量,应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并,倘若我们需要传输的数据超过64K,我们就需要在应用层手动的分包,多次发送,并且在接收端手动的拼装;
- 有接收缓冲区,没有发送缓冲区:这个接收缓冲区不能保证接收到的UDP的数据报的顺序和发送UDP数据报的顺序是一样的,当缓冲区满的时候,再接收到的数据就会被直接丢弃
<a name="iydmW"></a>
### UDP发送端
- 创建发送端对象
- 创建数据,并把数据打包
- 发送数据包
- 关闭发送端
```java
public class MyThreadDemo {
public static void main(String[] args) throws IOException {
//创建DatagramSocket发送端对象
DatagramSocket ds = new DatagramSocket();
//创建数据报包,并指定数据长度,地址IP和端口
byte [] data = "Hello Java".getBytes();
DatagramPacket dp = new DatagramPacket(data,data.length,InetAddress.getByName("10.30.67.10"),1000);
//发送数据报包
ds.send(dp);
//关闭
ds.close();
}
}
UDP接收端
- 创建接收端对象
- 创建数据包接收数据
- 接收数据
- 解析数据包并显示出来
- 关闭接收端 ```java import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket;
public class MyThread { public static void main(String[] args) throws IOException { //创建接收端Socket对象,并指定端口 DatagramSocket ds = new DatagramSocket(1000); //创建数据包用来接收数据 byte [] data = new byte[1024]; DatagramPacket dp = new DatagramPacket(data,data.length); //调用对象接收数据 ds.receive(dp); //解析数据包,并显示 byte[] getdata = dp.getData(); //使用dp.getLength获取数据包长度 String stringdata = new String(getdata,0,dp.getLength()); System.out.println(stringdata); //关闭接收端 ds.close(); }
}
<a name="wDqCo"></a>
## TCP
<a name="k1kkY"></a>
### TCP客户端
```java
public class MyThread {
public static void main(String[] args) throws IOException {
//创建Socket对象
Socket sock = new Socket("10.30.67.10",80);
//获取输入流
OutputStream getout = sock.getOutputStream();
//将数据写入输入流并发送
getout.write("TCP测试程序".getBytes());
getout.close();
}
}
TCP服务端
public class MyThreadDemo {
public static void main(String[] args) throws IOException {
//创建serversocket对象
ServerSocket ss = new ServerSocket(80);
//监听该端口
Socket s = ss.accept();
//获取该端口内容
InputStream is = s.getInputStream();
byte [] data = new byte[1024];
int i = is.read(data);
String d = new String(data,0,i);
System.out.println(d);
ss.close();
}
}