常用命令
- ipconfig:查看本机ip地址
- ping ip地址:检查网络是否连通
![fef76cf8a99bc680d8752c58b9b04a2b.png](https://i-blog.csdnimg.cn/blog_migrate/64c23bba821686ddc3baa33a76978c7d.jpeg)
![258330397fb972cc7a893757ea0cca9c.png](https://i-blog.csdnimg.cn/blog_migrate/2a894181712da7465b94e2a696cd9bc2.jpeg)
InetAddress类
为了方便我们对IP地址的获取和操作,Java提供了一个类InetAddress供我们使用
inetAddress:此类表示internet协议(ip)地址
InetAddress address = InetAddress.getByName("DESKTOP-UHH1RA3");
//返回主机名
String hostname = address.getHostName();
System.out.println(hostname);
//返回ip
String ip = address.getHostAddress();
System.out.println(ip);
协议
udp协议(用户数据报协议),UDP是面向无连接通信协议 速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据。
tcp传输控制协议,面向连接的通信协议,速度慢,没有大小限制,数据安全。
UDP通信
- 发送端的DatagramSocket对象
- 创建数据,并把数据打包(DatagramPacket)
- 调用DatagramSocket对象的方法发送数据
- 释放资源
发动端代码
//发送端
package tcp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class ClientDemo {
public static void main(String[] args) throws IOException {
//1找码头(创建码头对象)
DatagramSocket ds = new DatagramSocket();
//2打包礼物(创建包裹对象)
String s = "送给村长老丈人的礼物";
byte[] bytes = s.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10000;
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
//3发送包裹
ds.send(dp);
//4付钱走
ds.close();
}
}
- 找码头 -创建接收端的DatagramSocket对象
- 找新箱子-创建一个箱子,用于接收数据
- 码头接收礼物并放入新箱子中 -调用DatagramSocket的方法接收数据并放入箱子中
- 村长从箱子中获取礼物 -解析数据宝,并把数据在控制台显示
- 拿完走 -释放资源
接收端代码(注意:要先运行接收端再运行发送端)如果接收端启动后没有接收到数据,那么会死等(阻塞)
接收端代码
package tcp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 1找码头 表示接收端从10000端口接收数据
DatagramSocket ds = new DatagramSocket(10000);
// 2创建一个新的箱子
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
// 3接收礼物,把礼物放到新的箱子中
ds.receive(dp);
// 4从新的箱子里面拿礼物
byte[] data = dp.getData();
System.out.println(new String(data));
// 5拿完走
ds.close();
}
}
UDP练习(单播)
* UDP发送数据:数据来源键盘录入,指导输入的数据是886,发送数据结束
* UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
客户端
package tcp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class UdpCilent {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
DatagramSocket ds = new DatagramSocket();
while (true) {
String s = sc.nextLine();
if ("886".equals(s)) {
break;
}
byte[] bytes = s.getBytes();// 把传输的话变成字节数组
InetAddress addres = InetAddress.getByName("127.0.0.1");//
int port = 10000;
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, addres, port);
ds.send(dp);
}
ds.close();
}
}
接收端
package tcp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpServer {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(10000);
while (true) {
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
ds.receive(dp);
byte[] data = dp.getData();
int length = dp.getLength();
System.out.println(new String(data,0,length));
}
// ds.close();
}
}
UDP通讯程序 udp的三种通信方式
- 单播:一个发送端通过路由器发送一个接收端
- 组播:一个发送端通过路由器发送一组接收端
- 广播:一个发送端通过路由器发送给局域网接收端
组播代码实现
组播地址:224.0.0.0~239.255.255.255
其中224.0.0.0~224.0.0.255为预留的组播地址
组播发送端
- 创建发送端的Socket对象(DatagramSocket)
- 创建数据,并把数据打包(DatagramPacket)
- 调用DatagramSocket对象的方法发送数据 注意:在单播种,这里发送的是指定IP电脑,但是在组播种这里发送的是组播地址
- 释放资源
package tcp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class ClientDemoZ {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
String s = "组播";
byte[] bytes = s.getBytes();
InetAddress address = InetAddress.getByName("224.0.1.0");
int port = 10000;
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
ds.send(dp);
ds.close();
}
}
组播接收端
- 创建接收端的Socket对象(MulticastSocket)
- ......
package tcp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class ServerDemoZ {
public static void main(String[] args) throws IOException {
MulticastSocket ms = new MulticastSocket(10000);
DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
//把当前计算机绑定一个组播地址,表示添加到一组中
ms.joinGroup(InetAddress.getByName("224.0.1.0"));
ms.receive(dp);
byte[] data = dp.getData();
int length = dp.getLength();
System.out.println(new String(data,0,length));
ms.close();
}
}
UDP广播代码实现
广播地址:255.255.255.255
客户端
package tcp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class ClientDemoG {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
String s = "广播";
byte[] bytes = s.getBytes();
InetAddress address = InetAddress.getByName("255.255.255.255");
int port = 10000;
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
ds.send(dp);
ds.close();
}
}
服务器端
package tcp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ServerDemoG {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(10000);
DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
ds.receive(dp);
byte[] data = dp.getData();
int length = dp.getLength();
System.out.println(new String(data,0,length));
ds.close();
}
}
TCP通信原理
tcp通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象。
通信之前要保证连接已经建立
通过Socket产生io流来进行网络通信
客户端步骤
- 创建Socket对象(Socket)与指定服务端连接 Socket(String host,int port)
- 获取输出流,写数据OutputStreamgetoutputStream()
- 释放资源
package tcp2;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientTcp {
public static void main(String[] args) throws UnknownHostException, IOException {
//1创建一个Socket对象
Socket socket = new Socket("127.0.0.1",10000);
//2获取一个IO流开始写数据
OutputStream os = socket.getOutputStream();//字节流
os.write("hello".getBytes());
//3释放资源
os.close();
socket.close();
}
}
服务端步骤
- 创建服务端的Socket对象(ServerSocket)ServerSocket(int port)
- 监听客户端连接返回一个Socket对象
- 获取输入流,读数据,并把数据显示在控制台
- 释放资源
package tcp2;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServetTcp {
public static void main(String[] args) throws IOException {
// 1创建服务端的Socket对象(ServerSocket)
ServerSocket ss = new ServerSocket(10000);
// 2等待客户端连接
System.out.println(111);//
Socket accept = ss.accept();
System.out.println(222);//
// 3获取输入流,读数据,并把数据显示在控制台
InputStream is = accept.getInputStream();//输入流
int b;
while((b=is.read())!=-1) {
System.out.print((char)b);
}
// 4释放资源
is.close();
ss.close();
}
}