当前位置: 首页 > 知识库问答 >
问题:

在套接字中写入字符不起作用

东方旺
2023-03-14

我想从Java应用程序通过套接字发送一个简单的charArray。我的问题是,如果不在charArray的末尾添加'\n',编写就不起作用。我必须添加这个“\n”还是有更优雅的解决方案?

这是我的代码:

public class ClientThread extends Thread  {
    private static final String TAG = "ClientThread";

    private Socket socket = null;
    private BufferedWriter outputStream = null;
    private BlockingQueue<Message> queue = null;

    private static final int SERVERPORT = 8080;
    private static final String SERVER_IP = "localhost";

    public ClientThread(BlockingQueue<Message> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

            //send a request to connect to the server is listening on machine 'localhost', port 8080
            socket = new Socket(serverAddr, SERVERPORT);

            //create output stream to send data to the server
            outputStream = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

            while(socket.isConnected()) {
                //write message to socket
                char[] test = {'t', 'e', 's', 't'};

                for(int i=0; i<test.length; i++) {
                    outputStream.write(test[i]);
                }
                outputStream.write("\n"); //does not work without this line
                outputStream.flush();
            }
        } catch (UnknownHostException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}

共有2个答案

水品
2023-03-14

在我看来,你在使用很多你不完全理解的东西

OutputStreamWriter

OutputStreamWriter用于指定您希望输出的文本格式。但是由于您没有填写此参数,您将获得平台的默认值(您知道它是什么吗?如果是这样,为什么不直接在构造函数中输入它呢?)

BufferedWriter

缓冲区对于低效的读写非常有用。低效意味着逐行读取而不是尽可能快地吞噬字节。对于编写器来说,这意味着等待将数据发送到输出。这就是你想要的吗?

在任何情况下添加新的行字符都不应该是必要的。Flush()应该可以解决这个问题。但是如果\n是必要的,这意味着在服务器端它正在等待这个字符(可能使用BufferedReader.readLine())

综上所述,我建议您从PrintStream开始(如果不指定文本编码,您可能不需要编写器),然后从这里开始。

池永长
2023-03-14

您没有说什么在读取套接字,但考虑到它是8080端口,我想它可能是一个web服务器,您发送的不是有效的HTTP请求。我不知道您期望得到什么样的响应,也不知道您是如何确定消息是否已收到的,但我想这可能是某种调试日志记录。如果收件人是您编写的某个服务器,那么您可能是在用某种方法阅读邮件,而这种方法需要一行新的内容。

flush()方法调用应该足以发送消息。IP是一种二进制协议,不知道文本行数,当然不需要新行数。

但是,在决定显示您的消息之前,可能正在读取套接字的任何东西都在等待一个新行。

 类似资料:
  • 我转向你,在这件事上我一直把头撞在墙上。 我正在做一个小的socket编程,我可以看到当我把它放出来。println(“…”)while循环之前的代码行(in.readLine())它工作正常,但我需要它位于循环内部。 说清楚一点,我没有看到任何错误。我只是看不到此应用程序的客户端显示文本。它看起来好像在工作,但事实并非如此。此外,我也不控制该应用程序的客户端,它由通过TCP连接到此套接字侦听器应

  • 在我的客户端/服务器应用程序中,我的客户端wiil与服务器通信有两个功能:客户端要么向服务器请求数据,要么发送数据,以便服务器保存。我对这两种方法都使用一个套接字,要使用的方法由发送的第一个字节定义。如果第一个字节是“1”,它将请求数据。如果是“2”,它将发送数据(数据字节在“2”字节之后发送)。它非常适合发送数据。但是当我请求数据时,只要我不读取客户端中的套接字流,它就可以工作。这就像如果我在发

  • 我有一个类,它接收用户发送的消息并在终端上打印出来,但现在我正在尝试编写一个类,从用户那里读取数据,将来自用户的字符串数据转换成字节数组,并将字节数组写入套接字。 我试图使用BufferedReader从用户读取数据,并使用OutputStream将字节数组写入套接字,但由于某些原因,我正在写入套接字的消息没有传递到服务器。 是一个与我发送到的服务器和端口号相同的套接字! 当我运行这个时没有错误,

  • 问题内容: 我正在寻找一种使用Go语言与UDP套接字进行客户端/服务器通信的好的解决方案。 我在Internet上找到的示例向我展示了如何将数据发送到服务器,但是没有讲授如何将数据发送回客户端。 为了演示,我的程序执行以下操作: 我的客户端程序在4444端口上创建一个套接字,如下所示: 我向服务器发送了字符串和本地地址,因此它可以打印字符串并发送OK消息。我为此使用gob: 我的数据结构如下所示:

  • 我用一个服务器和客户端做了一个应用程序,用TCP套接字发送信息 问题是,如果函数zfs。ReceiveSnapshot(在服务器端)不返回错误(err==nil),不工作,客户端没有收到任何字节继续,它不能关闭连接... 我给你看服务器和客户端的代码 服务器: 客户: [编辑]:如果返回错误,控制。写([]byte)写"1",客户端接收到它,执行SendSnapshot增量(如果n!=0)并关闭客