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

简介: //客户端部分 package testSix; import java.awt.Graphics; import java.io.IOException; import java.io.
//客户端部分
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();
    }
}

 

目录
相关文章
|
存储 Java
如何将S/4HANA系统存储的图片文件用Java程序保存到本地
我在S/4HANA的事务码MM02里为Material维护图片文件作为附件:
如何将S/4HANA系统存储的图片文件用Java程序保存到本地
一个Java实现的有道云笔记中包含的图片文件的批量下载工具
一个Java实现的有道云笔记中包含的图片文件的批量下载工具
164 0
|
4天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
25 6
【Java学习】多线程&JUC万字超详解
|
3天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
7天前
|
安全 Java 程序员
Java编程中实现线程安全的策略
【8月更文挑战第31天】在多线程环境下,保证数据一致性和程序的正确运行是每个程序员的挑战。本文将通过浅显易懂的语言和实际代码示例,带你了解并掌握在Java编程中确保线程安全的几种策略。让我们一起探索如何用同步机制、锁和原子变量等工具来保护我们的数据,就像保护自己的眼睛一样重要。
|
7天前
|
安全 Java 开发者
深入浅出Java多线程编程
【8月更文挑战第31天】本文旨在通过浅显易懂的语言和实例,为初学者揭开Java多线程编程的神秘面纱。我们将从基础概念出发,逐步深入到多线程的创建、同步机制及实际应用,帮助读者构建起完整的多线程知识体系。文章不仅包含理论介绍,还提供代码示例,让读者能够动手实践,加深理解。无论你是编程新手还是希望巩固多线程知识的开发者,这篇文章都将是你不可多得的学习资源。
|
6天前
|
Java 调度
Java中的多线程基础与实践
【8月更文挑战第31天】本文将深入浅出地讲解Java中多线程的基础知识,并通过实例展示如何在Java程序中实现多线程。我们将从多线程的基本概念出发,逐步深入到线程的创建、控制以及同步机制,最后通过一个简易版的生产者消费者模型来实践这些知识点。文章旨在帮助初学者快速掌握多线程编程的关键技能,并理解其背后的原理。
|
9天前
|
Java
在Java多线程领域,精通Lock接口是成为高手的关键。
在Java多线程领域,精通Lock接口是成为高手的关键。相较于传统的`synchronized`,Lock接口自Java 5.0起提供了更灵活的线程同步机制,包括可中断等待、超时等待及公平锁选择等高级功能。本文通过实战演练介绍Lock接口的核心实现——ReentrantLock,并演示如何使用Condition进行精确线程控制,帮助你掌握这一武林秘籍,成为Java多线程领域的盟主。示例代码展示了ReentrantLock的基本用法及Condition在生产者-消费者模式中的应用,助你提升程序效率和稳定性。
15 2
|
9天前
|
Java 开发者
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选。相比 `synchronized`,Lock 提供了更灵活强大的线程同步机制,包括可中断等待、超时等待、重入锁及读写锁等高级特性,极大提升了多线程应用的性能和可靠性。通过示例对比,可以看出 Lock 接口通过 `lock()` 和 `unlock()` 明确管理锁的获取和释放,避免死锁风险,并支持公平锁选择和条件变量,使其在高并发场景下更具优势。掌握 Lock 接口将助力开发者构建更高效、可靠的多线程应用。
11 2
|
9天前
|
Java 测试技术
Java多线程同步实战:从synchronized到Lock的进化之路!
Java多线程同步实战:从synchronized到Lock的进化之路!
71 1
下一篇
DDNS