首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java套接字写入套接字,然后从套接字读取

java套接字写入套接字,然后从套接字读取
EN

Stack Overflow用户
提问于 2015-02-23 14:38:08
回答 2查看 1.5K关注 0票数 0

我试图用java编写一个简单的http服务器。到目前为止,我的代码如下:

服务器:

代码语言:javascript
复制
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();
        }
    }
}

客户端:

代码语言:javascript
复制
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();
    }
}

目前,客户端只向服务器写入一个样例请求,而服务器只编写一个示例响应头。但是,在读取请求后,服务器似乎在无限地等待客户端输入,而没有继续发送响应。请帮助解决这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-23 17:00:46

您的服务器在

代码语言:javascript
复制
String request = in.findInLine(Pattern.compile(REQUEST_FORMAT));

原因是,没有找到模式,流也没有完成。

解决方案A:关闭在客户端写入的套接字

代码语言:javascript
复制
out.print(data);
socket.shutdownOutput();

只有当您不想在客户端进行进一步的写作时,这才能起作用。

解B

  1. Client:在数据后写linefeed。 out.print(data);out.print(“\r”);out.flush();
  2. 服务器:使用Scanner.nextLine()和Matcher代替Scanner.findInLine() String line = in.nextLine();Matcher matcher =in.nextLine String request = null;if(matcher.find()) {//matcher.find= line.substring(matcher.start(),matcher.end());request =matcher.group();//类似于上面注释的行}
票数 0
EN

Stack Overflow用户

发布于 2015-02-23 17:31:41

如果要实现HTTP服务器,则需要实现HTTP协议。你不能那么做。您需要详细了解RFC 2616,特别是有关内容长度标头、连接:关闭和块传输编码的部分,这些部分是确定正在传输的内容的长度的不同方法。

你也不会在任何时候写台词。HTTP中的行终止符是\r\n,,它在代码中没有出现。

还有其他的问题。您的服务器只接受一个客户端,然后停止。它需要一个循环围绕接受代码,它需要启动一个新的线程来处理每个连接。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28676203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档