吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 498|回复: 19
收起左侧

[其他求助] Java的socket问题

[复制链接]
Nettos 发表于 2023-7-7 20:46
66吾爱币

Java代码问题

求大佬看看~~
本机运行代码Client第一次可以正常运行,但是第二次就会报错:

Exception in thread "main" java.net.SocketException: Connection reset
    at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:323)
    at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
    at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
    at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
    at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:270)
    at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:313)
    at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
    at java.base/java.io.InputStreamReader.read(InputStreamReader.java:177)
    at java.base/java.io.BufferedReader.fill(BufferedReader.java:162)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:329)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:396)
    at red.yhl.test7.TcpClient.main(TcpClient.java:23)

进程已结束,退出代码1

代码异常出现在Client代码中的log = br.readLine()中
该异常只会在本机出现,我尝试过虚拟机运行以及使用其他人的电脑运行就不会出现问题

代码示例:
TcpServer

package red.yhl.test7;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TcpServer {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(10100, 50, InetAddress.getByName("127.0.0.1"));
        ss.setReuseAddress(true);
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                3,
                6,
                60,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );

        while (true) {
            // new Thread(new MyRunnable(ss.accept())).start();
            pool.submit(new MyRunnable(ss.accept()));

        }
        // ss.close();

    }
}

MyRunnable

package red.yhl.test7;

import java.io.*;
import java.net.Socket;
import java.util.UUID;

public class MyRunnable implements Runnable {
    private final Socket socket;
    private final InputStream in;
    private final OutputStream out;

    public MyRunnable(Socket socket) throws IOException {
        this.socket = socket;
        this.in = socket.getInputStream();
        this.out = socket.getOutputStream();
    }

    @Override
    public void run() {
        try {
            String name = UUID.randomUUID().toString().replace("-", "");
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\myapps\\Java\\mysocketnet\\copyImages\\" + name + ".png"));
            BufferedInputStream bis = new BufferedInputStream(in);
            int len;
            byte[] bytes = new byte[1024];
            while ((len = bis.read(bytes)) != -1) {
                bos.write(bytes, 0, len);
            }
            bos.close();
            System.out.println(name + "上传成功");

            out.write(name.getBytes());
            socket.shutdownOutput();
            System.out.println(socket.toString());
            System.out.println(socket.isClosed());

        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (socket != null) {
                try {
                    socket.close();// 报错 Connection reset 可尝试注释该行
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
        }
        System.out.println(socket.isClosed());
    }
}

TcpClient

package red.yhl.test7;

import java.io.*;
import java.net.Socket;

public class TcpClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 10100);
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\myapps\\Java\\mysocketnet\\src\\red\\yhl\\test3\\userDemo.png"));
        OutputStream os = socket.getOutputStream();
        int len;
        byte[] bytes = new byte[1024];
        while ((len = bis.read(bytes)) != -1) {
            os.write(bytes, 0, len);
        }
        os.flush();

        socket.shutdownOutput();

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        String log;
        while ((log = br.readLine()) != null) {
            System.out.println(log);
        }

        socket.close();
    }
}

最佳答案

查看完整内容

out.write(name.getBytes()); 在后面加个 out.clear(); out.close()看看

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

px307 发表于 2023-7-7 20:46
Nettos 发表于 2023-7-9 15:31
是的,都是17,我把本机的jdk都重装了一下

out.write(name.getBytes());
在后面加个
out.clear();
out.close()看看
px307 发表于 2023-7-7 23:43
   
MyRunnable 的代码 shutdownOutput前加   out.flush()试一下

  out.write(name.getBytes());
   out.flush();
  socket.shutdownOutput();
 楼主| Nettos 发表于 2023-7-7 23:49
px307 发表于 2023-7-7 23:43
MyRunnable 的代码 shutdownOutput前加   out.flush()试一下

  out.write(name.getBytes());

我试了下,还是不行
px307 发表于 2023-7-7 23:53
Nettos 发表于 2023-7-7 23:49
我试了下,还是不行

代码上没看出问题,第二次运行的时候,服务器端保存图片成功了吗?
wystudio 发表于 2023-7-8 08:37
TcpClient要在新线程中运行
wystudio 发表于 2023-7-8 08:46
所有网络操作都不能在主线程中运行
px307 发表于 2023-7-8 09:52
我测试了一下你的代码,没有出现你说的问题,  跑第二次的时候TcpServer 打印了什么,正常吗
也可能是你装了什么杀毒防火墙之类的软件,你把它们都关闭再测试一下
42jj 发表于 2023-7-8 14:40
是不是client还没结束,你就重启了?
天意暗夜 发表于 2023-7-9 06:34
将这一线程池的线程改大一点
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                30,
                60,
                60,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-1 07:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表