Java的socket问题

查看 46|回复 3
作者:Nettos   
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();
    }
}

代码, 报错

px307   

   
MyRunnable 的代码 shutdownOutput前加   out.flush()试一下
  out.write(name.getBytes());
   out.flush();
  socket.shutdownOutput();
Nettos
OP
  


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

我试了下,还是不行
px307   


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

代码上没看出问题,第二次运行的时候,服务器端保存图片成功了吗?
您需要登录后才可以回帖 登录 | 立即注册

返回顶部