gpt4 book ai didi

java - java中如何通过socket发送EOF

转载 作者:太空宇宙 更新时间:2023-11-04 12:22:05 25 4
gpt4 key购买 nike

基本上是一个从服务器请求图像的html文件,我创建了一个执行响应操作的服务器,但是当对图像的html请求时,服务器完全发送图像,但客户端浏览器保持加载图像并说“从服务器传输数据”,我在互联网上进行了研究,发现只需关闭连接即可完成,但它对我不起作用。

这是我用 java 构建服务器的代码:

package lesson1;

import java.io.*;
import java.net.*;
import java.lang.Exception;

public class SecClass{

BufferedReader fd;
String link = null, HTMLData = null, WEBROOT = "D:/PDT1";
String ptr = null, directory = null,
GET_HEAD_POST = null, Protocol = null;
ServerSocket SRVSOCK;
Socket SOCK;
DataOutputStream dOut;
DataInputStream dInput;
InputStreamReader IR;


public static void main(String[] args) throws Exception
{
SecClass SERVER = new SecClass();
SERVER.run();
}

public void run() throws Exception
{
SRVSOCK = new ServerSocket(80);
while(true){
SOCK = SRVSOCK.accept();
new Thread(new SocketThread(SOCK)).start();
}
}

public class SocketThread implements Runnable {

@SuppressWarnings("unused")
private Socket socket;

public SocketThread(Socket socket) {
this.socket = socket;
}

@Override
public void run() {
try{
dOut = new DataOutputStream(SOCK.getOutputStream());
}catch(Exception ie){
System.out.println("Cound'nt create dOut");
}

try{
IR = new InputStreamReader(SOCK.getInputStream());
}catch(Exception ie){
System.out.println("Cound'nt create IR");
}


BufferedReader BR = new BufferedReader(IR);
String MESSAGE = null;
System.out.println("Received Request!");
try{
MESSAGE = BR.readLine();

}catch(Exception ie){
System.out.println("Cound'nt Receive Message");
}
System.out.println(MESSAGE);

if(MESSAGE != null && MESSAGE.contains("HTTP/")){
Protocol = MESSAGE.substring(MESSAGE.length()-8);
System.out.println("Request protocol is " + Protocol);
} else {
System.out.println("It's a Not HTTP request");
}

if(MESSAGE != null && MESSAGE.contains("GET ")){
GET_HEAD_POST = "GET ";
System.out.println("Reqest is GET");
ptr = MESSAGE.substring(4);
directory = ptr.substring(0,ptr.length()-9);
link = ptr.substring(ptr.length() - 10);
System.out.println(link);

} else if(MESSAGE != null && MESSAGE.contains("HEAD ")){
System.out.println("Request is HEAD");
GET_HEAD_POST = "HEAD ";
ptr = MESSAGE.substring(5);
directory = ptr.substring(0,ptr.length()-9);
link = ptr.substring(ptr.length() - 10);
} else if(MESSAGE != null && MESSAGE.contains("POST ")){
System.out.println("Request is POST");

} else {
System.out.println("Cound'nt verify request");
try{
SRVSOCK.close();
}catch(Exception ie){
System.out.println("Could not close SRVSOCK");
}
try{
SOCK.close();
}catch(Exception ie){
System.out.println("Could not close SOCK");
}

}

if(MESSAGE == null)
{
System.out.println("Unknown request");
try{
SOCK.close();
}catch(Exception ie){
System.out.println("Could not close SOCK");
}

} else {
if((link.charAt(0)) == '/' && link != null){
link = WEBROOT + directory + "index.html";
try{

OpenFile();
dOut.close();
SOCK.close();
System.out.println("Came out of Openfile Func");

}catch(Exception ie){
System.out.println("Could not Call for OpenFile Function");
}
try{
MESSAGE = BR.readLine();
}catch(Exception ie){
System.out.println("Could not Receive message");
}

System.out.println(MESSAGE);

} else {
System.out.println("User Requested for a file");
System.out.println(directory);

link = WEBROOT + directory;
try{
OpenFile();
dOut.close();
SOCK.close();
}catch(Exception ie){
System.out.println("Could not Call for OpenFile Function");
}
}

}
}
}
public void OpenFile() throws Exception{
try (BufferedReader br = new BufferedReader(new FileReader(link))) {
String line;
System.out.println("Request Link is: " + link);
while ((line = br.readLine()) != null) {
System.out.println(line);
dOut.writeBytes(line);
}
dOut.flush();
dOut.close();
SOCK.close();
} catch(Exception e){
System.out.println(link);
dOut.writeBytes("<html><h1>404 File Not Found</h1></html>");
System.out.println("File Does not Exist");

}
}
}

这是我的 HTML 代码:

<html>
<head>
<meta charset="utf-8"/>
<title>hello</title>
</head>
<body>
<header>
<div class="HeaderBox">
<img src="logo.png" alt="image" class="logoBox"/>
</div>
</header>
</body>
</html>

如您所见,当图像完全传输时,我已尝试两次关闭服务器上的连接,但在我的浏览器中,它停留在加载状态,底部显示正在从 127.0.0.1 传输数据

最佳答案

首先移动除ServerSocket SRVSOCK之外的所有字段;从 SecClass 类到 SocketThread 类。使套接字为SOCK; run() 方法中的本地引用。原因是您的代码正在使用多线程。因此将它们移至 SocketThread 类。还可以移动 OpenFile() 以实现更简洁的方法。

您对不同的线程请求使用相同的 SOCK 引用。并且在关闭时您会引用 SOCK 字段。这就是错误行为的原因。最可能发生的情况是一个线程由于不正确的 SOCK 引用而关闭了另一个线程的套接字。

您需要做的是:

public void run() throws Exception
{
SRVSOCK = new ServerSocket(8088);
while(true){
Socket SOCK;
SOCK = SRVSOCK.accept();
new Thread(new SocketThread(SOCK)).start();
}
}

并且在 SocketThread 中不要引用使用 SOCK 。例如。 SOCK.getInputStream() 。更改为使用 SocketThread 字段的 socket.getInputStream() 。以同样的方式改变其他人。

至于图像未渲染的原因:将 OpenFile() 更改为:

public void OpenFile() throws Exception{
try (FileInputStream br = new FileInputStream (link)) {
System.out.println("Request Link is: " + link);
int i;
while ((i = br.read()) > -1)
dOut.write(i);

dOut.flush();
dOut.close();
SOCK.close();
} catch(Exception e){
System.out.println(link);
dOut.writeBytes("<html><h1>404 File Not Found</h1></html>");
System.out.println("File Does not Exist");

}
}

更改基本上是以字节形式读取文件并将其作为字节写入响应流。而您的情况发生的是您将其作为字符串读取。

您可以查看 link使用阅读器与输入流读取文件之间的区别。

对我有用。让我知道它是否对您有用。

关于java - java中如何通过socket发送EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38776187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com