20220811 第一组 于芮 网络通信(第三十天)
小白成长记——第三十天
今天主要的学习内容是利用socket和IO流进行网络通信,相比较来说是java基础中比较容易理解的知识,只要前面都跟上了,这里自然不会很难理解java基础就快要结束了,学习的知识也很多,最后还是要融会贯通,将所有知识结合在一起,来看一下今天的学习笔记吧!
网络编程(网络通信)
服务器:是一台电脑
客户端:是一台电脑,手机,网页
服务器:是一台电脑
客户端:是一台电脑,手机,网页
socket编程
是建立在tcp/ip协议上
是建立在tcp/ip协议上
如何在网络环境下访问其他的电脑?
通过IP地址加端口号,可以访问其他的主机
通过IP地址加端口号,可以访问其他的主机
如何查看在当前网络下的IP地址?
命令提示行(cmd)ipconfig查看Ipv4的IP地址,当前局域网下的IP地址
命令提示行(cmd)ipconfig查看Ipv4的IP地址,当前局域网下的IP地址
端口号:一台电脑有多个端口号,每个端口号对应的程序也可以不同,当通过IP地址和端口号访问一个指定的应用程序
如何构建socket通信服务器
seversocket创建对象
@Test
public void server() throws IOException {
// 创建了一个服务器对象,绑定在8888端口
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器已启动...");
// 服务器在等待客户端连接
Socket socket = serverSocket.accept();
// 读取客户端发送过来的信息
InputStream inputStream = socket.getInputStream();
byte [] buffer = new byte[1024 * 1024];
int len;
while((len = inputStream.read(buffer)) != -1){
System.out.println("服务器已接收客户端的数据:" + new String(buffer,0,len));
}
// 释放资源
inputStream.close();
socket.close();
}
seversocket创建对象
@Test
public void server() throws IOException {
// 创建了一个服务器对象,绑定在8888端口
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器已启动...");
// 服务器在等待客户端连接
Socket socket = serverSocket.accept();
// 读取客户端发送过来的信息
InputStream inputStream = socket.getInputStream();
byte [] buffer = new byte[1024 * 1024];
int len;
while((len = inputStream.read(buffer)) != -1){
System.out.println("服务器已接收客户端的数据:" + new String(buffer,0,len));
}
// 释放资源
inputStream.close();
socket.close();
}
@Test
public void client() throws IOException {
// 创建了一个Socket通信的客户端
Socket socket = new Socket();
// 第一个参数就是获取当前电脑的IP地址
// 第二个参数就是服务器的端口号
socket.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(),8888));
// 客户端发送数据给服务器
OutputStream outputStream = socket.getOutputStream();
String data = "hello server!";
outputStream.write(data.getBytes());
System.out.println("客户端已发送数据:" + data);
outputStream.close();
socket.close();
}
public void client() throws IOException {
// 创建了一个Socket通信的客户端
Socket socket = new Socket();
// 第一个参数就是获取当前电脑的IP地址
// 第二个参数就是服务器的端口号
socket.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(),8888));
// 客户端发送数据给服务器
OutputStream outputStream = socket.getOutputStream();
String data = "hello server!";
outputStream.write(data.getBytes());
System.out.println("客户端已发送数据:" + data);
outputStream.close();
socket.close();
}
URL
URL:https://www.163.com/,对应着互联网的一个资源网址
URL:https://192.168.1.1:8888/goods
协议 主机名 端口号 资源地址
URL:https://www.163.com/,对应着互联网的一个资源网址
URL:https://192.168.1.1:8888/goods
协议 主机名 端口号 资源地址
C/S架构:Client/Server客户端/服务器,QQ,360,腾讯会议,游戏
B/S架构:Browser/Server浏览器/服务器,
移动互联,手机端为主,C/S架构,
Java主要要做的就是架构中的Server端。
1.静态资源:所有用户访问后,得到的结果都是一样的。html
2.动态资源:每个用户访问后,得到的结果可能不一样。爱奇艺,
2.动态资源:每个用户访问后,得到的结果可能不一样。爱奇艺,
web服务器。
接收用户的请求,处理请求,给出响应。
接收用户的请求,处理请求,给出响应。
通过浏览器访问我们的ServerSocket服务器,我们通过浏览器给我们的ServerSocket服务器发起了请求
我要访问服务器!!!
通过IP地址 + 端口号
本机的IP地址:
1.cmd---ipconfig
2.127.0.0.1---本机(个人建议,任何情况都好使)
3.localhost---本机(前提条件:你的电脑要联网,激活一下网卡)
我要访问服务器!!!
通过IP地址 + 端口号
本机的IP地址:
1.cmd---ipconfig
2.127.0.0.1---本机(个人建议,任何情况都好使)
3.localhost---本机(前提条件:你的电脑要联网,激活一下网卡)
127.0.0.1:8080
我们通过浏览器访问我们的ServerSocket,得到了一堆信息,看不懂。
其实发送过来的信息,报文。浏览器传递过来的一些消息。
User-Agent:告诉服务器我是从什么样的客户端来的。
Host: 127.0.0.1:8080,主机地址,目标主机。
User-Agent:告诉服务器我是从什么样的客户端来的。
Host: 127.0.0.1:8080,主机地址,目标主机。
貌似浏览器也是通过Socket和我们的服务器建立了TCP连接
我们不妨把浏览器给我们的服务器发送的信息称之为“请求”,
而且这个请求格式满足了http的协议。
而且这个请求格式满足了http的协议。
请求:客户端--->服务器响应:服务器--->客户端
今天的学习内容就是这些了,通过一些实践将网络通信的含义理解的更加深刻,辣妈看一下今天的的代码实现吧!
1 package J0811; 2 3 import org.junit.jupiter.api.Test; 4 5 import java.io.*; 6 import java.net.InetAddress; 7 import java.net.InetSocketAddress; 8 import java.net.ServerSocket; 9 import java.net.Socket; 10 11 public class Ch03 { 12 @Test 13 public void sever() throws IOException { 14 //创建服务器对象,绑定在8888端口 15 ServerSocket serverSocket=new ServerSocket(8888); 16 System.out.println("服务器已启动"); 17 //服务器在等待客户端连接 18 Socket socket=serverSocket.accept(); 19 //读取客户端发送过来的信息 20 InputStream inputStream=socket.getInputStream(); 21 OutputStream outputStream=new FileOutputStream(""); 22 //在获取一个输出流,给客户端返回数据 23 OutputStream clientOutputStream=socket.getOutputStream(); 24 byte[] buffer=new byte[1024*1024]; 25 int len; 26 while ((len=inputStream.read(buffer))!=-1){ 27 /* 28 * 接受信息 29 * 看输入流怎么来的 30 * 通过socket获取 31 * socket怎么来的 32 * socket是通过服务器启动之后,接到了客户端的连接 33 * 蜀门的输入流是客户端的输入流 34 * 现在接收的是一个文件 35 * 需要把这个文件另存 36 * 需要构建一个输出流,把这个文件保存在硬盘上 37 * */ 38 outputStream.write(buffer,0,len); 39 } 40 System.out.println("文件接收成功"); 41 //给客户端返回一个数据 42 clientOutputStream.write("文件已成功保存到服务器".getBytes()); 43 //释放资源 44 inputStream.close(); 45 outputStream.close(); 46 socket.close(); 47 48 } 49 @Test 50 public void client() throws IOException { 51 //创建一个socket通信的客户端 52 Socket socket=new Socket(); 53 //第一个参数就是获取当前电脑的IP地址 54 //第二个参数就是服务器的端口号 55 socket.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(),8888)); 56 //客户端发送数据个服务器 57 OutputStream outputStream=socket.getOutputStream(); 58 File file =new File(""); 59 //要读取服务器的数据,需要构建一个从服务器来的输入流 60 InputStream inputStream=new FileInputStream(""); 61 //要发送的文件 62 byte[] buf=new byte[1024*1024]; 63 int len; 64 while ((len=inputStream.read(buf))!=-1){ 65 /* 66 * 读取到的文件循环发送给服务器 67 * 输出流把文件写出去,通过搜下可以获取到的,现在写的操作就是文件写给服务端 68 * */ 69 outputStream.write(buf,0,len); 70 } 71 System.out.println("文件发送成功"); 72 //通知服务器发送完毕,等待服务器回复 73 //通知服务器发送完毕 74 socket.shutdownInput(); 75 //接受服务器回传的数据 76 byte []serverBuf=new byte[1024*1024]; 77 int serverlen; 78 while ((serverlen=inputStream.read(buf))!=-1){ 79 System.out.println(new String(serverBuf,0,serverlen)); 80 } 81 inputStream.close(); 82 outputStream.close(); 83 socket.close(); 84 } 85 }
1 package J0811; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 8 public class Ch06 { 9 public static void main(String[] args) throws IOException { 10 ServerSocket serverSocket=new ServerSocket(8080); 11 //等待客户端的连接 12 Socket accept=serverSocket.accept(); 13 //获取一个输入流来读取客户端发送来的数据 14 InputStream inputStream=accept.getInputStream(); 15 byte[] buf=new byte[1024]; 16 int len; 17 while((len=inputStream.read(buf))!=-1){ 18 System.out.println(new String(buf,0,len)); 19 } 20 inputStream.close(); 21 accept.close(); 22 } 23 }