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实现的有道云笔记中包含的图片文件的批量下载工具
一个Java实现的有道云笔记中包含的图片文件的批量下载工具
154 0
|
存储 Java
如何将S/4HANA系统存储的图片文件用Java程序保存到本地
我在S/4HANA的事务码MM02里为Material维护图片文件作为附件:
如何将S/4HANA系统存储的图片文件用Java程序保存到本地
|
13天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第11天】 在Java中,高效的并发编程是提升应用性能和响应能力的关键。本文将探讨Java并发的核心概念,包括线程安全、锁机制、线程池以及并发集合等,同时提供实用的编程技巧和最佳实践,帮助开发者在保证线程安全的前提下,优化程序性能。我们将通过分析常见的并发问题,如竞态条件、死锁,以及如何利用现代Java并发工具来避免这些问题,从而构建更加健壮和高效的多线程应用程序。
|
1天前
|
安全 Java 调度
Java线程:深入理解与实战应用
Java线程:深入理解与实战应用
13 0
|
1天前
|
Java
Java中的并发编程:理解和应用线程池
【4月更文挑战第23天】在现代的Java应用程序中,性能和资源的有效利用已经成为了一个重要的考量因素。并发编程是提高应用程序性能的关键手段之一,而线程池则是实现高效并发的重要工具。本文将深入探讨Java中的线程池,包括其基本原理、优势、以及如何在实际开发中有效地使用线程池。我们将通过实例和代码片段,帮助读者理解线程池的概念,并学习如何在Java应用中合理地使用线程池。
|
6天前
|
安全 Java
深入理解 Java 多线程和并发工具类
【4月更文挑战第19天】本文探讨了Java多线程和并发工具类在实现高性能应用程序中的关键作用。通过继承`Thread`或实现`Runnable`创建线程,利用`Executors`管理线程池,以及使用`Semaphore`、`CountDownLatch`和`CyclicBarrier`进行线程同步。保证线程安全、实现线程协作和性能调优(如设置线程池大小、避免不必要同步)是重要环节。理解并恰当运用这些工具能提升程序效率和可靠性。
|
6天前
|
安全 Java
java多线程(一)(火车售票)
java多线程(一)(火车售票)
|
6天前
|
安全 Java 调度
Java并发编程:深入理解线程与锁
【4月更文挑战第18天】本文探讨了Java中的线程和锁机制,包括线程的创建(通过Thread类、Runnable接口或Callable/Future)及其生命周期。Java提供多种锁机制,如`synchronized`关键字、ReentrantLock和ReadWriteLock,以确保并发访问共享资源的安全。此外,文章还介绍了高级并发工具,如Semaphore(控制并发线程数)、CountDownLatch(线程间等待)和CyclicBarrier(同步多个线程)。掌握这些知识对于编写高效、正确的并发程序至关重要。
|
7天前
|
安全 Java 程序员
Java中的多线程并发编程实践
【4月更文挑战第18天】在现代软件开发中,为了提高程序性能和响应速度,经常需要利用多线程技术来实现并发执行。本文将深入探讨Java语言中的多线程机制,包括线程的创建、启动、同步以及线程池的使用等关键技术点。我们将通过具体代码实例,分析多线程编程的优势与挑战,并提出一系列优化策略来确保多线程环境下的程序稳定性和性能。
|
7天前
|
缓存 分布式计算 监控
Java并发编程:深入理解线程池
【4月更文挑战第17天】在Java并发编程中,线程池是一种非常重要的技术,它可以有效地管理和控制线程的执行,提高系统的性能和稳定性。本文将深入探讨Java线程池的工作原理,使用方法以及在实际开发中的应用场景,帮助读者更好地理解和使用Java线程池。