你的位置:首页 > Java教程

[Java教程][javaSE] 网络编程(TCP


客户端:

1.服务端点

2.读取客户端已有的图片数据

3.通过socket输出流将数据发给服务端

4.读取服务端反馈信息

5.关闭

 

获取Socket对象,new出来,构造参数:String的服务端ip,int的端口号

调用Socket对象的getOutputStream()方法,得到OutputStream输出流对象

获取FileInputStream对象,new出来,构造参数:String的文件路径

while循环调用,条件FileInputStream对象的read()方法,读取到字节数组中

循环中,调用OutputStream输出流对象的write()方法,写入数据,参数:byte[],0,len

调用Socket对象的shutDownOutput()方法,通知服务端写入完成

 

调用Socket对象的getInputStream()方法,得到InputStream输入流对象

调用InputStream输入流对象的read()方法,读取,并打印

 

调用FileInputStream对象的close()方法

调用Socket对象的close()方法

 

服务端:

正常读取

 

解决并发

上面的例子,一次只能有一个客户端服务,解决并发上传的问题,使用多线程处理每个来访的客户

定义一个类PicThread,实现Runnable接口

定义构造函数,传递进来Socket对象

实现run()方法,在try-catch中捕获异常,正常读取Socket对象的流

 

 

解决文件覆盖

文件的名称采用ip+(数字),例如:192.168.1.100(2).jpg

获取ip 方法,socket.getInetAddress().getHostAddress()

第一次进入,文件名192.168.1.100.jpg

第二次进入,判读文件已存在,文件名变成192.168.1.100(1).jpg

 

主函数传值形式并判断

判断有一个参数 arg.length==1

判断是文件,并且存在  File对象的exists()方法和isFile()方法

判断文件后缀,File对象的getName().endsWith(“.jpg”)方法

判断文件大小,File对象的length()方法

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.net.UnknownHostException;class UploadPicClient {  /**   * @param args   * @throws IOException   * @throws UnknownHostException   */  public static void main(String[] args) throws Exception {    //判断参数    if(args.length!=1){      System.out.println("请选择一个文件");      return;    }    File file=new File(args[0]);    if(!file.exists()||!file.isFile()){      System.out.println("请选择一个存在的文件");      return;    }    if(!file.getName().endsWith(".png")||file.length()>(1024*1024)){      System.out.println("请选择小于1M的png文件");      return;    }    Socket socket = new Socket("127.0.0.1", 10001);    OutputStream out = socket.getOutputStream();    // 输出    FileInputStream fileInputStream = new FileInputStream("E:/11.png");    byte[] b = new byte[1024];    int len = 0;    while ((len = fileInputStream.read(b)) != -1) {      out.write(b, 0, len);    }    // 通知服务端    socket.shutdownOutput();    // 接收反馈    InputStream inputStream = socket.getInputStream();    byte[] res = new byte[1024];    len = inputStream.read(res);    System.out.println(new String(res, 0, len));    out.close();    socket.close();  }}/** * 多线程上传 * @author taoshihan * */class UploadPicServerThread implements Runnable {  private Socket socket;  public UploadPicServerThread(Socket s) {    this.socket = s;  }  @Override  public void run() {    // 读取    InputStream is;    try {      is = socket.getInputStream();      byte[] res = new byte[1024];      int len = 0;      // 解决文件覆盖      String ip = socket.getInetAddress().getHostAddress();      int fileNum = 1;      File file = new File(ip + ".png");      while (file.exists()) {        file = new File(ip + "(" + (fileNum++) + ").png");      }      FileOutputStream fos = new FileOutputStream(file);      while ((len = is.read(res)) != -1) {        fos.write(res, 0, len);      }      // 反馈      OutputStream os = socket.getOutputStream();      os.write("上传成功!".getBytes());      is.close();      os.close();      fos.close();    } catch (Exception e) {      e.printStackTrace();    }  }}// 服务端public class UploadPicServer {  /**   * @param args   * @throws Exception   */  public static void main(String[] args) throws Exception {    ServerSocket serverSocket = new ServerSocket(10001);    while (true) {      Socket socket = serverSocket.accept();      new Thread(new UploadPicServerThread(socket)).start();    }  }}