IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 多线程+UDP练习 -> 正文阅读

[网络协议]多线程+UDP练习

1、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。考虑到线程的安全性写出程序。

package classlib.Day0311.Practice;

/**
 * @author 35125
 */
public class Test01 {
    private int j;
    public static void main(String[] args) {
        Test01 t = new Test01();
        Add add = t.new Add();
        Sub sub = t.new Sub();
        for (int i = 0; i < 2; i++) {
            Thread tt = new Thread(add);
            tt.start();
            tt = new Thread(sub);
            tt.start();
        }

    }

    private synchronized void add(){
        j++;
        System.out.println(Thread.currentThread().getName()+"--->增加"+j);
    }
    private synchronized void sub(){
        j--;
        System.out.println(Thread.currentThread().getName()+"--->减去"+j);
    }

    class Add implements Runnable{
        @Override
        public void run() {
            for (int i = 0; i < 20; i++) {
                add();
            }
        }
    }

    class Sub implements Runnable{
        @Override
        public void run() {
            for (int i = 0; i < 20; i++) {
                sub();
            }
        }
    }
}

2、同时下载四张图片。

package classlib.Day0311.Practice;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;

/**
 * @author 35125
 */
public class Test02 implements Runnable{
    //图片地址
    private String path;
    //保存的文件名
    private String name;

    public Test02(String path, String name) {
        this.path = path;
        this.name = name;
    }

    @Override
    public void run() {
        Download dl = new Download();
        dl.downloader(path,name);
        System.out.println("下载了文件名为:"+name);
    }

    public static void main(String[] args) {
        Test02 t1 = new Test02("https://image.baidu.com/search/detail?tn=baiduimagedetail&word=%E5%9F%8E%E5%B8%82%E5%BB%BA%E7%AD%91%E6%91%84%E5%BD%B1%E4%B8%93%E9%A2%98&album_tab=%E5%BB%BA%E7%AD%91&album_id=7&ie=utf-8&fr=albumsdetail&cs=1595072465,3644073269&pi=3977&pn=0&ic=0&objurl=https%3A%2F%2Ft7.baidu.com%2Fit%2Fu%3D1595072465%2C3644073269%26fm%3D193%26f%3DGIF","11.jpg");
        Test02 t2 = new Test02("https://image.baidu.com/search/detail?tn=baiduimagedetail&word=%E5%9F%8E%E5%B8%82%E5%BB%BA%E7%AD%91%E6%91%84%E5%BD%B1%E4%B8%93%E9%A2%98&album_tab=%E5%BB%BA%E7%AD%91&album_id=7&ie=utf-8&fr=albumsdetail&cs=1956604245,3662848045&pi=3979&pn=2&ic=0&objurl=https%3A%2F%2Ft7.baidu.com%2Fit%2Fu%3D1956604245%2C3662848045%26fm%3D193%26f%3DGIF","22.jpg");
        Test02 t3 = new Test02("https://img2.baidu.com/it/u=1835843610,1575206394&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=999","333.jpg");
        Test02 t4 = new Test02("https://img1.baidu.com/it/u=2045922693,212563729&fm=253&fmt=auto&app=120&f=JPEG?w=1024&h=576","444.jpg");

        new Thread(t1).start();
        new Thread(t2).start();
        new Thread(t3).start();
        new Thread(t4).start();
    }
}
//下载器
class Download{
    //下载方法
    public void downloader(String path,String name){
        try {
            FileUtils.copyURLToFile(new URL(path),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("io异常,下载方法有问题。");
        }
    }
}

3、通信软件的功能(基于UDP)
有客户端和服务器端,实现客户端和服务器相互不停的发送和接收消息。
要求发送和接收消息可以同时进行。

package classlib.Day0311.Practice;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class TalkSend implements Runnable{
    DatagramSocket socket =null;
    BufferedReader br =null;

    private int fromPort;
    //对方的ip和端口号
    private String toIP;
    private int toPort;

    public TalkSend( int fromPort, String toIP, int toPort) {
        this.fromPort = fromPort;
        this.toIP = toIP;
        this.toPort = toPort;

        try {
            DatagramSocket socket = new DatagramSocket(fromPort);
            br = new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

        while (true){
            try{
                String data = br.readLine();

                byte[] bytes = data.getBytes("UTF-8");

                DatagramPacket dp = new DatagramPacket(bytes,0,data.length(),new InetSocketAddress(this.toIP,this.toPort));

                socket.send(dp);

                if (data.equals("bye")){
                    break;
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        socket.close();
    }
}

package classlib.Day0311.Practice;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class TalkReceive implements Runnable{
    DatagramSocket socket = null;

    private int port;
    private String msgFrom;

    public TalkReceive(int port,String msgFrom) {
        this.port = port;
        this.msgFrom = msgFrom;
        try {
            socket = new DatagramSocket(6666);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

        while (true){
            try {
                byte[] container = new byte[1024];
                DatagramPacket p = new DatagramPacket(container,0,container.length);
                socket.receive(p);

                //断开连接  bye
                byte[] data = p.getData();
                String s = new String(data, 0, data.length,"UTF-8");

                System.out.println(msgFrom+":"+s);

                if (s.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        socket.close();
    }
}

package classlib.Day0311.Practice;

import javax.sound.midi.Receiver;

/**
 * @author 35125
 */
public class TalkStu {
    public static void main(String[] args) {
        //开启两个线程
        new Thread(new TalkSend(7777,"localhost",9999)).start();
        new Thread(new TalkReceive(8888,"老师")).start();
    }
}

package classlib.Day0311.Practice;

/**
 * @author 35125
 */
public class TalkTeacher {
    public static void main(String[] args) {
        new Thread(new TalkSend(5555,"localhost",8888)).start();
        new Thread(new TalkReceive(9999,"学生")).start();
    }
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 22:11:44  更:2022-03-13 22:12:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:27:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码