簡體   English   中英

Java套接字寫入然后從套接字讀取

[英]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

  1. 客戶端:在數據后寫換行符。

     out.print(data); out.print("\\r\\n"); out.flush(); 
  2. 服務器:使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM