会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132437个问题

/**
 *   发送信息的线程
 */
class Send extends Thread{
    private Socket socket;
    public Send(Socket socket){
        this.socket = socket;
    }

    /**
     * 发送信息的方法
     */
    private void sendMsg(){
        Scanner scanner = null;
        PrintWriter pw = null;
        try{
            // 创建Scanner对象,通过键盘输入获取要发送的信息
            scanner = new Scanner(System.in);
            // 创建字符输出流对象 用于向socket发送信息
            pw = new PrintWriter(this.socket.getOutputStream());
            while (true) {

                // 获取键盘输入的内容
                String msg = scanner.nextLine();
                // 将键盘输入的内容发送出去
                pw.println(msg);
                // 刷新
                pw.flush();
                if("exit".equals(msg)){
                    break;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                if(scanner != null){
                    scanner.close();
                }
                if(pw != null){
                    pw.close();
                }
                if (this.socket != null){
                    socket.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }

    }

    @Override
    public void run() {
        this.sendMsg(); 
    }
}

/**
 *   接受信息的线程
 */
class Receive extends Thread{
    private Socket socket;
    public Receive(Socket socket){
        this.socket = socket;
    }

    /**
     *  接受信息的方法
     */
    private void receiveMsg(){
        BufferedReader br = null;
        try {
            // 创建用于接受对方发送信息的流对象
            br = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
            while (true){
                String msg = br.readLine();
                System.out.println("他说:"+msg);
                if ("exit".equals(msg)){
                    break;
                }

            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                if(br != null){
                    br.close();
                }
                if(this.socket != null){
                    this.socket.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    @Override
    public void run() {
        this.receiveMsg();
    }
}

老师我添加了一个判断是否结束聊天的判断,但是这样写运行时只能是发送信息的一方关闭,接收的不会关闭

而且发送放会先报个异常再关闭

image.png报错行数是以下两个

image.png

image.png


JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 18676楼
JAVA 全系列/第五阶段:JavaWeb开发/Servlet技术详解(旧) 18677楼
Python 全系列/第一阶段:Python入门/编程基本概念 18678楼
JAVA 全系列/第十八阶段:亿级高并发电商项目_架构/编码(旧)/电商:基于SpringSession实现登录系统 18680楼
Python 全系列/第一阶段:Python入门/控制语句 18681楼
JAVA 全系列/第六阶段:项目管理与SSM框架/Spring 18683楼

老师,你好,麻烦帮我解答一下哈

  1. 为什么我打开网页的时候默认打开的就是03文件中的数据,然后输入再url网址里输入/state的时候才会进行跳转。

  2.在视频中老师只讲了关于状态码这一部分,状态值视频里好像没有讲到。

  3.代码的运行原理不是特别明白。

<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8">
      <title>04.Ajax中state的使用</title>
   </head>
   <body>
      <h1>04.Ajax中state的使用</h1>
      <input type="button" name="" id="" value="获取数据" onclick="submitFrom()"/>
      <script type="text/javascript">
         function submitFrom(){
            //创建Ajax对象
            var xhr=new XMLHttpRequest();
            
            url='/state'
            //请求方式(告诉Ajax以什么样的 方式 发送请求给 谁)
            xhr.open('POST',url)
            //发送请求
            xhr.send()
            //处理数据
            xhr.onreadystatechange=function(){
               //console.log(xhr.readyState)  //在控制台输出 获取 Ajax 状态码
               //if(xhr.readyState==4 && xhr.status==200){  /*当状态码==4并且状态值为200时*/
                  //console.log(xhr.status)
               if(xhr.readyState ==4){   /*当状态码==4状态值为200时*/
                  if(xhr.status ==200){  /*状态值为200时*/
                     console.log(xhr.responseText)  /*则获取服务器端给客户端的响应数据*/
                     console.log(JSON.parse(xhr.responseText))  //将 json 字符串转换为 json 对象
                  }else{console.log(xhr.status)}

               }
            }
         }
      </script>
   </body>
</html>
from flask import Flask,request,render_template
app=Flask(__name__)  #创建Flask服务器应用对象
@app.route('/login',methods=['GET','POST']) #发送/login请求地址,可支持get,post参数传递
def login():
    if request.method =="GET":
        return 'get请求成功'
    elif request.method =="POST":
         return 'post请求成功'

#@app.route('/')  #不写参数默认get请求
def text():  #render_template返回的是一套html的模板数据
    return render_template('03.Ajax中post参数传递.html')  #传递数据给Flask服务器接收.

@app.route('/state',methods=["GET",'POST'])  #接收/state请求
def state():
    if request.method =="GET":
        return render_template('04.Ajax中state的使用.html')
    elif request.method =="POST":
         #return 'post请求成功'
         return '{"name":"吕小布","age":10}'




if __name__=="__main__":
    app.run(debug=True)


Python 全系列/第七阶段:网页编程基础/Ajax 18684楼

<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8">
      <title></title>
      <script>
         function addNode(ts){
            var tb = document.getElementById('tb');
            var tr = document.createElement('tr');
            var td1 = document.createElement('td');
            var td2 = document.createElement('td');
            var td3 = document.createElement('td');
            td1.innerHTML = '<input type="text" size="10px"/>';
            td2.innerHTML = '<input type="text" size="10px"/>';
            td3.innerHTML = '<input type="button" value="添加" onclick="addNode()"/>' +
                  '<input type="button" value="删除" onclick="delNode()"/>'
            tr.appendChild(td1);
            tr.appendChild(td2);
            tr.appendChild(td3);
            // 获取触发事件的"添加"按钮所在的tr节点
            var cur_tr = ts.parentNode.parentNode;
            // 获取下一个tr节点
            var next_tr = cur_tr.nextElementSibling;
            console.log(next_tr)
            // 在下一个tr节点前(即在 触发事件的"添加"按钮所在的tr节点 后)插入一个tr节点
            tb.insertBefore(tr, next_tr);

         }
         function delNode(){

         }

      </script>
      <style>
         tr{
            height: 20px;
            text-align: center;
         }
         td{
            width: 100px;
         }

      </style>
      
   </head>
   <body>
   <table border="2px" bordercolor="blue" align="center" id="tb">
      <tr>
         <th>图书名称</th>
         <th>图书价格</th>
         <th>操作</th>
      </tr>
      <tr>
         <td>JavaEE</td>
         <td>12</td>
         <td>
            <input type="button" value="添加" onclick="addNode(this)"/>
            <input type="button" value="删除"/>
         </td>
      </tr>
      <tr>
         <td>JavaSE</td>
         <td>12</td>
         <td>
            <input type="button" value="添加" onclick="addNode(this)"/>
            <input type="button" value="删除"/>
         </td>
      </tr>
   </table>

   </body>
</html>

老师,我想要在当前节点的下面插入一个节点,而不是在最后添加节点,但是没有成功,下面是异常信息

image.png

Python 全系列/第七阶段:网页编程基础/JavaScript 18685楼
Python 全系列/第一阶段:Python入门/编程基本概念 18686楼
JAVA 全系列/第一阶段:JAVA 快速入门/面向对象详解和JVM底层内存分析 18688楼
JAVA 全系列/第五阶段:JavaWeb开发/Servlet技术详解(旧) 18689楼
JAVA 全系列/第六阶段:项目管理与SSM框架/Spring 18690楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

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