TCP提交文件模式(方法中是文本,可以提交图片等文件)

package ceshi;


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class UdpCommin {


//客户端
public static void main(String[] args) throws Exception{
Socket st = new Socket("192.168.0.140",10006);//创建客户端发送地址及端口

BufferedReader bure = new BufferedReader(new FileReader("d://a.txt"));//读取摸个文件的内容

//文本输出流可实现自动刷新,必须是println(),printf() 或 format(),方法才会自动刷新
PrintWriter pw = new PrintWriter(st.getOutputStream(),true);

//获取时间戳作为结束标识,在发送文本内容之前发送结束标识
long time = System.currentTimeMillis();
pw.wait(time);

//上面发送是一种方式还可以通过下面数据流发送
//DataOutputStream ao = new DataOutputStream(st.getOutputStream());
//ao.writeLong(time);这个发送时间戳方法在文本结束后在发送一次

//缓存区,读取文本直接string,其他定义缓存区应该是byte[] bt = new byte[1024];字节形式
String len = null;


//循环获取文本内容发送出去,因为PrintWriter的print有自动刷新功能,所以可以正常提交到指定ip地址,如果这里是键盘录入时一定注意调用换行方法,告诉系统提交,不然默认数据未读取完处于阻塞状态
while((len=bure.readLine())!=null){
pw.println(len);
}
//此方法为socket自带结束标记,-1
st.shutdownOutput();

//此方法与文本内容容易重复导致判断错误,停止传输
//此方法特别注意,用来在服务端判断客户端是否读取发送完成,如果没有服务端默认继续等待客户端消息,不会返回“上传成功”,会导致客户端接受不到服务端返回信息,一直阻塞等待接受
//pw.println("over");


//接受服务器返回的数据输出
BufferedReader bu = new BufferedReader(new InputStreamReader(st.getInputStream()));

//获取服务器返回的内容,应为是上次文件,服务器只返回“上传成功”,所以string字符串足够,上面客户端发送是文本所以需要循环发送
String lene = bu.readLine();
System.out.println("服务器返回内容:"+lene);


//关闭流
bure.close();//关闭读取文件流
st.close();//关闭和服务器交互流

}


//服务端
public static void main1(String[] args) throws  Exception{
ServerSocket ss = new ServerSocket(10006);//监听端口等待数据

Socket st = ss.accept();//获取通讯


String ip = st.getInetAddress().getHostAddress();//获取ip
System.out.println("上传数据的客户端ip"+ip);

//获取数据
BufferedReader br = new BufferedReader(new InputStreamReader(st.getInputStream()));

//获取客户端时间戳流
// DataInputStream ds = new DataInputStream(st.getInputStream());
// long l = ds.readLong();//可以通过时间戳进行判断

//服务器保存文件到目录
PrintWriter pw = new PrintWriter(new FileWriter("d:/a.txt"),true);//获取目标文件准备写入数据

String le = null;
while((le=br.readLine())!=null){//必须要有结束标记,不然流判断没读取完一直在读取中
// if(le.equals("over")){//结束标记符,但是在实际开发中不建议使用,有可能在读取文章时,文章中存在over
// break;
// }如果客户端调用了socket的自动结束标记方法,服务器这里将不再判断结束符,readLine()方法会自动判断
pw.println(le);//带自动刷新
}

PrintWriter p = new PrintWriter(st.getOutputStream(),true);
p.println("上传成功");

pw.close();
st.close();
ss.close();

}




}

猜你喜欢

转载自blog.csdn.net/qq_34495753/article/details/80609826