ソケットによるスレッドの読み書きに問題があります。サーバーはerlangにあり、クライアントはJavaにあります。Javaエラーソケット通信
PrintWriter printer = new PrintWriter(socket.getOutputStream(), true);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
TransmitterTwo trans = new TransmitterTwo(socket);
trans.start(); // Gets the message from socket
TransmitterTwoクラス::私はそれをやっている方法はこれです
public class TransmitterTwo extends Thread {
Socket socket;
String message;
TransmitterTwo(Socket socket) {
this.socket = socket;
}
public String getMessageFromSocket() {
return message;
}
public void run() {
try {
String response = null;
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while ((response = reader.readLine()) != null) {
System.out.println("Server response: "+ response);
this.message = response;
}
socket.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
問題は、メインクライアントクラスです。アイデアは、コンソールからの入力を受け取り、ソケットに送信し、サーバーはロジックを処理し、ソケットを介して応答を送信することです。その後、このクライアントで私は応答をチェックし、何をする必要があるかを行います。それは私が...私がログインした後、私は「register_ok」を受信、登録、登録の流れだなどなど、私はトラブルを抱えているループの一部はこれです:
while(true) {
String readerInput = reader.readLine(); // Read from console
printer.println(readerInput.trim()); // Sends it to the socket
while(trans.message == null);
socketMessage = trans.message;
が、これは正しいアプローチですか?問題は 'socketmessage'が前に受信したメッセージを出力することです。それはlike..1のステップの後ろにあります。これは明らかにスレッド関連ですが、問題を理解できません。ありがとう
うわー、それは私が予想していたよりも良い答えでした。私の専門的な未来はこの笑に依存しているので、私は絶望的です。だから、あなたのアプローチでは、N人のクライアントを持ち、メッセージを正しく得ることができると思いますか?私はスレッド間で値を渡したくないので、私は各クライアントがソケットと話をし、独立したトランスミッタ/レシーバを持っていなければなりません。それはサービスのようなもので、各クライアントはソケットから話を聞くことができます...。それにもかかわらず、私はこのアプローチを試して、答えます。ありがとう、たくさんの男、本当に感謝しています。 –
それは働いた!どうもありがとう! –
ちょっとしたエラーです。ソケットに送信された文字列は、最後には常に "\ n"を持ちますが、trim()メソッドを使用しても、\ nが送信されます。なぜか分かりますか? –