网络编程
每日一考
-
一个IP对应哪个类的一个对象?
InetAddress
-
实例化这个类的方法是?
InetAddress.getByName(String host); //填域名或者地址InetAddress.getLocalHost();//获取本地IP
-
传输层的TCP协议和UDP协议的主要区别?
- TCP:可靠的数据传输(三次握手):进行大量数据传输。效率低
- UDP:不可靠:以数据包的形式发送和,数据包限定为64k。效率高
-
URL是什么?你能写一个URL吗?
- URL:统一资源定位符
URL url = new URL("http://192.168.14.100:8080/example/hello.txt?username=Tom");
-
谈谈你对对象序列化机制的理解?
- 实现接口:
Serializable标识接口(接口中没有方法) - 对象所在的类提供常量:序列版本号。
static final long serialVersionUID = -6052424284110960213L - 要求对象的属性也必须是可序列化的。(基本数据类型、String本身就已经是可序列化的)
- 实现接口:
复习
网络通信要素
/**
* 一、网络编程中两个主要的问题
* 1. 如何准确地定位网络上一台或多台主机,定位主机上的特定应用
* 2、找到主机后如何实现可靠高效的数据传输
*
* 二、网络编程中的两个要素
* 1. 对应问题一:IP和端口号
* 2. 对应问题二:提供网络通信协议:TCP/IP参考模型(应用层,传输层,网络层,物理+数据链路层)
*
* 三、通信要素一:IP
* 1. IP:唯一的标识 Internet 上的计算机(通信实体)
* 2. InetAddress类:主要表示IP地址,两个子类:Inet4Address、Inet6Address。
* 3. IP地址分类方式1:IPV4 和 IPV6
* 4. 域名:www.baidu.com
域名解析:域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)
负责将域名转化成IP地址,这样才能和主机建立连接。
* 5. 本机回路地址:127.0.0.1 对应着localhost
* 6. 如何让实例化InetAddress:两个方法:getByName(String host),getLocalHost();
* 两个常用方法:getHostName() getHostAddress()
* 7. 端口号:正在计算机上运行的程序
* 要求:不同进程有不同端口号
* 范围:被规定为一个16位的整数 0~65535
* 8. 端口号于PI地址的组合得出一个网络套接字:Socket
*/
TCP UDP URL
TCP
package com.shc.java1;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 实现TCP的网络编程
*1.客户端发送内容给服务端,服务端将内容打印到控制台上。
* @author shc
* @create 2021-06-09 0:34
*/
public class TCPTest {
//客户端:
@Test
public void client() {
Socket socket = null;
OutputStream os = null;
try {
//1. 创建Socket对象,指明服务器的IP(InetAddress类对象)和端口号
InetAddress inet = InetAddress.getByName("127.0.0.1");
socket = new Socket(inet,8899);
//2. 获取一个输出流 用于输出数据
os = socket.getOutputStream();
//3. 输出流写出数据
os.write("你好我是你爸".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if(os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Test
public void server() {
ServerSocket ss = null;
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
//1. 创建服务器端的ServerSocket,指明自己的端口号
ss = new ServerSocket(8899);
//2. 调用accept()表示接收来自于客户端的socket
socket = ss.accept();
//3. 获取输入流
is = socket.getInputStream();//数据已经在输入流中,接下来要做的是把输入流中的数据读入内存(buffer)中
//4. 读取输入流中的数据
byte[] buffer = new byte[5];
int len = 0;
baos = new ByteArrayOutputStream();
while((len = is.read(buffer))!=-1){
baos.write(buffer,0,len); //把buffer中的【0,len)字节写入baos类中的字节数组 如果直接把读到buffer中的字节输出的话可能乱码。因为我们用的是字节流不是字符流
}
String ans = baos.toString();
String src = socket.getInetAddress().getHostAddress();
System.out.println(src+":"+ans);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(baos!=null){
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(ss!=null){
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package com.shc.java1;
import org.junit.Test;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 2.客户端发送文件给服务端,服务端将文件保存在本地。
* @author shc
* @create 2021-06-09 14:45
*/
public class TCPTest2 {
/*
涉及到的异常应当使用try-catch-finally来处理
*/
//用户端
@Test
public void client() throws IOException {
//1.获取Socket(通过目标主机IP及端口号)
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
//2.获取输出流 吧内存中的东西写入网络
OutputStream os = socket.getOutputStream();
//3.获取输入流 把文件读入内存:fis.read(buffer) ,后续再用别的输出流输出给网络
FileInputStream fis = new FileInputStream(new File("test.jpg"));
//4.具体读入操作
byte[] buffer = new byte[1024];
int len = 0; //fis.read(buffer) 把fis对应的文件的内容写入buffer
while((len=fis.read(buffer))!=-1){
os.write(buffer,0,len); //通过os把buffer中的内容写出给socket
}
//这里没用shutdownOutput还可以正常结束程序是因为这里os结束后直接关闭socket(不用再等待server端执行动作),os端直接结束循环,
//资源关闭
fis.close();
os.close();
socket.close();
}
//服务器端
@Test
public void server() throws IOException {
//1. 造一个ServerSocket(由于服务器端是接收端,所有IP一定是本机的IP,所以没有必要指定)(指指定端口号即可)
ServerSocket ss = new ServerSocket(9090);
//2. 获取客户端的Socket
Socket socket = ss.accept();//Listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made.A new Socket s is created and,
//3. 获取客户端的输入流(把输入流中的内容读入到文件)
InputStream is = socket.getInputStream();
//4. 由于要保存到本地,所有建立一个输出流(从内存输出到文件)
OutputStream os = new FileOutputStream(new File("test2.jpg"));
//5. 读取过程
byte[] buffer = new byte[1024];
int len = 0;
while((len = is.read(buffer))!=-1){
os.write(buffer,0,len);
}
//6. 关闭资源,从底部向上面关
os.close();
is.close();
socket.close();
ss.close();
}
}
package com.shc.java1;
import org.junit.Test;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* .从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给客户端。并关闭相应的连接。
* @author shc
* @create 2021-06-09 15:19
*/
public class TCPTest3 {
/*
涉及到的异常应当使用try-catch-finally来处理
*/
//用户端
@Test
public void client() throws IOException {
//1.获取Socket(通过目标主机IP及端口号)
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
//2.获取输出流 吧内存中的东西写入网络
OutputStream os = socket.getOutputStream();
//3.获取输入流 把文件读入内存:fis.read(buffer) ,后续再用别的输出流输出给网络
FileInputStream fis = new FileInputStream(new File("test.jpg"));
//4.具体读入操作
byte[] buffer = new byte[1024];
int len = 0; //fis.read(buffer) 把fis对应的文件的内容写入buffer
while((len=fis.read(buffer))!=-1){
os.write(buffer,0,len); //通过os把buffer中的内容写出给socket
}
socket.shutdownOutput();//明确告诉服务器端输出完了
// System.out.println("发送成功1");
//5.接收返回信息
InputStream is = socket.getInputStream(); //输入流:里面有服务器返回的内容
ByteArrayOutputStream baos = new ByteArrayOutputStream();//输出流:将is流读入内存中的内容写出到baos内部的字节数组
byte[] bufferr = new byte[20];//读入内存
while((len=is.read(bufferr))!=-1){
baos.write(bufferr,0,len);//写出到baos中
}
// System.out.println("接收成功2");
String ans = baos.toString();
System.out.println(ans);
//6.资源关闭
is.close();
baos.close();
fis.close();
os.close();
socket.close();
}
//服务器端
@Test
public void server() throws IOException {
//1. 造一个ServerSocket(由于服务器端是接收端,所有IP一定是本机的IP,所以没有必要指定)(指指定端口号即可)
ServerSocket ss = new ServerSocket(9090);
//2. 获取客户端的Socket
Socket socket = ss.accept();//Listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made.A new Socket s is created and,
//3. 获取客户端的输入流(把输入流中的内容读入到文件)
InputStream is = socket.getInputStream();
//4. 由于要保存到本地,所有建立一个输出流(从内存输出到文件)
OutputStream os = new FileOutputStream(new File("test4.jpg"));
//5. 读取过程
byte[] buffer = new byte[1024];
int len = 0;
while((len = is.read(buffer))!=-1){ //客户端的输来的流在读到末尾时不会返回-1 只有在读文件读到末尾时才会返回-1.
// 所以客户端输出结束后必须明确shutdownOutput(); 程序才能正常向下走
os.write(buffer,0,len);
}
// System.out.println("接收成功1");
OutputStream oos = socket.getOutputStream();
// System.out.println("接收成功11");
oos.write("你好猪啊猪,已经收到你的照片".getBytes());
//6. 关闭资源,从底部向上面关
oos.close();
os.close();
is.close();
socket.close();
ss.close();
}
}
URL
* URL 网络编程
* 1. URL:统一资源定位符
* 2. 格式:
* http://localhost:8080/examples/beauty.jpg?username=Tom&password=123
* 协议:主机名 端口号 资源地址 参数列表
* 3. 如何实例化?
URL url = new URL("http://localhost:8080/examples/beauty.jpg?username=Tom&password=123");
* 4. 常用方法
/*
public String getProtocol( ) 获取该URL的协议名
public String getHost( ) 获取该URL的主机名
public String getPort( ) 获取该URL的端口号
public String getPath( ) 获取该URL的文件路径
public String getFile( ) 获取该URL的文件名
public String getQuery( ) 获取该URL的查询名
*/
* 5. 可以读取、下载对应的url资源
代码。。。。

浙公网安备 33010602011771号