客户端上传一张图片到服务端,服务端将该图片保存到本机的D盘根目录下, 并回复客户机:图片已经收到
服务端:
/** 服务端
*
* */
public class Server {
public static void main(String[] args) throws IOException {
// 1.创建服务器:注意端口不能冲突
ServerSocket ss = new ServerSocket(6666);
System.out.println("【服务端】");
// 2.等待连接
Socket sk = ss.accept();
// 3.从连接管道中获取IO流,接收图片要使用字节流,
// 字节输入流:读取图片
InputStream is = sk.getInputStream();
// 为了保存图片,需要自己新建一个文件输出流
FileOutputStream fos = new FileOutputStream("d:\\abc.jpg");
System.out.println("准备接收图片。。。。。");
// 4.从字节流中读取图片字节,并保存到D盘
byte[] b = new byte[1024];
int len;
while ((len = is.read(b)) != -1) {
fos.write(b, 0, len);
}
System.out.println("图片已经保存至D盘");
// 5.回复客户消息
// 可以使用带缓冲的字符输出流:为了回复客户消息用的,仅仅发送字符使用
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
bw.write("客户你好,图片我已经收到");
bw.newLine(); // 写出一个行的标记 或着在上面字符串中使用 \n,因为对方在读取一行的时候以此标记作为读取的结束
bw.flush(); // 清空缓冲区:把所有缓冲区中的数据写出去
// 6.释放资源
fos.close(); // 关闭我们自己创建的文件输出流
sk.close(); // 关闭连接
ss.close(); // 关闭服务
}
}
客户端:
/**
* 客户端上传一张图片给服务器,并接收服务器的反馈
*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
// 1.客户端
System.out.println("【客户端】");
Socket sk = new Socket("127.0.0.1", 6666);
// 2.读取本地的图片,并发送出去,用哪些IO流
// ① 文件输入流:读取本机D盘的那张图片
FileInputStream fis = new FileInputStream("d:\\hdl.jpg");
// ② 输出流:从连接中获取就可以
OutputStream os = sk.getOutputStream();
System.out.println("准备发送图片......");
byte[] b = new byte[1024];
int len;
while ((len = fis.read(b)) != -1) {
os.write(b, 0, len);
}
sk.shutdownOutput(); //注意:至关重要!写入结束的标记,否则服务端在接收字节的时候不知道对方的输出流什么时候结束,会一直等待读取
System.out.println("图片发送完毕");
// 3.接收服务端的反馈,使用 输入流
BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
System.out.println("服务器反馈:"+br.readLine());
fis.close();
sk.close();
}
}