[英]java socket writing to and then reading from socket
我試圖用Java編寫一個簡單的http服務器。 到目前為止,這是我的代碼:
服務器:
import java.net.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class Server
{
static final int PORT = 8080;
final String REQUEST_FORMAT = "^GET (.*?) HTTP/1.1$";
final Socket client;
public Server(Socket s)
{
client = s;
}
public void run()
{
try
(Scanner in = new Scanner(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream(),true);)
{
String request = in.findInLine(Pattern.compile(REQUEST_FORMAT));
System.out.println(request);
out.write("HTTP/1.1 200 OK");
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
public static void main(String []args)
{
try
(
ServerSocket server = new ServerSocket(PORT);
Socket client = server.accept();
)
{
Server s = new Server(client);
s.run();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
客戶:
import java.net.*;
import java.io.*;
import java.util.*;
public class Client
{
final int PORT = 8080;
String data = "GET /home/index.html HTTP/1.1";
public Client()
{
try
(Socket socket = new Socket("127.0.0.1",PORT);
PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
Scanner in = new Scanner(new InputStreamReader(socket.getInputStream()));)
{
out.print(data);
String header1 = in.next();
System.out.println("header="+header1);
int status = in.nextInt();
System.out.println("status="+status);
String message = in.next();
System.out.println("message="+message);
}
catch(Exception ex)
{
}
}
public static void main(String []args)
{
Client c = new Client();
}
}
當前,客戶端僅向服務器寫入樣本請求,而服務器則寫入樣本響應頭。 但是服務器在讀取請求后似乎一直在無限等待客戶端輸入,而沒有繼續發送響應。 請幫助解決此問題。
如果要實現HTTP服務器,則需要實現HTTP協議。 你不是那樣做的。 您需要仔細閱讀RFC 2616,特別是有關內容長度標頭,連接:關閉和分塊傳輸編碼的部分,這是確定傳輸內容長度的不同方法。
您也不會隨時寫線。 HTTP中的行終止符為\\r\\n,
它不會出現在代碼中的任何位置。
還有其他問題。 您的服務器僅接受一個客戶端,然后停止。 它需要圍繞接受代碼的循環,並且需要啟動一個新線程來處理每個連接。
您的服務器在
String request = in.findInLine(Pattern.compile(REQUEST_FORMAT));
原因是找不到模式並且流也沒有完成。
解決方案A :關閉套接字以在客戶端進行寫入
out.print(data);
socket.shutdownOutput();
僅當您不想在客戶端進行進一步寫入時,此方法才有效。
解決方案B :
客戶端:在數據后寫換行符。
out.print(data); out.print("\\r\\n"); out.flush();
服務器:使用Scanner.nextLine()和Matcher代替Scanner.findInLine()
String line = in.nextLine(); Matcher matcher = Pattern.compile(REQUEST_FORMAT).matcher(line); String request = null; if(matcher.find()) { //request = line.substring(matcher.start(),matcher.end()); request = matcher.group();//is similar to the commented line above }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.