传输层(协议)
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()
三次握手:
- 客户端向服务器发出连接请求,等待服务器确认
- 服务器向客户端返回一个响应,告诉客户端收到了请求
- 客户端向服务端再次发出确认信息,连接建立
四次挥手:
- 客户端向服务区发出取消连接请求
- 服务器向客户端返回一个响应,表示收到客户端取消请求
- 服务器向客户端发出确认取消信息
- 客户端再次发送确认信息,连接取消
上传文件:(将文件从客户端上传到服务端,接着服务端返回上传成功)
//客户端
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"));