TCP上传图片

上传图片注意的问题:

  1. 图片重名问题
  2. 多客户端并发访问时的等待问题(这个不仅是上传图片的问题,只要多客户端与服务端连接就会发生)

解决:

  1. 把客户端的ip和count(计数)标示作为图片的名字
  2. 利用多线程技术实现并发访问

TCP上传图片的客户端:

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

public class UpLoadPicClient {

    public static void main(String[] args) throws Exception, IOException {

        System.out.println("客户端开启......");
        //1.创建socket客户端
        Socket s = new Socket("192.168.17.1",10000);

        File picFile = new File("1.jpg");

        FileInputStream fis = new FileInputStream(picFile);

        OutputStream out = s.getOutputStream();

        byte[] buf = new byte[1024];

        int len = 0;
        while((len = fis.read(buf))!=-1){
            out.write(buf, 0, len);
        }
        //告诉服务端写完了
        s.shutdownOutput();

        //读取服务器端的数据
        InputStream in = s.getInputStream();
        byte[] bufIn =new byte[1024];
        int lenIn = in.read(bufIn);
        String str = new String(bufIn,0,lenIn);
        System.out.println(str);

        fis.close();
        s.close();

    }

}

TCP上传图片的服务端:

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class UpLoadPicServer {

    public static void main(String[] args) throws Exception {

        System.out.println("服务端开启.....");
        //服务端对象
        ServerSocket ss = new ServerSocket(10000);
        while(true){//服务器端一直是开启状态

        Socket s = ss.accept();//主线程唯一的任务是不断的等待客户端的连接
        //至于每一个连接进来的客户端索要进行的任务,交给其他线程来完成
        //这就实现了多客户端的并发访问
        //这就是服务器端的原理

        new Thread(new UpLoadPic(s)).start();//为每一个连接上的客户端开辟一条线程

        }
//        ss.close(); //服务器端就不需要关闭了

        /*
         * 服务器端的基本技术:
         * 1.ServerSocket
         * 2.IO流
         * 3.多线程
         */

    }

}

客户端连接后所要进行的任务(线程):

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class UpLoadPic implements Runnable {
    private Socket s;

    public UpLoadPic(Socket s) {
        super();
        this.s = s;
    }

    @Override
    public void run() {

        String ip = s.getInetAddress().getHostAddress();
        System.out.println(ip+"...connected");

        File file = getFile("server_pic",ip);//服务端将图片保存的位置

        FileOutputStream fos;
        try {
            fos = new FileOutputStream(file);
            InputStream in = s.getInputStream();

            int len = 0;
            byte[] buf = new byte[1024];
            while((len = in.read(buf))!=-1){
                fos.write(buf,0,len);
            }

            //回馈客户端数据
            OutputStream out = s.getOutputStream();
            out.write("上传图片成功".getBytes());

            fos.close();
            s.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    public static File getFile(String dir,String ip) {
        File pic_dir = new File(dir);
        if(!pic_dir.exists()){
            pic_dir.mkdir();
        }

        int count = 1;
        File file = new File(pic_dir,ip+"("+count+").jpg");//解决图片重名的问题
        while(file.exists()){
            count++;
            file = new File(pic_dir,ip+"("+count+").jpg");
        }
        return file;
    }

}
时间: 2024-10-10 09:20:49

TCP上传图片的相关文章

java网络之tcp

简单tcp传输 package pack; /* 演示tcp传输. 1,tcp分客户端和服务端. 2,客户端对应的对象是Socket. 服务端对应的对象是ServerSocket. 客户端, 通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机. 因为tcp是面向连接的.所以在建立socket服务时, 就要有服务端存在,并连接成功.形成通路后,在该通道进行数据的传输. 需求:给服务端发送给一个文本数据. 步骤: 1,创建Socket服务.并指定要连接的主机和端口. */ impor

黑马程序员------网络编程

1.1 InetAddress InetAddress:构造方法私有,不能直接创建对象. InetAddress getByName(String host):在给定主机名的情况下确定主机的ip地址. InetAddress getLocalHost():返回本地主机. InetAddress[] getAllByName(String host) ip.getHostAddress(), ip.getHostName() 1 示例1: 2 import java.net.InetAddress

JAVA 24 网络通信

网络参考模型: --|| OSI参考模型 --|| TCP/IP参考模型 应用层:http协议,ftp协议 传输层:tcp,udp 网际层:ip TCP和UDP: UDP: 1,面向无连接的,需要将数据封装在数据包中 2,每个数据包大小限制在64k内 3,无连接,是不可靠协议 4,因无连接,速度快 TCP: 1,需要建立连接,形成数据传输通道 2,在连接中进行大数据量传输 3,通过三次握手完成连接,是可靠协议 甲:已你在吗 已:我在 甲:我知道你在了 4,必须建立连接,效率稍低 重要对象介绍  

19、网络编程 (Socket套接字编程)

网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用层.传输层.网络层和链路层,每层分别负责不同的通信功能,接下来针对这四层进行详细地讲解. 链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤.网线提供的驱动. 网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络. 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议. 应用层:主要负责应用程序的协议,例如

Java基础知识强化之网络编程笔记13:TCP之TCP协议上传图片并给出反馈

1. TCP协议上传图片并给出反馈: (1)客户端: 1 package cn.itcast_13; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.FileInputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.net.Socket;

JAVA之旅(三十三)——TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录

JAVA之旅(三十三)--TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录 我们继续网络编程 一.TCP 说完UDP,我们就来说下我们应该重点掌握的TCP了 TCP传输 Socket和ServiceSocket 建立客户端和服务端 建立连接后,通过Socket中的IO流进行数据的传输 关闭Socket 同样的,我们的客户端和服务端都是两个独立的应用 我们通过查阅API文档发现,该对象在建立的时候,就可以去连接指定主机,因为tcp是面向连接的,所以在建立socket服务时,

java 26 - 8 网络编程之 TCP协议上传图片

上次的是上传TXT文件,这次上传的是图片.同样,上传成功需要反馈给客户端. 区别: TXT文件用记事本打开,我们可以看得懂,所以用了缓冲字符流,对通道内的字节流进行包装了. 而图片用记事本打开,我们看不懂,所以就用缓冲字节流,只需要把通道内的字节流转换成高效字节流就可以了. 客户端: 1 public class ClineDemo { 2 public static void main(String[] args) throws IOException { 3 4 // 创建Socket对象

网络编程-TCP程序实例(简单上传图片)

package netTest; /* * 客户端: * 1.服务端点 * 2.读取客户端已有的图片数据 * 3.通过socket输出流将数据发给服务端 * 4.读取服务端的反馈信息 * 5.关闭. * */ import java.io.*; import java.net.*; import java.util.concurrent.SynchronousQueue; public class Client { public static void main(String[] args) t

上传图片Tcp交互

package photodemo; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import j