我正在开展一个项目,我想与一个设备进行交流。我与设备建立了套接字连接,连接正常,但设备向我发送消息: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);
}
}
}
}
谁能告诉我我做错了什么?
答案 0 :(得分:1)
这个
while (true) {
ServerThread serverThread = new ServerThread(serverSocket.accept());
serverThread.start();
}
看起来不正确。您正在循环并重复创建一个新线程(这将消耗资源并创建大量线程)。您应该只创建一次该线程。如果你的程序什么都不做,那么一个新的线程可能是多余的。
答案 1 :(得分:0)
您的错误在于您混合了不同风格的网络数据交换。首先,消息的格式是什么?它们是某些编码中的字符,还是某些二进制数据?在第一种情况下,您不应该使用Buffer来读取消息,而是使用您已创建的in
和out
字符流进行读写。在第二种情况下,您有两个选项:使用套接字和字节流进行读取和写入,或使用java.nio.channels
和Buffer
的通道进行读取和写入。要在缓冲区中回写消息,可以使用
buf.flip();
buffer.position(buffer.limit());