Java学习笔记

JAVA 学习笔记之 网络编程

2016-11-23  本文已影响11人  红姑娘

网络编程(理解)

* IP地址
    * 计算机在网络中的唯一标识。
    * 现在使用的是:"点分十进制"
* 端口
    * 应用程序的的标记。
* 协议
    * 通信的规则。
 * UDP:不建立连接,数据打包传输,数据有限制,数据不可靠,速度快。
 * TCP:建立连接,数据无限制,数据可靠,速度慢。
网络7层协议.jpg Socket通信概述.jpg UDP发送和接收数据图解.jpg
1. 先开启谁都无所谓。
2. 发送端
 创建发送端的Socket服务对象。
  创建数据并把数据打包。
      发送数据。
      释放资源。
3. 接收端
  创建接收端的Socket服务对象。
  创建数据包。
  接收数据。
  解析数据。
  释放资源。

案例一:UDP协议 键盘录入数据服务器接收并显示数据。

 //SendDemo发送demo

public class SendDemo {
   public static void main(String[] args) throws IOException {

   //创建Socket对象
   DatagramSocket  socket = new DatagramSocket();
   
    // public DatagramPacket(byte[] buf,int length,InetAddress address,int
    // port)
    // buf其实就是要发送的数据信息
    // length表示要发送的数据长度
    // address数据要发到哪里去。对应的那个IP地址对象
    // port端口号
   
   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
   
   String string = null;

   while ((string = reader.readLine()) != null ) {
    
       if ("886".equals(string)) {
           break;
       }

       byte[] by = string.getBytes();
       
       DatagramPacket p = new DatagramPacket(by, by.length, InetAddress.getByName("192.168.3.108"), 10086);
       
       socket.send(p);
   }

   
   socket.close();
   }
}

ReceiveDemo接收demo

public class ReceiveDemo {
public static void main(String[] args) throws IOException {
    
    //创建接收对象 并指定端口
    DatagramSocket socket = new DatagramSocket(10086);
    
    while (true) {
    
        //创建接收数据包 接收数据
        byte[] by = new byte[1024];
        DatagramPacket p = new DatagramPacket(by, by.length);
    
        //接收数据
        socket.receive(p);
    
    //解析数据并显示
    //InetAddress address = p.getAddress();
    //String ip = address.getHostAddress();
    
        byte[] byt = p.getData();
        String string = new String(byt, 0,p.getLength());
    
        System.out.println("获得的数据是:" + string);
    }
    //关闭释放资源
    //socket.close();
 }
}

ChatRoom测试类

public class ChatRoom {
public static void main(String[] args) throws IOException {
    DatagramSocket dsSend = new DatagramSocket();
    DatagramSocket dsReceive = new DatagramSocket(11111);

    SendThread st = new SendThread(dsSend);
    ReceiveThread rt = new ReceiveThread(dsReceive);

    Thread t1 = new Thread(st);
    Thread t2 = new Thread(rt);

    t1.start();
    t2.start();
  }
}

接收数据类ReceiveThread

public class ReceiveThread implements Runnable {
private DatagramSocket ds;

public ReceiveThread(DatagramSocket ds) {
    this.ds = ds;
}

@Override
public void run() {
    try {
        while (true) {
            // 创建数据包
            byte[] bys = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bys, bys.length);

            // 接收数据
            ds.receive(dp);

            // 解析数据
            String ip = dp.getAddress().getHostAddress();
            String data = new String(dp.getData(), 0, dp.getLength());
            System.out.println("from " + ip + " data is " + data);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
  }
}

发送数据类SendThread

public class SendThread implements Runnable {

  private DatagramSocket ds;

  public SendThread(DatagramSocket ds) {
    this.ds = ds;
  }

  @Override
  public void run() {
      try {
        // 封装键盘录入
        BufferedReader br = new BufferedReader(new InputStreamReader(
                System.in));
        String line = null;
        while ((line = br.readLine()) != null) {
            if ("886".equals(line)) {
                break;
            }

            // 创建数据包
            byte[] bys = line.getBytes();
            DatagramPacket dp = new DatagramPacket(bys, bys.length,
                    InetAddress.getByName("192.168.3.108"), 11111);
            // 发送数据
            ds.send(dp);
        }

        // 释放资源
        ds.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
  }
}

TCP发送和接收数据

    必须先开启服务器。
    A:客户端
            创建客户端Socket对象。
            获取输出流。
            写数据。
            释放资源。

    B:服务器端
            创建服务器Socket对象。
            监听客户端连接。
            获取输入流。
            读取数据。
            释放资源。
TCP协议发送和接收数据图解.jpg

案例一:TCP协议 客户端(ClientDemo)是键盘录入,服务器(ServerDemo)是写到文件。

ClientDemo 模拟客户端

public class ClientDemo {
public static void main(String[] args) throws IOException {
    // 创建客户端对象
    Socket s = new Socket("192.168.32.80", 12345);

    // 键盘录入
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    // 把通道内的输出流包装
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
            s.getOutputStream()));

    String line = null;
    while ((line = br.readLine()) != null) {
        if ("over".equals(line)) {
            break;
        }

        bw.write(line);
        bw.newLine();
        bw.flush();
    }

    s.close();
}
}

ServerDemo 模拟服务器

public class ServerDemo {
public static void main(String[] args) throws IOException {
    // 创建服务器Socket对象
    ServerSocket ss = new ServerSocket(12345);
    // 监听客户端连接
    Socket s = ss.accept();
    // 封装通道内的输入流
    BufferedReader br = new BufferedReader(new InputStreamReader(
            s.getInputStream()));
    // 把数据写到文件
    BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));

    String line = null;
    while ((line = br.readLine()) != null) {
        bw.write(line);
        bw.newLine();
        bw.flush();
    }

    bw.close();
    s.close();
    ss.close();
}
}

案例二:TCP协议 客户端是读取文件,服务器是写到文件。反馈信息

ClientDemo 模拟客户端

 public class ClientDemo {
public static void main(String[] args) throws IOException {
    // 创建客户端对象
    Socket s = new Socket("192.168.32.80", 12345);

    // 读取文件的数据
    BufferedReader br = new BufferedReader(new FileReader(
            "InetAddressDemo.java"));
    // 把通道内的输出流包装
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
            s.getOutputStream()));

    String line = null;
    while ((line = br.readLine()) != null) {
        bw.write(line);
        bw.newLine();
        bw.flush();
    }

    // bw.write("你可以释放了");
    // bw.newLine();
    // bw.flush();
    s.shutdownOutput(); // 禁用输出流

    // 获取服务器的反馈
    // 把通道内的输入流包装
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            s.getInputStream()));
    String data = reader.readLine(); // 阻塞式
    System.out.println("client:" + data);

    // 释放资源
    br.close();
    s.close();
}
}

ServerDemo 模拟服务器

public class ServerDemo {
public static void main(String[] args) throws IOException {
    // 创建服务器对象
    ServerSocket ss = new ServerSocket(12345);

    // 监听客户端连接
    Socket s = ss.accept();

    // 把通道内的输入流包装
    BufferedReader br = new BufferedReader(new InputStreamReader(
            s.getInputStream()));
    // 把数据写入文件
    BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));

    String line = null;
    while ((line = br.readLine()) != null) { // 阻塞式
    // if("你可以释放了".equals(line)){
    // break;
    // }
        
        bw.write(line);
        bw.newLine();
        bw.flush();
    }

    // 给客户端一个反馈
    // 把通道内的输出流包装
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
            s.getOutputStream()));
    writer.write("文件上传成功");
    writer.newLine();
    writer.flush();

    // 释放资源
    bw.close();
    s.close();
    ss.close();
}
}

案例三:TCP协议 客户端是读取图片,服务器是写到图片。反馈信息

ClientDemo 模拟客户端

public class ClientDemo {
public static void main(String[] args) throws IOException {
    // 窗口客户端对象
    Socket s = new Socket("192.168.32.80", 12345);

    // 读取图片
    InputStream is = new FileInputStream("mn.jpg");
    // 写到通道
    OutputStream os = s.getOutputStream();

    int by = 0;
    while ((by = is.read()) != -1) {
        os.write(by);
    }
    s.shutdownOutput();

    // 获取服务器的反馈
    // 把通道内的输入流包装
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            s.getInputStream()));
    String data = reader.readLine(); // 阻塞式
    System.out.println("client:" + data);

    // 释放资源
    is.close();
    s.close();
}
}

ServerDemo 模拟服务器

public class ServerDemo {
public static void main(String[] args) throws IOException {
    // 创建服务器对象
    ServerSocket ss = new ServerSocket(12345);

    // 监听客户端连接
    Socket s = ss.accept();

    // 获取输入流
    InputStream is = s.getInputStream();
    // 获取输出流
    OutputStream os = new FileOutputStream("copy.jpg");

    int by = 0;
    while ((by = is.read()) != -1) {
        os.write(by);
    }

    // 给出反馈
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
            s.getOutputStream()));
    writer.write("文件上传成功");
    writer.newLine();
    writer.flush();

    os.close();
    s.close();
    ss.close();
}
}
上一篇下一篇

猜你喜欢

热点阅读