java中图片文件的传输及显示(Socket以及ServerSocket演示)

简介:

//客户端部分
package testSix;

import java.awt.Graphics;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;


class MyPanel extends JPanel{
    private ImageIcon ii;
    public MyPanel(ImageIcon ii){
        this.ii = ii;
    }
    
    protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          g.drawImage(ii.getImage(), 0, 0, 300, 400, this);
      }
}

public class SocketDemo extends JFrame{
      private Socket st = null;
      public SocketDemo(){
          try{
              try{
                  //建立客户端
                  st =  new Socket(InetAddress.getLocalHost(), 10000);
                  
                  //返回套接字具有关联的通道的输出流,则得到的输出流会将其所有操作委托给通道
                  OutputStream os = st.getOutputStream();
                  byte[] bt = "哥们儿, 给我来一张背景图片!".getBytes();
                  os.write(bt);
                  
                  //返回套接字具有关联的通道输入流,则得到的输入流会将其所有操作委托给通道
                  InputStream is = st.getInputStream();
                  int len = is.read(bt);
                  System.out.println(new String(bt, 0, len));
                  
                  //将输入流按照下面方式处理, 根据Iterator<ImageReader> itImage是否能
                  //成功的返回一个ImageReader对象确认该流文件是否是一个图片文件!
                  //并ImageReader类中的getFormatName()得到文件的格式!
                  //通过最后可以通过ImageIcon的byte[]构造函数建立ImageIcon对象!
                  //最后将图片显示在面板上!
                  ImageInputStream iis = ImageIO.createImageInputStream(is);
                  Iterator<ImageReader> itImage = ImageIO.getImageReaders(iis);
                  if(itImage.hasNext()){
                      ImageReader reader = itImage.next();
                      byte[] imageByte = new byte[102400*10];
                      iis.read(imageByte);
                      ImageIcon ii = new ImageIcon(imageByte, reader.getFormatName());
                      add(new MyPanel(ii));
                  }
                  
              }finally{
                    st.close();
              }
          }catch(IOException e){
              e.printStackTrace();
          }
          setSize(300, 400);
          setVisible(true);
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      }
      
      public static void main(String[] args){
          new SocketDemo();
      }
}


//服务端部分
package testSix;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketDemo{
    private ServerSocket sst = null;
    private Socket st = null;
    public ServerSocketDemo(){
       try{
            try {
                    //建立服务端
                    sst = new ServerSocket(10000);
                    
                    //侦听并接受到此服务套接字的连接。此方法在进行连接之前一直阻塞。 创建新套接字 
                    st = sst.accept();
                    
                    //得到客户端传输过来的流
                    InputStream is = st.getInputStream();
                    byte[] bt = new byte[1024];
                    int len = is.read(bt);
                    System.out.println(new String(bt, 0, len));
                    OutputStream os  = st.getOutputStream();
                    os.write("好了,知道了!".getBytes());
                    
                    //将图片文件传输过去
                    FileInputStream fis = new FileInputStream(new File("q12.jpg"));
                    while((len = fis.read(bt)) != -1){//先将流文件变成byte[], 然后利用套接字的输出流发送给客户端
                         os.write(bt);
                         os.flush();
                    }
                
            }finally{
                    st.close();
                    sst.close();
            }
       }catch(IOException e){
           e.printStackTrace();
       }
        
    }
    
    public static void main(String[] args){
         new ServerSocketDemo();
    }
}

目录
相关文章
|
12天前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
42 4
|
12天前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
40 2
|
3天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
3天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
6天前
|
Java
[Java]Socket套接字(网络编程入门)
本文介绍了基于Java Socket实现的一对一和多对多聊天模式。一对一模式通过Server和Client类实现简单的消息收发;多对多模式则通过Server类维护客户端集合,并使用多线程实现实时消息广播。文章旨在帮助读者理解Socket的基本原理和应用。
12 1
|
11天前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
|
12天前
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
29 1
|
12天前
|
监控 Java
Java定时扫码一个文件夹下的文件,如何保证文件写入完成后才进行处理?
【10月更文挑战第13天】Java定时扫码一个文件夹下的文件,如何保证文件写入完成后才进行处理?
46 1
|
5天前
|
缓存 Java 程序员
Java|SpringBoot 项目开发时,让 FreeMarker 文件编辑后自动更新
在开发过程中,FreeMarker 文件编辑后,每次都需要重启应用才能看到效果,效率非常低下。通过一些配置后,可以让它们免重启自动更新。
10 0
|
3天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
71 38