当前位置: 首页 > news >正文

TCP协议

传输层(协议)

TCP协议

三次握手协议保证连接建立

四次挥手,利用这个协议断开连接,而且保证连接通道里面数据已经处理完毕

客户端(Socket):

1、创建客户端的Socket对象(Socket)与指定服务端连接

Scoket(String host,int port)

2、获取输出流,写数据

OutputStream getOutputStream()

3、释放资源

void close()

服务器(ServerSocket)

1、创建服务器端的Socket对象(ServerSocket)

ServerSocket(int port)

2、监听客户端连接,返回一个Socket对象

Socket accept()

3、获取输入流,读数据,并把数据显示在控制台

InputStream getInputStream()

4、释放资源

void close()

三次握手:

  1. 客户端向服务器发出连接请求,等待服务器确认
  2. 服务器向客户端返回一个响应,告诉客户端收到了请求
  3. 客户端向服务端再次发出确认信息,连接建立

四次挥手:

  1. 客户端向服务区发出取消连接请求
  2. 服务器向客户端返回一个响应,表示收到客户端取消请求
  3. 服务器向客户端发出确认取消信息
  4. 客户端再次发送确认信息,连接取消

上传文件:(将文件从客户端上传到服务端,接着服务端返回上传成功)

//客户端
import java.io.*;
import java.net.Socket;//客户端:将本地文件上传到服务器,接收服务器的反馈
//服务器:接收客户端上传的文件,上传完毕后给出反馈
public class Client3 {public static void main(String[] args) throws IOException {//1.创建Socket对象,并连接服务器Socket socket=new Socket("127.0.0.1",10000);//2.读取本地文件,并写到服务器当中BufferedInputStream bi=new BufferedInputStream(new FileInputStream("D:\\javaj\\first\\1.jpg"));//要复制的文件BufferedOutputStream bo=new BufferedOutputStream(socket.getOutputStream());byte[] bytes = new byte[1024];int len;while((len=bi.read(bytes))!=-1){bo.write(bytes,0,len);}//往服务器写出结束标记socket.shutdownOutput();//3.接收服务器的回写数据BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));String line=br.readLine();System.out.println(line);// 4.释放资源socket.close();}}
//服务端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class Server3 {public static void main(String[] args) throws IOException {ServerSocket serverSocket=new ServerSocket(10000);Socket socket=serverSocket.accept();BufferedInputStream br=new BufferedInputStream(socket.getInputStream());BufferedOutputStream bo=new BufferedOutputStream(new FileOutputStream("D:\\aaa.jpg"));//粘贴的位置int len;byte[] bytes = new byte[1024];while((len=br.read(bytes))!=-1){bo.write(bytes);}BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("上传成功");bw.newLine();bw.flush();socket.close();serverSocket.close();}
}

上述代码如果要第二次运行的话,上传的文件第二次会把第一次上传的文件覆盖,为了避免这种情况,可以使用UUID类中的方法:

public class UUIDTest {public static void main(String[] args) {System.out.println(UUID.randomUUID());}
}

每次运行的结果都是不一样的:

3613117c-70f7-4272-9e3e-4c42696721da

但是对于文件名来说,不想要上面的 ‘ - ’,此时可以换一种写法:

先把他替换成字符串,再调用里面的replace方法,把里面的 “-”替换成长度为零的字符串 “”;

        BufferedOutputStream bo=new BufferedOutputStream(new FileOutputStream("D:\\"+replace+".jpg"));

http://www.lryc.cn/news/61572.html

相关文章:

  • 69. x 的平方根
  • Webshell应急响应指南
  • Linux如何定时执行任务
  • 使用nvm替换nvmw作为nodejs的版本切换(亲测)
  • 分布式事务
  • zk111111111111111111
  • 018:Mapbox GL加载Google地图(影像瓦片图)
  • Web API 和 API 的区别编写api
  • IDEA 用上这款免费 GPT4 插件,生产力爆表了
  • 1187.使数组严格递增 学习记录
  • 权限控制_SpringSecurity
  • 2023年最系统的自动化测试,测试开发面试题,10k以下不建议看
  • 今年SMETA审核费用即将涨价
  • 基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
  • 基于深度学习和生理信号的疾病筛查:个体内和个体间研究的价值与应用
  • 现在有t1,t2,t3三个线程,实现t1,t2线程同步执行,然后再执行t3线程,使用Java实现该程序
  • 83.qt qml-初步学习2D粒子影响器(二)
  • 4.17-4.18学习总结
  • Spring事务
  • Linux新的设备或分区挂载到系统中mount使用方法
  • 移动硬盘损坏如何恢复数据
  • Material Design:为你的 Android 应用提供精美的 UI 体验
  • springboot+vue学生毕业离校系统(源码+说明文档)
  • 【Android入门到项目实战-- 6.2】—— 如何访问其他应用程序的数据?
  • 【100个 Unity实用技能】 | InputField输入框组件实现输入限制,只能输入中文或特殊字符等
  • 倍数+路径之谜
  • 【Unity渲染】URP透明物体自身渲染穿插异常问题
  • c/c++:指针,指针定义和使用,指针大小4字节,野指针,空指针*p=NULL
  • CAS实现原⼦操作的三⼤问题,该如何解决?
  • Linux Shell 实现一键部署二进制go+caddy+filebrowser