【问题标题】:Java socket cannot properly display the input receivedJava 套接字无法正确显示接收到的输入
【发布时间】:2015-12-15 02:57:16
【问题描述】:

我正在尝试让 Java 客户端程序接收来自服务器的输入。但是,代码无法获取输入并将其打印出来。它编译得很好。 问题是接收到的输入没有打印到控制台。 这是创建套接字的部分

Socket ss = new Socket(host,port);
String input;
Scanner in;
in = new Scanner(ss.getInputStream());
while(true)
{
    input = in.next();
    System.out.print(input + "\n");
    if("quit".equalsIgnoreCase(input));
        {
            in.close();
            ss.close();
            return;
        }
}

这是我所有的代码

import java.util.*;
import java.net.*;
import java.io.*;

public class connect 
{
    static int port;
    static String host;
    public static void start(String host, int port)
    {
        while(true)
        {
        try 
        {
            Socket ss = new Socket(host,port);
            String input;
            Scanner in;
            in = new Scanner(ss.getInputStream());
            while(true)
            {
                input = in.next();
                System.out.print(input + "\n");
                if("quit".equalsIgnoreCase(input));
                {
                    in.close();
                    ss.close();
                    return;
                }
            }
        } 
        catch (UnknownHostException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }
    }
    public static void main(String[] args)
    {
        String check;
        do
        {
        @SuppressWarnings("resource")
        Scanner sc = new Scanner(System.in);

        System.out.println("Hello, welcome to the client");
        String banner = "-";
        int x = 0;

        while(x<60)
        {
            banner += "-";
            x++;
        }
        System.out.println(banner);
        System.out.print("\n\nPlease Enter the ip address to connect to\n>>");
        host = sc.next();
        System.out.println("We are connecting to " + host);
        System.out.print("\n" + banner + "\nEnter the port\n>>");
        port = sc.nextInt();
        System.out.println("Connecting to\nhost->" + host + "\nport->" + port);
        System.out.println("Enter 'Done' to continue, any to reset");
        check = sc.next();
        }while(!"Done".equals(check));
        start(host,port);
        System.out.println("Finished");
    }
}

服务器是用python制作的,只是为了测试一下。这是python代码

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('',443))
s.listen(1)
conn,addr=s.accept()
conn.send("Hello")
conn.send("World")

这段代码在客户端的输出应该是

-->你好

-->世界

Hello 应该被打印然后 World 应该被打印然后等待更多的输入。但是,在服务器关闭之前不会显示输出。当服务器关闭时,它会显示 HelloWorld

【问题讨论】:

  • 您应该在每个单词后添加一个空格。例如:... conn.send("Hello") conn.send(" ") conn.send("World") ...
  • 这将解决空白问题,但不能解决输入没有移位的事实
  • 扫描器类正在等待一个令牌(默认情况下它是一个以空格分隔的文本块),因此如果您想要这些令牌,您需要发送"Hello Word "(注意结尾空格)。阅读java's Scanner class
  • 它在您退出服务器时起作用,因为这会终止连接并且扫描仪会看到 EOF。如果您执行conn.shutdown(socket.SOCK_RDWR),它也可以工作,但连接将被关闭。

标签: java python sockets network-programming java.util.scanner


【解决方案1】:

来自send的python文档:

应用程序负责检查所有数据是否已发送;如果只传输了部分数据,则应用程序需要尝试传输剩余的数据。

如果您不想担心检查数据是否已发送,请使用sendall,因为它会继续尝试发送数据,直到所有数据都已发送或发生错误。

Scanner 将基于分隔符(我相信默认情况下是空格)对数据进行标记。 Scanner#next() 只会在达到指定的分隔符时返回数据:

一个完整的标记前后是匹配分隔符模式的输入。

确保在接收数据时考虑到这一点(您发送的数据需要指定分隔符,用于扫描仪的分隔符,某处)。您可以通过Scanner#useDelimiter(String)Scanner#useDelimiter(Pattern) 更改分隔符

【讨论】:

  • 我都累了,在服务器端套接字关闭之前它仍然没有打印输出
  • 好的,我现在明白你的意思了。它终于奏效了。谢谢你
猜你喜欢
  • 2015-06-12
  • 2016-09-12
  • 2014-08-27
  • 1970-01-01
  • 2013-09-08
  • 2014-02-21
  • 1970-01-01
  • 2021-08-14
  • 2017-10-14
相关资源
最近更新 更多