例:客户端文本文件,服务器输出文本文件了(文件上传)
package com.simple_tcp4;
import java.io.*;
import java.net.Socket;
/*
* 通过键盘录入让服务器端收到消息
* 通过文本文件输入
*
* shutDownOutputStream()
* */
public class TcpSenderDemo {
public static void main(String[] args) {
try( //socket能关闭,流资源也会关闭
////发送资源,发起连接请求
Socket socket = new Socket("192.168.3.76",7777);
//new一个输入流,读文件,用BufferefReader包装一下
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream("D:\\javaEE\\Inet4\\src\\com\\simple_tcp2\\TcpSenderDemo.java")))
) {
//把字符串读进来
// String s = br.readLine();
//创建流
//拿到发送端的OutputStream,准备发送数据到接收端
OutputStream out = socket.getOutputStream();
//把OutputStream包装成缓冲流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
String s1=null;
while ((s1 = br.readLine())!= null){
bw.write(s1);
//如果接收到通过readLine来接受消息,newLine必不可少
bw.newLine();//换行符分隔
//因为此处使用的输入流是标准输入流,不能放在循环外,否则会执行不到
}
bw.flush();
socket.shutdownOutput();//关闭发送端
byte[] buffer = new byte[1024];
InputStream inputStream = socket.getInputStream();
//Socket流中的read方法为阻塞方法
int len = inputStream.read(buffer);
System.out.println(new String(buffer , 0 ,len));
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.simple_tcp4;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 数据接收服务端:
* 在读取文件内容完毕后,由于当前接收端socket的
* 输入流中,没有数据了,于是,接收端的read阻塞(等待发送端继续发送数据到服务端)
*
* 发送端:
* 在发送完数据后,紧接着,准备从服务端接收回馈信息(“文件上传成功”)
* 但是服务因为处在阻塞状态(等着),这样一来,发送端接收不到服务端的回馈,一直阻塞在read方法
*
*解决方案1:
*1、自定义结束标志。比如“over"(在要传输的文本文件后添加一个over标志) 有缺陷1
*2、禁用套接字socket输出流,对于TCP套接字,任何以前了写入的数据都被发送,并
* 且后跟Tcp的正常连接终止序列。如果套接字调用shutdownOutput()后跟写入套接字输出流
* 则该流将抛出IOException
* */
public class TcpReceiverDemo {
public static void main(String[] args) {
try (
ServerSocket serverSocket = new ServerSocket(7777);
Socket accpet = serverSocket.accept();
){
InputStream in = accpet.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
FileOutputStream fileout = new FileOutputStream("b.txt",true);
String s =null;
//此处readLine也是阻塞方法,一开始有数据的时候,也在不停地传输数据
//数据读完后会阻塞
/*
* s = br.readLine())!=null
* 1、执行br.readLine() 【一旦流中没有数据,就在readLine中阻塞】
* 2、当br.readLine()方法返回后,将返回值赋值给s
* 3、s的值是否1等于null
* */
while((s = br.readLine())!= null){
// System.out.println("接收到信息:"+s);
//自定义结束标志
/* if("over".equals(s)) {
break;
}*/
s += "\n";
fileout.write(s.getBytes());
}
//此时接收端没有数据时,会一直阻塞在这里,而下边进程会一直在等待
//给输出端一个回应
OutputStream outputStream = accpet.getOutputStream();
outputStream.write("文件上传完毕!".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}