现在的位置: 首页 > 综合 > 正文

黑马程序员_<>

2018年02月17日 ⁄ 综合 ⁄ 共 9528字 ⁄ 字号 评论关闭

---------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------

1. 上传图片

        1.单上传图片

        客户端:

           步骤:1.定义客户端服务,并且指定目标主机和端口

                 2.定义读取字节流,用来读取图片。

                 3.获得客户端的字节输出流,把数据通过网络传给服务端。

                 4.获得客户端的字节输入流,用来获得服务端的反馈信息。

                 5.关闭客户端资源。

 

package www.fuxi.wangluo1;
 
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * 客户端,
 *
 */
public class TcpPhotoClient {
  public static void main(String[] s) throws Exception {
    /**
     * 客户端服务,指定了目标主机和端口号
     */
    Socket client = new Socket("192.168.1.101", 20000);
    /**
     * 字节读取流,用来读取要上传的图片
     */
    FileInputStream in = new FileInputStream("1.jpg");
    /**
     * 客户端的字节输出流,把要上传的通过网络传给服务器
     */
    OutputStream CilentOut = client.getOutputStream();
    byte bu[] = new byte[1024];
    int len = 0;
    while ((len = in.read(bu)) != -1) {//读
      CilentOut.write(bu, 0, len);//写
    }
    client.shutdownOutput();// 输入结束
 
    /**
     * 读取客户端传给的信息
     */
    InputStream ClientIn = client.getInputStream();
    byte b[] = new byte[1024];
    int pl = ClientIn.read(b);
    System.out.println(new String(b, 0, pl));
 
    client.close();
  }
}
 

        服务端:

            步骤:1.定义服务端服务,指定端口号。

                  2.获得从客户端的服务对象,从而获得字节读取流,读取从客户端传的信息。

                  3. 定义写入字节流,把客户端的传给的信息写入到此流中。

                  4.获得客户端的字节写入流,反馈给客户端信息。

 

package www.fuxi.wangluo1;
 
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 服务端
 * @author yang
 */
public class TcpPhotoServer {
  public static void main(String[] s) throws Exception {
    /**
     * 定义服务器端,指定端口,并且获得客户端服务对象
     */
    ServerSocket server = new ServerSocket(20000);
    Socket scoket = server.accept();
    String ip=scoket.getLocalAddress().toString();
    System.out.println();
    /**
     * 字节写入流,用来把数据写入到指定的图片中
     */
    FileOutputStream writer = new FileOutputStream("server.jpg");
    /**
     * 获得客户端的读取流,读取传输的文件
     */
    InputStream ServerInput = scoket.getInputStream();
    byte[] re = new byte[1024];
    int len = 0;
    while ((len = ServerInput.read(re)) != -1) {
      writer.write(re,0, len);
    }
         /**
          * 获得客户端的写入流,反馈给客户端信息
          */
    OutputStream ServerOut = scoket.getOutputStream();
    byte[] out = "上传成功".getBytes();
    ServerOut.write(out, 0, out.length);
    server.close();
  }
}

 

要先启动服务端,然后在启动客户端,否则会是链接不上。

        2.客户端并发上传

    使用多线程来操作,把服务端每个公共执行的存到线程中。

   客户端

 importjava.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
 * 客户端,也可以对文件的格式和大小进行限制
 * 就是读取文件的大小和名字进行判断,然后根据结果进行设置,这里就不过多操作的。
 */
public class TcpPhotoClient {
  public static void main(String[] s) throws Exception {
    /**
     * 客户端服务,指定了目标主机和端口号
     */
    Socket client = new Socket("192.168.1.101", 20000);
    /**
     * 字节读取流,用来读取要上传的图片
     */
    FileInputStream in = new FileInputStream("1.jpg");
    /**
     * 客户端的字节输出流,把要上传的通过网络传给服务器
     */
    OutputStream CilentOut = client.getOutputStream();
    byte bu[] = new byte[1024];
    int len = 0;
    while ((len = in.read(bu)) != -1) {//读
      CilentOut.write(bu, 0, len);//写
    }
    client.shutdownOutput();// 输入结束
 
    /**
     * 读取客户端传给的信息
     */
    InputStream ClientIn = client.getInputStream();
    byte b[] = new byte[1024];
    int pl = ClientIn.read(b);
    System.out.println(new String(b, 0, pl));
 
    client.close();
  }
}
 

 服务端

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
 
/**
 * 服务线程类
 *
 * @author yang
 */
public class TcpServer implements Runnable {
 
  private Socket scoket;
 
  public TcpServer(Socket scoket) {
    this.scoket = scoket;
  }
 
  public void run() {
    String ip = scoket.getLocalAddress().getHostAddress();
    try {
      int count = 0;
      File file = new File(ip + ".jpg");
      while (file.exists()) {
         file = new File(ip + "(" + (count++) + ").jpg");
      }
      /**
       * 字节写入流,用来把数据写入到指定的图片中
       */
      FileOutputStream writer = new FileOutputStream(file);
      /**
       * 获得客户端的读取流,读取传输的文件
       */
      InputStream ServerInput = scoket.getInputStream();
      byte[] re = new byte[1024];
      int len = 0;
      while ((len = ServerInput.read(re)) != -1) {
         writer.write(re, 0, len);
      }
      /**
       * 获得客户端的写入流,反馈给客户端信息
       */
      OutputStream ServerOut = scoket.getOutputStream();
      byte[] out = (ip + "上传成功").getBytes();
      ServerOut.write(out, 0, out.length);
      scoket.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
 
}
 

 

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
 
/**
 * 服务端
 *
 * @author yang
 */
public class TcpPhotoServer {
  public static void main(String[] s) throws Exception {
    /**
     * 定义服务器端,指定端口,并且获得客户端服务对象
     */
    ServerSocket server = new ServerSocket(20000);
    while (true) {
      Socket scoket = server.accept();
      new Thread(newTcpServer(scoket)).start();
    }
 
  }
}

 

2. 客户端并发登录

      客户端:

            步骤:1.定义客户端的服务和端口。

                  2.要定义键盘录入的流和客户端的输出流。

                  2.键盘循环录入,限制三次,每登录一次都要由服务端判断,根据返回的信息判断是否继续尝试登录。

                  3.当三次都没有登录成功,那么就不能继续登录。

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * 客户端
 * @author yang
 *
 */
public class ClientLogin {
  public static void main(String[] s) throws UnknownHostException,
      IOException {
    Socket socket = new Socket("192.168.1.101", 10020);
    BufferedReader bufRe = new BufferedReader(new InputStreamReader(
         System.in));// 读取键盘数据
    /**
     * 获得客户端的输出流,并且封装到打印流中
     */
    PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
    /**
     * 获得客户端的输入流,获得服务端的反馈信息
     */
    BufferedReader readSer = new BufferedReader(new InputStreamReader(
         socket.getInputStream()));
 
    for (int i = 0; i < 3; i++) {
      String line = bufRe.readLine();
      if (line == null)
         break;
      writer.println(line);
      String replay = readSer.readLine();
      System.out.println(replay);
      if (replay.contains("欢迎")) {
         break;
      }
 
    }
    socket.close();
  }
}
 

      服务端:

            步骤:1.定义服务端的服务并指定端口

                  2.获得客户端服务对象,利用其流对象对获得传输过来的信息和反馈信息。

                  3.对存储登录信息的文件进行读取,并且对其和客户端穿过来的信息进行比较。

                  4.限制循环次数为3次。

 

package www.fuxi.wangluo1;
 
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
 * 服务线程
 */
public class UserRun implements Runnable {
 
  private Socket s;
 
  public UserRun(Socket s) {
    this.s = s;
  }
 
  public void run() {
    String ip = s.getInetAddress().getHostAddress();
    System.out.println(ip + ".....contion");
    try {
      for (int i = 0; i < 3; i++) {
         /**
          * 定义读取存储登录用户信息的文件流
          */
         FileReader reader = new FileReader("User.txt");
         BufferedReader bufInfo = new BufferedReader(reader);
         /**
          * 获得客户端的读取流,读取传输过来的信息
          */
         BufferedReader bufR = new BufferedReader(new InputStreamReader(
             s.getInputStream()));
         /**
          * 获得客户端的写入流,把反馈信息反馈给客户端
          */
         PrintWriter writer = new PrintWriter(s.getOutputStream());
         String name = bufR.readLine();
         if (name.equals(null))
           break;
         boolean f = false;
         String line = null;
         while ((line = bufInfo.readLine()) != null) {
 
           if (line.equals(name)) {
             f = true;
             break;
           }
         }
         if (f) {
           writer.println(name + "欢迎您!");
           break;
         } else {
           writer.println(name + "尝试登录!");
         }
 
         s.close();
      }
 
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
 
  }
 
}

package www.fuxi.wangluo1;
 
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 服务端
 * @author yang
 */
public class ServerDeal {
  public static void main(String[] args) throws Exception {
    ServerSocket server = new ServerSocket(10020);
 
    while (true) {
      Socket socket = server.accept();
      new Thread(new UserRun(socket)).start();
    }
  }
 
}

 

3. 浏览器-自定义服务器

      客户端:浏览器

服务端:自定义的服务器

 

import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
 
public class ServerText {
  public static void main(String[] args) throws Exception {
    ServerSocket server = new ServerSocket(20000);
    while (true) {
      Socket socket = server.accept();
      String ip = socket.getInetAddress().getHostAddress();
      PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
 
      System.out.println(ip);
      writer.println("欢迎您" + ip);
      writer.close();
 
    }
  }
}

 

4. 自定义浏览器(GUI)

      客户端:自定义的浏览器

  服务端:tomact服务器

   首先要把tomcat启动,然后把你要发送文件部署到tomcat服务器上。然后使用自定义的浏览器访问。

   使用URL和URLConnection对象。

 

package www.fuxi.wangluo1;
 
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
 
import www.fuxi.GUI.DirDemo;
 
public class MyIEGUI {
 
  private Frame ff;// 窗体
  private TextField text;// 文本框
  private Button bu;// Button
  private TextArea area;// 文本区域
 
  public MyIEGUI() {
    init();
  }
 
  /* 初始化方法 */
  public void init() {
    /* 窗体设置 */
    ff = new Frame("MyIE");
    ff.setSize(400,500);// 设置大小
    ff.setLocation(300,200);// 设置位置
    ff.setLayout(new FlowLayout());// 设置布局
 
    /* TextField设置 */
    text = new TextField(40);// 初始化的时候指定列
    ff.add(text);// 添加到窗体上
    /* Button设置 */
    bu = new Button("转到");
    ff.add(bu);// 添加到窗体上
    /* TextArea 设置 */
    area = new TextArea(20, 50);
    ff.add(area);// 添加到窗体上
    myEvent();
    ff.setVisible(true);// 设置显示
  }
 
  /* 监听器和事件 */
  public void myEvent() {
    /* 设置窗体监听器 */
    ff.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {// 关闭事件
         System.out.println("窗体关闭");
         System.exit(0);
      }
    });
    /* 设置Button的监听器 */
    bu.addActionListener(new ActionListener() {
 
      public void actionPerformed(ActionEvent e) {// 活动事件
         showContent();
 
      }
 
    });
 
    /* 对文本框设置键盘监听器,当点击回车后,和Button的功能一样 */
    text.addKeyListener(new KeyAdapter() {
      public void keyPressed(KeyEvent e) {// 按下事件
         if (e.getKeyCode() == KeyEvent.VK_ENTER)
           showContent();
      }
    });
  }
 
  /* 把查看目录内容功能抽取出来,可以是用键盘监听器事件调用,也可以Button监听
   * 显示内容方法*/
  private void showContent() {
    area.setText("");
    try {
      URL url = new URL(text.getText());//获得URL对象
      URLConnection conn = url.openConnection();//链接对象,这就不用使用Socket了
      //System.out.println(conn);
      InputStream in= conn.getInputStream();
      byte[] buf = new byte[1024];
      int len = in.read(buf);
      String str=new String(buf, 0, len);
      System.out.println(str);
      area.setText(str);
    } catch (Exception e) {
      e.printStackTrace();
    }
    //URL url = newURL("http://192.168.1.101:8088/myweb/index.html");
    /*
     * System.out.println(url.getProtocol());
     *System.out.println(url.getHost()); System.out.println(url.getPath());
     *System.out.println(url.getPort());
     *System.out.println(url.getQuery());
     */
   
   
  }
 
  public static void main(String[] args) {
    new MyIEGUI();
 
  }
 
 
}

---------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流!
--------------------

 

 

 

抱歉!评论已关闭.