- java 网络编程学习笔记
- 1、ip地址
- 2、端口
- 3、服务器与客户端连接(TCP)
- 4、服务器与客户端之文件传输(TCP)
- 5、UDP信息传输
- 6、UDP实现在线聊天
- 7、URL资源定位
IP地址用于定位一台网络唯一的计算机。
InetAddress类:用于网络上一台计算机的相关信息。
InetAddress inetAddress = InetAddress.getByName("www.yujiangg.com");
// 获取ip的一个字节数组
System.out.println(inetAddress.getAddress());
// 返回主机的公网ip地址
System.out.println(inetAddress.getHostAddress());
// 返回主机的规范名臣的,相当于ip
System.out.println(inetAddress.getCanonicalHostName());
// 获取主机的域名
System.out.println(inetAddress.getHostName());
2、端口
表示计算机上一个程序的进程,不同的进程有不同的端口号,单个协议下端口号不能冲突,用于区分软件,0~65535个端口。
- 公有端口(0~1023):这个端口是会被内置的程序使用,一般不能使用这些端口。
- 注册端口(1024~49151):这些端口就是提供给用户使用的,表示程序。
- 动态端口(后面的端口):也不要使用这里面的端口号。
查看端口号命令:
netstat -ano # 查询所有端口 netstat -ano|findstr "端口号" # 查看指定端口 tasklist|findstr "端口号" # 查看这个端口号下的程序
// 第一个参数是主机名,第二个参数是端口号
InetSocketAddress inetSocketAddress = new InetSocketAddress("www.yujiangg.com", 8080);
// 获取ip的一个字节数组
System.out.println(inetAddress.getAddress());
// 获取主机名
System.out.println(inetSocketAddress.getHostName());
// 获取端口号
System.out.println(inetSocketAddress.getPort());
3、服务器与客户端连接(TCP)
服务器端:
package com.tanke.demo01;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
// 服务器接收信息
try (
// 创建一个服务器
ServerSocket serverSocket = new ServerSocket(9999);
// 监听客户端的连接
Socket socket = serverSocket.accept();
// 接收信息
InputStream inputStream = socket.getInputStream();
// 管道流,过滤信息,解决乱码问题
ByteArrayOutputStream baos = new ByteArrayOutputStream();
){
// 接收信息
byte[] buffer = new byte[1024];
int len = -1;
while((len=inputStream.read(buffer)) != -1){
baos.write(buffer,0,len);
}
// 将接收到的信息输出
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端:
package com.tanke.demo01;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) throws UnknownHostException {
// 服务器的ip
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
// 端口号
int port = 9999;
try (
// 服务器连接
Socket socket = new Socket(inetAddress,port);
OutputStream outputStream = socket.getOutputStream();
){
String msg = "你好,服务器!";
// 通过io流向服务器发送信息
outputStream.write(msg.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
}
}
4、服务器与客户端之文件传输(TCP)
服务器端:
package com.tanke.demo01;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerFile {
public static void main(String[] args) {
try (
ServerSocket serverSocket = new ServerSocket(9000);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream(new File("receive.jpg"));
){
// 将传输的文件写入
byte[] buffer = new byte[1024];
int len = -1;
while ((len=inputStream.read(buffer)) != -1){
fileOutputStream.write(buffer);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端:
package com.tanke.demo01;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientFile {
public static void main(String[] args) throws UnknownHostException {
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
int port = 9000;
try (
Socket socket = new Socket(inetAddress, port);
OutputStream outputStream = socket.getOutputStream();
// 读入文件流
FileInputStream fileInputStream = new FileInputStream(new File("photo.jpg"));
){
// 将字节流传输给服务器
byte[] buffer = new byte[1024];
int len = -1;
while ((len=fileInputStream.read(buffer)) != -1){
outputStream.write(buffer);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
5、UDP信息传输
UDP是不需要连接,是直接发送数据报给某个用户,是不需要连接服务器的,类似QQ、微信等。
发送端:
package com.tanke.demo02;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ClientUDP1 {
public static void main(String[] args) {
try (
// 建立一个socket
DatagramSocket datagramSocket = new DatagramSocket();
){
// 接收的人
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
int port = 9999;
// 发送的消息
String msg = "你好";
byte[] buffer = msg.getBytes();
// 创建一个数据报
DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length, inetAddress, port);
// 发送数据报
datagramSocket.send(datagramPacket);
System.out.println("发送成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
接收端:
package com.tanke.demo02;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ClientUDP2 {
public static void main(String[] args) {
try (
// 开放端口号
DatagramSocket datagramSocket = new DatagramSocket(9999);
){
// 接收数据包,准备一个接收的空间
byte[] buffer = new byte[1024];
// 创建一个数据报,用于封装接收到的数据
DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);
// 阻塞接收
datagramSocket.receive(datagramPacket);
// datagramPacket中封装了发送的基本信息,发送者的地址及数据报
// 接收到数据,是一个字节数组
byte[] data = datagramPacket.getData();
// 发送者的地址
InetAddress inetAddress = datagramPacket.getAddress();
// datagramPacket.getPort(); // 端口号
// 将字节数组转换成字符串时,需要指定数据报的长度,不然会将空余空间也会输出
System.out.println(new String(data,0,datagramPacket.getLength()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
6、UDP实现在线聊天
发送线程:
package com.tanke.demo03;
import java.net.*;
import java.util.Scanner;
public class TalkSend implements Runnable{
DatagramSocket datagramSocket = null;
Scanner in = null;
// 发送者的端口号
private int fromPort;
// 接收者的地址
private String toIP;
// 接收者的接收端口
private int toPort;
public TalkSend(int fromPort, String toIP, int toPort) {
this.fromPort = fromPort;
this.toIP = toIP;
this.toPort = toPort;
// 进行初始化
try {
datagramSocket = new DatagramSocket(this.fromPort);
in = new Scanner(System.in);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try{
while (true){
// 发送的消息
String msg = in.nextLine();
byte[] buffer = msg.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length, new InetSocketAddress(this.toIP,this.toPort));
// 发送数据报
datagramSocket.send(datagramPacket);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
接收线程:
package com.tanke.demo03;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class TalkReceive implements Runnable{
DatagramSocket datagramSocket = null;
// 接收端口
private int port;
// 发送者的姓名
private String msgName;
public TalkReceive(int port, String msgName) {
this.port = port;
this.msgName = msgName;
try {
datagramSocket = new DatagramSocket(this.port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
while (true){
byte[] buffer = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);
datagramSocket.receive(datagramPacket);
byte[] data = datagramPacket.getData();
// 将字节数组转换成字符串时,需要指定数据报的长度,不然会将空余空间也会输出
System.out.println(msgName+":"+new String(data,0,datagramPacket.getLength()));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
学生端:
package com.tanke.demo03;
public class Student {
public static void main(String[] args) {
// 发送线程,从8888端口发给9999端口的127.0.0.1
new Thread(new TalkSend(8888,"127.0.0.1",9999)).start();
// 接收端,从7777端口接收数据,来之老师的消息
new Thread(new TalkReceive(7777,"老师")).start();
}
}
老师端:
package com.tanke.demo03;
public class Teacher {
public static void main(String[] args) {
// 发送线程,从6666端口发给7777端口的127.0.0.1
new Thread(new TalkSend(6666,"127.0.0.1",7777)).start();
// 接收线程,从9999端口接收学生发送的消息
new Thread(new TalkReceive(9999,"学生")).start();
}
}
7、URL资源定位
URL:
URL url = new URL("http://www.yujiangg.com:80/index.jsp?userName=admin");
System.out.println(url.getProtocol()); // 协议
System.out.println(url.getPort()); // 端口号
System.out.println(url.getHost()); // 主机ip
System.out.println(url.getPath()); // 文件路径
System.out.println(url.getFile()); // url全路径,包括参数
System.out.println(url.getQuery()); // 参数
爬取网络资源:
package com.tanke.demo04;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class UrlConnectionTest {
public static void main(String[] args) throws Exception {
// 网络地址
String urlString = "https://m801.music.126.net/20211107134948/91205dd7d7276dd4571713eefb28b6cb/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/11518403401/53d9/3013/dc76/928a32f8a24746e235218c01c2cf3de4.m4a";
URL url = new URL(urlString);
// 建立连接
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
FileOutputStream outputStream = new FileOutputStream("mp4Test.m4a");
// 下载资源
byte[] buffer = new byte[1024];
int len = -1;
while((len=inputStream.read(buffer)) != -1){
outputStream.write(buffer,0,len);
}
// 关闭资源和连接
outputStream.close();
inputStream.close();
urlConnection.disconnect();
}
}
tream inputStream = urlConnection.getInputStream();
FileOutputStream outputStream = new FileOutputStream(“mp4Test.m4a”);
// 下载资源
byte[] buffer = new byte[1024];
int len = -1;
while((len=inputStream.read(buffer)) != -1){
outputStream.write(buffer,0,len);
}
// 关闭资源和连接
outputStream.close();
inputStream.close();
urlConnection.disconnect();
}
}



