会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132428个问题
JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 3031楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 3032楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术(旧) 3033楼

老师,我想问一下,为什么我敲的程序可以运行,不会报错,但是到了发消息的时候到了第三句对方就会收不到,三句可能就只能收到一句的这种情况,请您帮我看一看是怎么回事

package cn.zl.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) throws IOException {
        System.out.println("--------=====客服=====--------");
        Scanner sc = new Scanner(System.in);
        //创建DatagramSocket对象
        DatagramSocket ds = new DatagramSocket(9999);
        while(true) {
            //创建字节数组的数据包,用于接受数据
            byte[] buf = new byte[1024];
            DatagramPacket dp = new DatagramPacket(buf, buf.length);
            //接收数据
            ds.receive(dp);
            String st = new String(dp.getData(), 0, dp.getLength());
            System.out.println("顾客:" + st);
            //准备需要发送的内容
            String s = sc.next();
            byte[] buff = s.getBytes();
            //创建DatagramPacket用于发送
            DatagramPacket dp2 = new DatagramPacket(buff, buff.length, InetAddress.getByName("localhost"), 8888);
            //发送
            ds.send(dp2);
            if("OK".equals(s)){
                break;
            }
        }
        ds.close();
    }
}
package cn.zl.udp;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) throws IOException {
        System.out.println("----------=====顾客=====---------");
        Scanner sc = new Scanner(System.in);
        //创建DatagramSocket对象
        DatagramSocket ds = new DatagramSocket(8888);
        while(true) {
            //准备发送的数据
            byte[] buf = sc.next().getBytes();
            //创建数据包
            DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("localhost"), 9999);
            //发送数据
            ds.send(dp);
            //创建一个数组用于接收数据
            byte[] buf2 = new byte[1024];
            //创建一个DatagramSocket用于接收数据
            DatagramPacket dp2 = new DatagramPacket(buf2, buf2.length);
            //接收
            ds.receive(dp2);
            String st = new String(dp2.getData(), 0, dp2.getLength());
            System.out.println("人工:" + st);
            if("OK".equals(sc.next())){
                break;
            }
        }
        ds.close();
    }
}

运行的结果是这样的:

image.png

image.png

从第三句话开始就出现了收不到信息的情况

JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 3034楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程和并发编程(旧) 3035楼

package com.bjsxt.client;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
 
/**
 * 客户端(做好准备与服务器端通信),以字节流作为传输方式
 * @author Administrator
 *
 */
public class TestClient {
    public static void main(String[] args) throws UnknownHostException, IOException {
        //新建socket对象
        Socket client = new Socket("127.0.0.1",9999);
         
        //新建输出流对象(因为要给服务器端发送消息,所以得有输出流对象)
        OutputStream os = client.getOutputStream();
    //  os.write("来自客户端的请求:abc".getBytes());
        os.write("来自服务器的请求:abc".getBytes());
         
        //打印一句话表明,客户端已发出请求
        System.out.println("---客户端已发出请求---");
         
        //新建输入流对象(从服务器端接收消息,所以得有输入流对象,相当于从服务器端读取内容)
        InputStream is = client.getInputStream();
        //将读到的输入的内容存储,并打印
        byte[] buf = new byte[1024];
        int len =0;
        while((len=is.read(buf))!=-1) {
            System.out.println(new String(buf,0,len));
        }
         
        //关闭流
        if(is!=null) {
            is.close();
        }
        if(os!=null) {
            os.close();
        }
    }
 
}

Error:(19, 32) java: 无法将类 com.sun.org.apache.xpath.internal.operations.String中的构造器 String应用到给定类型;

  需要: 没有参数

  找到: byte[],int,int

  原因: 实际参数列表和形式参数列表长度不同

老师这是什么原因呀

JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 3038楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术 3040楼

为什么我这个生产者只生产娃哈哈 , 而且 后面的null值是怎么回事儿?

public class Goods {
    private String name;//商品名字
    private String brand;//

    public Goods() {
    }

    public Goods(String name, String brand) {
        this.name = name;
        this.brand = brand;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getName() {
        return name;
    }

    public String getBrand() {
        return brand;
    }
    //编写一个赋值方法,同步监视器就为当前对象
    public synchronized void set(String nane ,String brand) throws InterruptedException {
        this.setName(name);
        Thread.sleep(300);
        this.setBrand(brand);
        System.out.println("生产者线程生产了:"+this.getBrand()+"---"+this.getName());
    }
    public synchronized void get ()throws InterruptedException{
        System.out.println("消费者线程取走了:"+this.getBrand()+"---"+this.getName());
    }
}

结果:

/**

生产者线程生产了:娃哈哈---null
消费者线程取走了:娃哈哈---null
消费者线程取走了:娃哈哈---null
消费者线程取走了:娃哈哈---null
消费者线程取走了:娃哈哈---null
消费者线程取走了:娃哈哈---null
消费者线程取走了:娃哈哈---null
消费者线程取走了:娃哈哈---null
消费者线程取走了:娃哈哈---null
消费者线程取走了:娃哈哈---null
消费者线程取走了:娃哈哈---null
生产者线程生产了:娃哈哈---null
生产者线程生产了:娃哈哈---null
生产者线程生产了:娃哈哈---null
生产者线程生产了:娃哈哈---null
生产者线程生产了:娃哈哈---null
生产者线程生产了:娃哈哈---null
生产者线程生产了:娃哈哈---null
生产者线程生产了:娃哈哈---null
生产者线程生产了:娃哈哈---null

Process finished with exit code 0

*/


JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术(旧) 3041楼

老师,我按照视频上老师的方法敲了代码,运行都没问题,但是突然发现,这个程序并没有自动结束,IDEAL中的红色方块一直亮着,如下图:

0f6ec0316320147f37a1f9cdcf5e5f5.png

麻烦老师帮忙看看是怎么回事,具体代码粘贴如下:

1.Printer类代码

package com.bjsxt.thread;

public class Printer {
    private int index=1;//用于统计第几次打印
    public synchronized void print(int number){
        while(index%3==0){
            try {
                super.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.print(number);
        index++;
        super.notifyAll();//唤醒所有在printer这个对象上所有等待的线程
    }
    public synchronized void print(char letter){
        while(index%3!=0){
            try {
                super.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.print(""+letter);
        index++;
        super.notifyAll();
    }
}

2.数字打印类代码

package com.bjsxt.thread;

public class NumberPrinter implements Runnable {
    private Printer printer;

    public NumberPrinter(Printer printer) {
        this.printer=printer;
    }

    @Override
    public void run() {
        for(int i=1;i<=52;i++){
            printer.print(i);
        }
    }
}

3.字母打印类代码

package com.bjsxt.thread;

public class LetterPrinter implements Runnable{
    private Printer printer;
    public LetterPrinter(Printer printer){
        this.printer=printer;
    }    @Override
    public void run() {
        for(char c='A';c<='z';c++){
          printer.print(c);
        }
    }
}

4.主线程测试代码

package com.bjsxt.thread;

public class Test {
    public static void main(String[] args) {
        //创建共享资源的对象
        Printer p=new Printer();
        NumberPrinter np=new NumberPrinter(p);
        LetterPrinter lp=new LetterPrinter(p);
        //创建代理类,并启动线程
        new Thread(np).start();
        new Thread(lp).start();
    }
}


JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程和并发编程(旧) 3042楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术 3043楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 3045楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637