黑马程序员_<<TCP练习>>

来源:互联网 发布:淘宝购买iphone7p有锁 编辑:程序博客网 时间:2024/06/03 09:18

---------------------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培训、期待与您交流! --------------------