JAVA 学习笔记之 网络编程

网络编程(理解)

  • 用编程语言来实现计算机的资源共享和信息传递。

    • 计算机网络:多台独立的计算机用网络通信设备连接起来的网络。
      • 实现资源共享和数据传递。
  • 网络通信的三要素

* IP地址
    * 计算机在网络中的唯一标识。
    * 现在使用的是:"点分十进制"
* 端口
    * 应用程序的的标记。
* 协议
    * 通信的规则。
 * UDP:不建立连接,数据打包传输,数据有限制,数据不可靠,速度快。
 * TCP:建立连接,数据无限制,数据可靠,速度慢。
  • 网络7层协议图解

网络7层协议.jpg
  • Socket通信概述图解
Socket通信概述.jpg
  • UDP发送和接收数据图解
UDP发送和接收数据图解.jpg
  • UDP发送和接收数据
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();
 }
}
  • UDP通讯简单使用多线程优化

    • 直接看代码

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协议发送和接收数据图解
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();
}
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容

  • title: 网络基础学习总结(1) tags: 网络 categories:笔记 date: 2017-06-1...
    行径行阅读 2,514评论 0 3
  • 1. 网络编程概述 1.1 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接...
    JackChen1024阅读 1,035评论 0 3
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 13,057评论 6 174
  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,052评论 0 8
  • 定义 网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。网络协议主要由三个要素组成:语义、语法及时...
    FlyAndroid阅读 987评论 0 10