目录:
1. ip地址
//查询本机地址
InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
System.out.println(inetAddress1);
InetAddress inetAddress2 = InetAddress.getByName("localhost");
System.out.println(inetAddress2);
InetAddress inetAddress3 = InetAddress.getLocalHost();
System.out.println(inetAddress3);
//查询网络ip地址
InetAddress inetAddress4 = InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress4);
//常用方法
//1,获取ip
System.out.println(inetAddress4.getHostAddress());
//2.获取域名
System.out.println(inetAddress4.getHostName());
/* /127.0.0.1
localhost/127.0.0.1
DESKTOP-RS7MPP1/169.254.131.248
www.baidu.com/112.80.248.75
112.80.248.75
www.baidu.com
*/
2. 端口
单个协议下端口号不能冲突
端口分类
1. 公有端口 : 0~1023
HTTP:80
HTTPS:443
2. 程序注册端口: 1024~49151
MySQL:3306
3. 动态,私有: 49152~65535(不用)
3. 套接字
ip地址加端口号
4. 简单的客户端服务器(TCP)
4.1客户端
- 连接服务器socket
- 发送信息
//客户端
public class Client {
public static void main(String[] args) throws Exception {
//建立套接字,连接服务器(获取服务器的套接字)
//1.获取ip(此时服务器ip就是主机ip)
InetAddress inetAddress = InetAddress.getLocalHost();
//2.获取端口号
int port = 9999;
//3.生成套接字
Socket socket = new Socket(inetAddress,port);
/* //发送消息(使用DataOutputStream输出流)
DataOutputStream out =new DataOutputStream(socket.getOutputStream());
out.writeUTF("nihao");*/
//发送消息
OutputStream out = socket.getOutputStream();
out.write("nihaonihao".getBytes());
//传输完毕
socket.shutdownOutput();
}
}
4.2服务端
- 创建ServerSocket
- 监听客户端接入accept()
- 接受处理用户信息
//服务器端
public class Server {
public static void main(String[] args) throws IOException {
//建立服务器端套接字(自动获取ip)
ServerSocket serverSocket = new ServerSocket(9999);
//监听客户端连接
Socket socket = serverSocket.accept(); //此时的socket就是客户端的socket
/*
//读取客户端消息(使用DataInputStream输入流)
DataInputStream in = new DataInputStream(socket.getInputStream());
try {
while (true)
{
if (in == null) break;
String s= (in.readUTF());
System.out.println(s);
}
}catch (IOException e)
{
}*/
//读取客户端消息
//管道流
InputStream in = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while( true)
{
if((len=in.read(buffer))== -1)
break;
baos.write(buffer, 0, len); //in的值读到buffer中再写给baos
}
socket.shutdownInput();//接受完毕
System.out.println(baos.toString());
}
}
5. UDP
UDP无需建立连接就可以发送,重点在于建立发送的的目的地的ip,端口,和发送数据的包。
5.1.建立端口
DatagramSocket socket = new DatagramSocket(3000);
5.2.建立数据包
发送数据时实例化DatagramPacket对象 需要
(1)储存数据的字节数组(2)起始位置(3)数组长度(4)目的地址(5)目的端口号
DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length, InetAddress.getLocalHost(),6666);
接受数据时实例化DatagramPacket对象需要
(1)储存数据的字节数组(2)起始位置(3)数组长度
DatagramPacket packet = new DatagramPacket(bytes,0,1024);
5.3.发送包或接收包
socket.send(packet); //发送
socket.receive(packet); //接受
5.4简单的UDP实列
UDP并不存在客户端和服务端,此处只是一个代码只实现了发送或接受的功能
5.4.1客户端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;
public class UdpClient {
public static void main(String[] args) throws Exception {
//1.建立端口
DatagramSocket socket = new DatagramSocket(3000);
while(true)
{
//2.建立发送数据的包
byte[] bytes = new byte[1024]; //储存数据
Scanner scanner = new Scanner(System.in);
String data = scanner.next();
bytes = data.getBytes();
//发送数据时实例化DatagramPacket对象
// 需要(1)储存数据的字节数组(2)起始位置(3)数组长度(4)目的地址(5)目的端口号
DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length, InetAddress.getLocalHost(),6666);
//3.发送包
socket.send(packet);
if(data.equals("bye"))
break;;
}
//4.关闭
socket.close();
}
}
5.4.2 服务器端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpSereve{
public static void main(String[]args) throws Exception {
//1/建立端口
DatagramSocket socket = new DatagramSocket(6666);
while (true)
{
//2。建立接受数据的包
byte[] bytes= new byte[1024];
//接受数据时实例化DatagramPacket对象
// 需要(1)储存数据的字节数组(2)起始位置(3)数组长度
DatagramPacket packet = new DatagramPacket(bytes,0,1024);
//3.接受数据
socket.receive(packet);
//获取的数据为字节数组类型,转换成string类型再输出
String str = new String(packet.getData(),0, packet.getLength());
System.out.println(str);
if(str.equals("bye"))
break;
}
//4.关闭
socket.close();
}
}
6. UDP实现多线程沟通
思路:
将客户端和服务器构造成两个线程,此时一个用户就可以同时开启这个两个线程,做到沟通的效果(既可以发也可以收)当然想要沟通需要两个用户
6.1 客户端线程
客户端发送信息,所以需要(1)自身的发送端口,(2)发送目的地ip(3)发送目的地端口
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class Client implements Runnable{
//(1)自身的发送端口,(2)发送目的地ip(3)发送目的地端口
int fromPort;
InetAddress toIp;
int toPort;
public Client(int fromPort, InetAddress toIp, int toPort) {
this.fromPort = fromPort;
this.toIp = toIp;
this.toPort = toPort;
}
@Override
public void run() {
try {
//1.建立端口
DatagramSocket socket = new DatagramSocket(fromPort);
while(true)
{
//2.建立发送数据的包
byte[] bytes = new byte[1024]; //储存数据
Scanner scanner = new Scanner(System.in);
String data = scanner.next();
bytes = data.getBytes();
//发送数据时实例化DatagramPacket对象
// 需要(1)储存数据的字节数组(2)起始位置(3)数组长度(4)目的地址(5)目的端口号
DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length, toIp,toPort);
//3.发送包
socket.send(packet);
if(data.equals("bye"))
break;;
}
//4.关闭
socket.close();
}catch (Exception e)
{
}
}
}
6.2 服务器端线程
服务器端接受信息,所以需要(1)自身的接收端口
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Server implements Runnable{
//(1)自身的接收端口
int fromPort;
public Server(int fromPort) {
this.fromPort = fromPort;
}
@Override
public void run() {
try {
//1/建立端口
DatagramSocket socket = new DatagramSocket(fromPort);
while (true)
{
//2。建立接受数据的包
byte[] bytes= new byte[1024];
//接受数据时实例化DatagramPacket对象
// 需要(1)储存数据的字节数组(2)起始位置(3)数组长度
DatagramPacket packet = new DatagramPacket(bytes,0,1024);
//3.接受数据
socket.receive(packet);
//获取的数据为字节数组类型,转换成string类型再输出
String str = new String(packet.getData(),0, packet.getLength());
System.out.println(str);
if(str.equals("bye"))
break;
}
//4.关闭
socket.close();
}catch (Exception e)
{
}
}
}
6.3 用户
import java.net.InetAddress;
import java.net.UnknownHostException;
public class User1 {
public static void main(String[] args) throws UnknownHostException {
new Thread(new Client(3333, InetAddress.getByName("127.0.0.1"),6666)).start();
new Thread(new Server(7777)).start();
}
}
import java.net.InetAddress;
import java.net.UnknownHostException;
public class User2 {
public static void main(String[] args) throws UnknownHostException {
new Thread(new Client(4444, InetAddress.getByName("127.0.0.1"),7777)).start();
new Thread(new Server(6666)).start();
}
}
7. URL
7.1 URL简介
统一资源定位符,可以定位互联网中的某一个资源
五部分组成:(可以少,但是不能多)
协议://ip地址:端口/项目名/资源
import java.net.MalformedURLException;
import java.net.URL;
public class Url {
public static void main(String[] args) throws MalformedURLException {
URL url = new URL("http://localhost:3333/hello/hello.txt");
System.out.println(url.getProtocol()); //获取协议
System.out.println(url.getHost()); //获取主机ip
System.out.println(url.getPort()); //获取端口号
System.out.println(url.getPath()); //获取文件名
/* http
localhost
3333
/hello/hello.txt */
}
}
7.2 通过URL下载资源
1.建立下载地址
2.连接下载地址
3.IO流获取内容(注:要根据获取资源修改生成文件的格式)
public class UrlDown {
public static void main(String[] args) throws Exception {
//下载地址
URL url = new URL("https://p2.music.126.net/A6VByArTeykL0EkmBzGv_A==/109951166183733920.jpg?param=200y200");
//连接到这个资源
URLConnection urlConnection = url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream("a.jpg");
byte[] buffer = new byte[1024];
int len;
while ((len=inputStream.read(buffer))!=-1)
{
fileOutputStream.write(buffer,0,len);
}
}
}
版权声明:本文为fanfanfanfan2022原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。