1

私はプロジェクトに取り組んでおり、デバイスと通信したいと考えています。デバイスとのソケット接続を確立しました。接続は機能しますが、デバイスから次のメッセージが送信されます: 0xd7d0 で、そのメッセージを書き戻す必要があります。キープアライブメッセージです。そのメッセージを読んで送り返すことができません。これまでに書いたコードは次のとおりです。

package Server;

import java.io.IOException;
import java.net.ServerSocket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Server {

    public static ServerSocket serverSocket;

    public static void main (String [] args) {
        try {
            serverSocket = new ServerSocket(1234);

            while (true) {
                ServerThread serverThread = new ServerThread(serverSocket.accept());
                serverThread.start();
            }
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

package Server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ServerThread extends Thread {

    public Socket socket;
    public BufferedReader in;
    public PrintWriter out; 
    public ByteBuffer buf;
    int count;


    public ServerThread (Socket socket) {
        try {
            this.socket = socket;
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);
        } catch (IOException ex) {
            Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void run() {
        while (true) {
            try {
                count = in.read();
                buf = ByteBuffer.allocate(100);
                buf.put((byte) count);
                buf.flip();
                out.println(buf);

                String line = in.readLine();
                System.out.println(line);




            } catch (IOException ex) {
                Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

誰が私が間違っているのか教えてもらえますか?

4

2 に答える 2

1

これ

while (true) {
    ServerThread serverThread = new ServerThread(serverSocket.accept());
    serverThread.start();
}

正しく見えません。ループして新しいスレッドを繰り返し作成しています (リソースを消費し、膨大な数のスレッドを作成します)。一度そのスレッドを作成するだけです。プログラムが他に何もしていない場合、新しいスレッドは不要かもしれません。

于 2012-12-18T09:16:04.493 に答える
0

あなたの間違いは、異なるスタイルのネットワーク データ交換を混在させていることです。まず、メッセージの形式は何ですか? それらは何らかのエンコーディングの文字ですか、それともバイナリデータですか? 最初のケースでは、Buffer を使用してメッセージを読み取るのではなく、作成済みの文字ストリームを使用inして読み取りと書き込みを行う必要があります。out2 番目のケースでは、2 つのオプションがあります。ソケットとバイト ストリームを使用した読み取りと書き込み、またはjava.nio.channelsBuffers からのチャネルを使用した読み取りと書き込みです。バッファにメッセージを書き戻すには、次を使用できます

     buf.flip();
     buffer.position(buffer.limit());
于 2012-12-18T09:48:38.817 に答える