我想从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();
}
}
}
在我看来,你在使用很多你不完全理解的东西
OutputStreamWriter
OutputStreamWriter用于指定您希望输出的文本格式。但是由于您没有填写此参数,您将获得平台的默认值(您知道它是什么吗?如果是这样,为什么不直接在构造函数中输入它呢?)
BufferedWriter
缓冲区对于低效的读写非常有用。低效意味着逐行读取而不是尽可能快地吞噬字节。对于编写器来说,这意味着等待将数据发送到输出。这就是你想要的吗?
在任何情况下添加新的行字符都不应该是必要的。Flush()应该可以解决这个问题。但是如果\n是必要的,这意味着在服务器端它正在等待这个字符(可能使用BufferedReader.readLine())
综上所述,我建议您从PrintStream
开始(如果不指定文本编码,您可能不需要编写器
),然后从这里开始。
您没有说什么在读取套接字,但考虑到它是8080端口,我想它可能是一个web服务器,您发送的不是有效的HTTP请求。我不知道您期望得到什么样的响应,也不知道您是如何确定消息是否已收到的,但我想这可能是某种调试日志记录。如果收件人是您编写的某个服务器,那么您可能是在用某种方法阅读邮件,而这种方法需要一行新的内容。
flush()
方法调用应该足以发送消息。IP是一种二进制协议,不知道文本行数,当然不需要新行数。
但是,在决定显示您的消息之前,可能正在读取套接字的任何东西都在等待一个新行。
我转向你,在这件事上我一直把头撞在墙上。 我正在做一个小的socket编程,我可以看到当我把它放出来。println(“…”)while循环之前的代码行(in.readLine())它工作正常,但我需要它位于循环内部。 说清楚一点,我没有看到任何错误。我只是看不到此应用程序的客户端显示文本。它看起来好像在工作,但事实并非如此。此外,我也不控制该应用程序的客户端,它由通过TCP连接到此套接字侦听器应
在我的客户端/服务器应用程序中,我的客户端wiil与服务器通信有两个功能:客户端要么向服务器请求数据,要么发送数据,以便服务器保存。我对这两种方法都使用一个套接字,要使用的方法由发送的第一个字节定义。如果第一个字节是“1”,它将请求数据。如果是“2”,它将发送数据(数据字节在“2”字节之后发送)。它非常适合发送数据。但是当我请求数据时,只要我不读取客户端中的套接字流,它就可以工作。这就像如果我在发
我有一个类,它接收用户发送的消息并在终端上打印出来,但现在我正在尝试编写一个类,从用户那里读取数据,将来自用户的字符串数据转换成字节数组,并将字节数组写入套接字。 我试图使用BufferedReader从用户读取数据,并使用OutputStream将字节数组写入套接字,但由于某些原因,我正在写入套接字的消息没有传递到服务器。 是一个与我发送到的服务器和端口号相同的套接字! 当我运行这个时没有错误,
null
问题内容: 我正在寻找一种使用Go语言与UDP套接字进行客户端/服务器通信的好的解决方案。 我在Internet上找到的示例向我展示了如何将数据发送到服务器,但是没有讲授如何将数据发送回客户端。 为了演示,我的程序执行以下操作: 我的客户端程序在4444端口上创建一个套接字,如下所示: 我向服务器发送了字符串和本地地址,因此它可以打印字符串并发送OK消息。我为此使用gob: 我的数据结构如下所示:
我用一个服务器和客户端做了一个应用程序,用TCP套接字发送信息 问题是,如果函数zfs。ReceiveSnapshot(在服务器端)不返回错误(err==nil),不工作,客户端没有收到任何字节继续,它不能关闭连接... 我给你看服务器和客户端的代码 服务器: 客户: [编辑]:如果返回错误,控制。写([]byte)写"1",客户端接收到它,执行SendSnapshot增量(如果n!=0)并关闭客