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 来读取消息,而应该使用您已经创建的字符流来读取和写入inout在第二种情况下,您有 2 个选项:使用套接字和字节流读取和写入,或者使用来自java.nio.channelsBuffers 的通道。要在缓冲区中写回消息,您可以使用

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