Java基于TCP协议socket网络编程的文件传送的实现
Tyler Yue 人气:0先了解一下socket基本概念
socket也叫套接字:
是指在网路中不同主机上的应用进程之间,进行双向通信的端点的抽象。
简单理解就是:
两个主机之间要通信,就需要知道彼此的ip,端口号等信息,而一台主机这些信息的集合:
就可以理解为一个端点,即为套接字
双方通过套接字作为一种坐标,建立信息通道,形成连接(两点连接一条直线)
简单理解了套接字的概念后,来看看如何通过java socket编程来实现
两台主机文件的接收与发送:
代码如下:
发送方:
import java.io.*; import java.net.InetAddress; import java.net.Socket; /** * 发送者 */ public class TcpSendCilent { public static void main(String[] args) throws Exception { //1.通过socket对象 创建socket连接 Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000); //2,创建一个字节输出流 OutputStream os = socket.getOutputStream(); //3.字节文件输入流 读取文件 //避免出错 写需要发送文件的绝对路径 FileInputStream fis = new FileInputStream(new File("F:/TEST/1604407051256.jpg")); //4.字节文件输出流 写出文件 byte[] buffer=new byte[1024*10]; int len; while ((len=fis.read(buffer))!=-1){ //socket编程基于I/O流 所以 //输出流写转为字节数组的文件 =向接收方发送文件 os.write(buffer,0,len); } //通知服务器我传送完了 调用shutdownOutput() 否则影响接下来代码执行 socket.shutdownOutput(); //确定服务器接受完毕,断开连接 //获取接收方响应回来的 接受完毕! 响应 InputStream inputStream = socket.getInputStream(); ByteArrayOutputStream baos=new ByteArrayOutputStream(); byte[] bytes2=new byte[1024*10]; int len2; while ((len2=inputStream.read(bytes2))!=-1){ baos.write(bytes2,0,len2); } //显示接收方的响应 System.out.println(baos.toString()); //发送结束后,最后关闭所有资源 //关闭资源好习惯 这部分写的简单 //一般建议先进行一个非空判断再关闭 baos.close(); fis.close(); os.close(); socket.close(); } }
接收方:
import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * 接收端 */ public class TcpAcceptServer { public static void main(String[] args) throws IOException { //通过ServerSocket对象 创建接收端套接字 ServerSocket serverSocket=null; //套接字 Socket socket=null; //字节输入流 InputStream in=null; //默认参数定义端口号 发送方依据这个端口号发送 serverSocket=new ServerSocket(9000); socket = serverSocket.accept(); //socket对象 获取输入流,拿到文件 in = socket.getInputStream(); //将发送者发送过来的 文件通过文件字节输出流 输出到指定路径下 FileOutputStream fos = new FileOutputStream(new File("F:/recevice.jpg")); int len; byte[] bytes=new byte[1024*10]; while ((len=in.read(bytes))!=-1){ fos.write(bytes,0,len); } //通知发送者接受完毕了 OutputStream outputStream = socket.getOutputStream(); outputStream.write("我是文件接收者:我已成功接受".getBytes()); //接受结束后,关闭资源好习惯 这部分写的简单 //一般建议先进行一个非空判断再关闭 fos.close(); serverSocket.close(); socket.close(); in.close(); } }
测试方法:
以上代码可直接粘贴测试
1、先运行接收者等待接受,
2、再运行发送者,
3、等待接收者向发送者响应: 我是文件接收者:我已成功接受;
4、接收者指定接受目录下、查看接收文件存在即为接收成功!
总结:
这个demo实现并不是很难,主要考验了我们对于io流的熟练程度
加载全部内容