我有以下Java套接字客户端应用程序,它将相同的字符串发送到套接字服务器:
import java.net.*;
import java.io.*;
public class ServerClient {
public static void main(String[] args) throws IOException {
System.out.println("Starting a socket server client...");
Socket client = new Socket("XXX.X.XXX.XX", 12001);
BufferedOutputStream stream = new BufferedOutputStream(client.getOutputStream());
String message = "ABC";
BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
String input = null;
while ( true ) {
System.out.print("Would you like to send a message to Server? ");
input = inputReader.readLine();
if ( !input.equals("Y") ) break;
System.out.println("Message to send: " + message);
System.out.println("Message length is: " + message.length());
byte[] messageBytes = message.getBytes("US-ASCII");
stream.write(messageBytes, 0, messageBytes.length);
stream.flush();
}
System.out.println("Shutting down socket server client...");
stream.close();
client.close();
inputReader.close();
}
}
第一次发送消息时,服务器接收消息;但是,每次我尝试发送此消息时,服务器都没有收到任何信息。消息简直消失了。我成功地写了套接字(没有例外)但管道的另一边没有任何东西(或者我被告知)。
我无法访问服务器应用程序,日志或代码,因此我想知道是否有任何方法可以推荐,以找出服务器未接收后续消息的原因。任何想法将不胜感激!
澄清:
服务器不期望新行;否则,它会如何第一次收到消息?作为试错,我确实尝试在字符串末尾发送'\ n'和“\ r \ n”以及0x00字符 - 所有这些都没有任何运气。
我认为刷新是一个问题,所以我尝试了各种输出流类(PrintStream,PrintWriter,FilterOutputStream),但仍然遇到了同样的问题。那么,如果“冲洗”是一个问题,它是如何第一次工作的?
答案 0 :(得分:1)
记住:
在此之后,如果您要发送消息,则需要使用分隔符或其他指示“此处为一条消息”的方式,例如将协议定义为'第一个字节是后续消息的长度'。 并且您需要检查接收端是否读取了部分消息,整个消息及其任何组合(例如,一个读取可能已读取3个半消息..)。
您的测试应用的快速解决方案,写行。也就是说,后跟换行符的字符串。然后,缓冲读取器的ReadLine()可以在接收端为您重新组装。
答案 1 :(得分:1)
答案 2 :(得分:0)
它在这里正常工作......但是在发送信息后我错过了回车或其他消息的结尾。
如果不知道服务器的意图(协议),很难写更多...
也许你应该尝试像
String message = "ABC\n";