网络编程
ip获取类(InetAddress)
java.net包下
新知:
注:此类会抛出异常:UnknownHostException,需要处理。
1.InetAddress类,没有构造方法,类中方法都是静态的,可以直接用类名调用方法。
2.此类最重要的功能是获取IP地址,无论是本机还是网站的ip。
3.获取本机ip的方法有三种:
1.getByName("127.0.0.1"):确定主机名称的IP地址。
2.getByName("localhost")
3.getLocalHost():返回本地主机的地址。
4.获取网站ip地址:
getByName("www.baidu.com");
5.获取域名的方法:
inetAddress.getHostName()
6.获取ip的方法:
inetAddress.getHostAddress()
1.查询本机地址
import java.net.InetAddress;
import java.net.UnknownHostException;
public class N01 {
public static void main(String[] args) throws UnknownHostException {
//有三种查询本机地址的参数:1: 127.0.0.1 / 2:localhost / 3:getLocalHost()方法
InetAddress inetAddress1=InetAddress.getByName("127.0.0.1");
System.out.println("第一种:"+inetAddress1);
System.out.println("第二种:"+InetAddress.getByName("localhost"));
System.out.println("第三种:"+InetAddress.getLocalHost());//getLocalHost()返回本地主机的地址。
}
}
结果:
第一种:/127.0.0.1
第二种:localhost/127.0.0.1
第三种:DESKTOP-K2F3HTO/192.168.137.1
2.查询网站ip地址
import java.net.InetAddress;
import java.net.UnknownHostException;
public class N01 {
public static void main(String[] args) throws UnknownHostException {
InetAddress inetAddress=InetAddress.getByName("www.baidu.com");
System.out.println("获取百度的IP地址:"+inetAddress);
System.out.println("获取域名的方法:"+inetAddress.getHostName());
System.out.println("获取ip的方法"+inetAddress.getHostAddress());
}
}
结果:
获取百度的IP地址:www.baidu.com/36.152.44.95
获取域名的方法:www.baidu.com
获取ip的方法36.152.44.95
端口:
1.计算机程序的进程。
范围:0-65535
类型分类:TCP/UDP:所以实际能够有的进程:需要最大范围*2
端口分类:
**公用端口:**0-1023
1.HTTP:80
2.HTTPS:433
3.FTP:21
4:Telent:23
程序注册端口:
1:Tomcat:8080
2.MySQL:3306
3.Oracle:1521
动态,私有
bash:控制台用到的命令
1.netstat -ano:查看所以端口
InetSocketAddress类:
该类实现IP套接字地址(IP地址+端口号)它也可以是一对(主机名+端口号),在这种情况下将尝试解析主机名。 如果解决方案失败,那么该地址被认为是未解决的,但在某些情况下仍可以使用,例如通过代理连接。
它提供了用于绑定,连接或返回值的套接字所使用的不可变对象。
通配符是一个特殊的本地IP地址。 通常意味着“任何”,只能用于bind操作。
新知:
1.获取端口号:getPort()
import java.net.InetSocketAddress;
public class N02 {
public static void main(String[] args) {
InetSocketAddress socketAddress=new InetSocketAddress("127.0.0.1",8080);//在本机上构造了一个端口
System.out.println(socketAddress.getPort());//获取端口号
System.out.println(socketAddress.getHostName());//获取主机名字
}
}
TCP实现聊天
过程:
1.服务端创建地址,端口,地址就是电脑本身的地址,端口自填。
2.客户端通过服务端的地址和端口号进行连接
3.服务端一直检测是否有连接请求并连接
4.通过Socket的对象调用字节输出流,输入想传输的信息。
5.通过Socket对象调用字节输入流,接收字节后存储进字节数组,并将字节数组存储进管道流,并通过管道流输出
6.关闭一切需要关闭的
新知:
1.用来连接服务端的类
Socket socket=new Socket(inetAddress,5555);
2.创建端号
ServerSocket serverSocket=new ServerSocket(5555);
3.监控客户端的连接
serverSocket.accept();
客户端:
package com.zoufeiming.NetworkProgramming;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
//客户端
public class N03 {
public static void main(String[] args) throws IOException {
//知道服务器的地址并连接
InetAddress inetAddress=InetAddress.getByName("192.168.1.101");
//创建socket连接:地址和端口号
Socket socket=new Socket(inetAddress,5555);
//发送消息:用字节输出流
OutputStream os=socket.getOutputStream();
os.write("时代".getBytes());//将字符串转换为字符数组并输入IO流中
os.close();
socket.close();
}
}
服务端:
package com.zoufeiming.NetworkProgramming;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务端
public class N04 {
public static void main(String[] args) throws IOException {
//创建一个地址和端口号
ServerSocket serverSocket=new ServerSocket(5555);
//等待客户端连接
Socket socket = serverSocket.accept();
//读取客户端的信息
InputStream io=socket.getInputStream();
//先利用字节输入流接收来自客户端的字节,然后通过read方法将字节存储到字节数组中,之后将字节输入到管道流中
// 然后通过管道流调用tostring全部输出
byte[] bytes=new byte[1024];
int len;//利用read方法从输入流中读取数据,读取完会返回-1,否则返回的是字节有效数
ByteArrayOutputStream bo=new ByteArrayOutputStream();
while ((len=io.read(bytes))!=-1) {
bo.write(bytes,0,len);//从指定的数组输入0-len个有效字节
}
System.out.println(bo.toString());//输出全部管道流中的字节
bo.close();
io.close();
socket.close();
serverSocket.close();
}
}
TCP上传文档实现
1.准备文件,创建连接,通过FileInputStream类将文件传入创建好的OutputStream流中然后发给服务端
注:如果出现找不到文件的错误,请看解决方法:
https://blog.csdn.net/qq_43483251/article/details/108312021
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
//上传文件端
public class N05 {
public static void main(String[] args) throws IOException {
//准备文件
FileInputStream fi=new FileInputStream(new File("tx.jpg"));
//创建连接
Socket socket=new Socket(InetAddress.getLocalHost(),9999);
//创建输出文件的输出流
OutputStream os = socket.getOutputStream();
//将文件放入输出流中
int len;//有效字节数
byte[] bytes=new byte[1024];//存储文件的字节数组
while ((len=fi.read(bytes))!=-1){
os.write(bytes,0,len);
}
//关闭资源
os.close();
socket.close();
fi.close();
}
}
1.创建端口,监听连接请求,接收字节,通过FileOutputStream类将文件传入指定文件中
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//接收文件端
public class N06 {
public static void main(String[] args) throws IOException {
//创建接收文件的服务进程
ServerSocket serverSocket=new ServerSocket(9999);
//监听是否有连接请求
Socket socket = serverSocket.accept();//阻塞式监听并接收
//获取输入流并接收
InputStream inputStream = socket.getInputStream();
//创建接收文件的输出流
FileOutputStream fo=new FileOutputStream("wjwj.png");
//将文件输入进指定文件中
int len;
byte[] bytes=new byte[1024];
while ((len=inputStream.read(bytes))!=-1){
fo.write(bytes,0,len);
}
//关闭资源
fo.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
UDP实现发送信息
新知:
1.创建一个有端口的进程,
如果是发送方端口号需要自定义,因为在发送数据时需要提供ip和端口号,构造方法可以是端口号,或者端口号+ip地址
DatagramSocket socket=new DatagramSocket(8080);
2.把数据打包并指明发送对象的类
参数:数据(Byte类型),发送数据的长度,要发给谁
DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,inetAddress,port);
3.发送数据的方法
是类DatagramSocket中的方法:
socket.send(packet);//发送包
4.接收发送方的数据
将发送方的数据接收并且通过DatagramPacket的对象和DatagramPacket的构造方法存储进byte类型的数组中
socket.receive(packet);
5.输出发送方的内容
"发送的内容:"+new String(packet.getData(),0,packet.getData().length)
6.发送方的端口号+ip地址
ip地址+端口号:"+packet.getSocketAddress()
发送方:
import java.net.*;
//发送方
public class J01 {
public static void main(String[] args) throws Exception {
//建立一个Socket
DatagramSocket socket=new DatagramSocket(8080);
//建个包
String msg="你好!";
//获取本机地址
InetAddress inetAddress=InetAddress.getByName("localhost");
int port=9090;
//参数:数据(Byte类型),发送数据的长度,要发给谁
DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,inetAddress,port);
socket.send(packet);//发送包
//关闭流
socket.close();
}
}
接收方
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class F01 {
public static void main(String[] args) throws IOException {
//在本机地址上建立端口,以接收
DatagramSocket socket=new DatagramSocket(9090);
//接收数据包
byte[] buffer=new byte[1024];
//构造一个 DatagramPacket用于接收长度的数据包 length 。
DatagramPacket packet=new DatagramPacket(buffer,0,buffer.length);
//接收来自DatagramPacket的数据包
socket.receive(packet);
//获得包裹中的数据
System.out.println("发送的内容:"+new String(packet.getData(),0,packet.getData().length));
System.out.println("返回发送方连接到的端口号:" +packet.getPort());
System.out.println("发送方ip地址:"+packet.getAddress().getHostAddress());
System.out.println("字节长度:"+packet.getLength());
System.out.println("ip地址+端口号:"+packet.getSocketAddress());
//关闭流
socket.close();
}
}
UDP实现多线程双方实时聊天
UDP实现单向持续聊天
1.System.in
是一个很原始、很简陋的输入流对象,通常不直接使用它来读取用户的输入。
一般会在外面封装过滤流:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
然后调用br.readLine()方法进行读取。
需要进行包装的原因:
System.in返回值类型是字节输入流类型(InputStream)
InputStreamReader类构造方法中可以接收InputStream的参数
BufferedReader类的构造方法接收Reader类型的参数且其readLine()方法可以读一行的文字
URL下载网络资源
1.HttpURLConnection
只是一个抽象类,只能通过 url.openConection() 方法创建具体的实例。严格来说,openConection() 方法返回的是 URLConnection 的子类。根据 url 对象的不同,如可能不是 http:// 开头的,那么 openConection() 返回的可能就不是 HttpURLConnection。
package com.zoufeiming.NetworkProgramming.url;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class MyUrl {
public static void main(String[] args) throws IOException {
//1.下载地址
URL url = new URL("https://m10.music.126.net/20200831181708/c20383383ed8da09328a98430968be2c/ymusic/obj/w5zDlMODwrDDiGjCn8Ky/3253345932/a82c/c8f1/c240/74c34f5ed76bbb99c3022948717e56e4.mp3");
//连接到这个资源
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
FileOutputStream fo=new FileOutputStream("天外来物.mp3");
byte[] buffer=new byte[1024];
int len;
while ((len=inputStream.read(buffer))!=-1){
fo.write(buffer,0,len);
}
fo.close();
inputStream.close();
urlConnection.disconnect();//断开连接
}
}