先了解一下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();
}}
注意:本文归作者所有,未经作者允许,不得转载