网络通信
* 网络编程 在一定的写一下实现两台计算机的连接
* 网络通信协议 计算机之间通信需要遵守通信协议
* tcp/IP 最基本最广泛的协议 每天都在用的 重点讲解 连接网络 需要通过这个协议获取IP地址 处理数据的通信协议
* UDP 面向无连接的通信协议 两个计算机不用连接 用于视频会议 偶尔会丢失包udp
* Tcp 三次握手 客户端 像服务器发送链接请求
* 服务器给客户端响应
* 客户端给服务器确认信息
* ip地址 0~255十进制表示 42亿个 iPv4
* ipv6可以给世界上每一粒沙子分配上IP
* cmd 命令ipconfig 可以查看IP 如果ping通ip 就可以说明可以连接
*
* * 借助端口号 保证数据准确无误的发出 端口号两个字节组成 取值范围65535
* * 端口号不能重复
* * 常用端口号 80端口 网络端口号 数据库mysql 3306 tomcat8080
TCP协议
客户端/**
* 网络编程 在一定的写一下实现两台计算机的连接
* 网络通信协议 计算机之间通信需要遵守通信协议
* tcp/IP 最基本最广泛的协议 每天都在用的 重点讲解 连接网络 需要通过这个协议获取IP地址 处理数据的通信协议
* UDP 面向无连接的通信协议 两个计算机不用连接 用于视频会议 偶尔会丢失包udp
* Tcp 三次握手 客户端 像服务器发送链接请求
* 服务器给客户端响应
* 客户端给服务器确认信息
* ip地址 0~255十进制表示 42亿个 iPv4
* ipv6可以给世界上每一粒沙子分配上IP
* cmd 命令ipconfig 可以查看IP 如果ping通ip 就可以说明可以连接
*
* * 借助端口号 保证数据准确无误的发出 端口号两个字节组成 取值范围65535
* * 端口号不能重复
* * 常用端口号 80端口 网络端口号 数据库mysql 3306 tomcat8080
*
*/
public class Internet {
/**
* Tcp 面向连接的通信
* 通信的步骤 服务器端先启动不会主动请求客户端 客户端请求服务器端 建立连接 使用io对象进行通信 字节流对象
* 服务器使用客户端的流和客户端交互 服务器中没有流io
* client客户端
*
* socket (host ip) colse
*/
public static void main(String[] args)throws IOException {
//创建socket对象 构造方法绑定IP 和端口号
Socket socket =new Socket("127.0.0.1",8888);
// 使用对象中的方法 获取网络字节流对象
OutputStream outputStream = socket.getOutputStream();
//使用网络细节输出流对象中的方法 给给服务器发送数据
outputStream.write("你好服务器".getBytes());
//获取字节输入流对象
InputStream inputStream = socket.getInputStream();
//使用字节输入流 读取字节读取的数据
byte[] bytes =new byte[1024];
int len=inputStream.read(bytes);
System.out.println(new String(bytes,0,len));
//释放
outputStream.close();//因为没有连接服务器 暂时报异常
inputStream.close();
}
}
服务器 import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务器TCP 带端口好的额构造方法
* 客户端 IP host
* 服务器必须要知道哪个客户端请求的服务器 可以使用accept 方法 获取请求客户端的对象
*
*/
public class Server {
public static void main(String[] args)throws IOException {
//创建服务器 要指定的端口号
ServerSocket serverSocket =new ServerSocket(8888);
//获取请求对象
Socket socket = serverSocket.accept();
//读取
InputStream inputStream = socket.getInputStream();
//读取客户端发送的数据
byte[] bytes=new byte[1024];
int len=inputStream.read(bytes);
System.out.println(new String(bytes,0,len));
//获取网络字节输出流
OutputStream outputStream = socket.getOutputStream();
outputStream.write("嗯".getBytes());
socket.close();
serverSocket.close();
}
}
先执行服务器 在启动客户端 实现三次握手
综合案列练习 文件上传
客户端
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* Tcp协议
* 综合案列 文件的上传
* 其实大概的意思就是 把文件上传到服务器上 并保存在硬盘中 服务器告诉我们已经保存好 客户端给一个响应
*
*/
public class TcpScoket {
public static void main(String[] args)throws IOException {
//首先我们需要有一个文件在本地
//本地字节输入流对象 构造方法中要绑定读取的数据源
FileInputStream fileInputStream =new FileInputStream("E:\\ideawork\\dianbiao.txt");
//新建一个客户端 ip host 读取文件
Socket socket =new Socket("127.0.0.1",8888);
//获取字节输出流对象
OutputStream outputStream = socket.getOutputStream();
System.out.println("查看一下"+outputStream);
//使用本地输入流读取文件
int len=0;
byte[] bytes =new byte[1024];
while ((len=fileInputStream.read(bytes))!=-1){
System.out.println("bytes"+bytes);
//使用网络字节输出流 把文件写到服务器 或者也可以说是上传
outputStream.write(bytes,0,len);
}
//结束标记 文件上传之后给一个结束标记
socket.shutdownOutput();
//网络字节输入流 用来读取文件 服务器有了这个文件给客户端响应我们需要读到这个文件
//通俗讲服务器回写的数据
InputStream inputStream = socket.getInputStream();
while ((len=inputStream.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}
fileInputStream.close();
socket.close();
/**
* 客户端遇到了阻塞问题 服务器和客户端都没有停下来
* 上传文件给客户端一个结束标记 shutdown
*
*
* 文件的优化
*/
}
}
服务器端
package com.network;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
/**
* @ClassName: TcpServer
* @Description:
* @Author: Zhangliya
* @CreateDate: 2020/6/23 21:42
* @Version: 1.0
* @Copyright: Copyright2019-2020 BJCJ Inc.All rights reserved.
**/
public class TcpServer {
public static void main(String[] args)throws IOException {
//首先要创建一个服务器host
ServerSocket serverSocket =new ServerSocket(8888);
/**
* 优化文件 让服务器一直处于接收的状态 不用关闭
*
* 继续优化 线程加快速度
*/
new Thread(new Runnable() {
@Override
public void run() {
//注意run方法中没有声明抛出异常 所以要用到try catch
while (true) {
try {
//这个服务器要给客户端一个响应
Socket accept =serverSocket.accept();
//读取客户端发送来的文件
InputStream inputStream = accept.getInputStream();
byte[] bytes =new byte[1024];
//但是这里我们需要判断一下服务器中有没有文件 把文件存在服务器硬盘的哪里
//所以新建一个服务器本地的文件
File file =new File("C:\\ideawork");
//判断是否存在
if (!file.exists()) {
file.mkdirs();//生成所有目录的意思
}
//优化文件名 就像网上下载文件一样 都会有很长的文件名
String filename ="zhoumo" + System.currentTimeMillis() +new Random().nextInt(9999) +".txt";
//在本地创建一个字节输出流
FileOutputStream fileOutputStream =new FileOutputStream(file +"\\" + filename);
//用来写入客户端传向服务器的文件
int len =0;
while ((len = inputStream.read(bytes)) != -1) {
System.out.println(new String(bytes,0, len));
//把读取到的文件写到硬盘上
fileOutputStream.write(bytes,0, len);
}
InputStream inputStream1 = accept.getInputStream();
//读取回写数据
while ((len = inputStream1.read(bytes)) != -1) {
System.out.println(new String(bytes,0, len));
}
//给客户端回写一个资源
accept.getOutputStream().write("文件上传成功".getBytes());
//资源释放
fileOutputStream.close();
accept.close();
}catch (IOException e) {
System.out.println(e);
}
}
}
}).start();
// serverSocket.close();
}
}