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

novel.zip

老师,上面是我的项目文件,我在执行时爬取下来的内容章节不是顺序的,里面有爬取下来之后的结果,在novel.txt里,他的顺序是第1章,第49章,第48章.........,这是由于并行运行导致的吗?还是什么原因,该怎么解决呢?谢谢老师!

Python 全系列/第十五阶段:Python 爬虫开发/移动端爬虫开发- 32266楼
Python 全系列/第二阶段:Python 深入与提高/文件处理 32267楼
Python 全系列/第五阶段:数据库编程/mysql的使用 32269楼
JAVA 全系列/第三阶段:数据库编程/MySQL数据库的使用 32270楼
JAVA 全系列/第十四阶段:全文检索服务/Solr 32274楼

老师好,不知道为什么我的聊天室客户端和服务端只能收到一半的回复,多线程一般要怎么调试。

package com.casco.server;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TestServer {
 public static void main(String[] args) throws IOException {
  System.out.println("-----服务器端已启动-----");
  ServerSocket serverSocket = new ServerSocket(9999);
  Socket socket = serverSocket.accept();
  DataInputStream dis = new DataInputStream(socket.getInputStream());
  DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
  while(true){
   System.out.println("客户端发送的数据为:" + dis.readUTF());
   dos.writeUTF("服务器端收到了" + dis.readUTF());
  }
  //CloseUtil.closeAll(dos,dis,socket);
 }
}

package com.casco.client;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
public class TestClient {
 public static void main(String[] args) throws IOException {
  Socket socket = new Socket("localhost",9999);
  SendThread sendThread = new SendThread(socket);
  ReceiveThread receiveThread = new ReceiveThread(socket);
  new Thread(sendThread).start();
  new Thread(receiveThread).start();
 }
}

package com.casco.client;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Scanner;
public class SendThread implements Runnable {
 private BufferedReader br;
 private DataOutputStream dos;
 private boolean flag = true;
 public SendThread(Socket socket) {
  br = new BufferedReader(new InputStreamReader(System.in));
  try {
   dos = new DataOutputStream(socket.getOutputStream());
  } catch (IOException e) {
   flag = false;
   CloseUtil.closeAll(dos);
  }
 }
 public String getMessage() {
  String str = "";
  try {
   str = br.readLine();
  } catch (IOException e) {
   flag = false;
   CloseUtil.closeAll(br);
  }
  return str;
 }
 public void send(String str) {
  try {
   dos.writeUTF(str);
   dos.flush();
  } catch (IOException e) {
   flag = false;
   CloseUtil.closeAll(dos);
  }
 }
 @Override
 public void run() {
  while(true){
   send(getMessage());
  }
 }
}

package com.casco.client;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
public class ReceiveThread implements Runnable {
 private DataInputStream dis;
 private boolean flag = true;

 public ReceiveThread(Socket socket) {
  try {
   dis = new DataInputStream(socket.getInputStream());
  } catch (IOException e) {
   flag = false;
   CloseUtil.closeAll(dis);
  }
 }
 public String getMessage() {
  String str = "";
  try {
   str = dis.readUTF();
  } catch (IOException e) {
   flag = false;
   CloseUtil.closeAll(dis);
  }
  return str;
 }
 @Override
 public void run() {
  while(true){
   System.out.println(this.getMessage());
  }
 }
}

image.png

image.png


JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 32275楼
JAVA 全系列/第三阶段:数据库编程/SQL 语言 32276楼

老师你好,我的问题有两个:

1、我的运行结果和视频中演示的不一样(数据长度那块),为什么最后依然实现了相同的效果(我和老师用的是不同的文件,是否和文件有关?)

2.

if len(recv_data[0]) < 516:
    break

关于这行代码执行的时候,我第截图中显示“数据长度:2”远小于代码中的516,不应该直接执行“break”语句退出吗为什么还能继续往下执行?

# coding=utf-8
from socket import *
import struct
filename = "1.png"
server_ip = "192.168.198.1"  # 服务器
send_data = struct.pack(f"!H{len(filename)}sb5sb",
                        1, filename.encode(), 0, "octet".encode(), 0)
s = socket(AF_INET, SOCK_DGRAM)  # 创建套接字对象
s.sendto(send_data, (server_ip, 69))  # 将数据包发送给服务器69端口
f = open("1.png", "ab")
while True:
    recv_data = s.recvfrom(1024)  # 接收数据
    caozuoma, ack_num = struct.unpack("!HH", recv_data[0][:4])  # 获取数据块编号
    rand_port = recv_data[1][1]  # 获取服务器的随机端口
    if int(caozuoma) == 5:
        print("文件不存在...")
        break
    print(f"操作码:{caozuoma},ACK:{ack_num},"
          f"服务器随机端口:{rand_port},数据长度:{len(recv_data)}")
    f.write(recv_data[0][4:])  # 将数据写入
    if len(recv_data[0]) < 516:
        break
    ack_data = struct.pack("!HH", 4, ack_num)
    s.sendto(ack_data, (server_ip, rand_port))  # 回复确认包

我的截图:

image.png

视屏中:

image.png

我使用的文件:

image.png

Python 全系列/第三阶段:Python 网络与并发编程/网络通信 32277楼
Python 全系列/第一阶段:Python入门/序列 32278楼
Python 全系列/第一阶段:Python入门/序列 32279楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

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