【发布时间】:2009-04-03 14:53:27
【问题描述】:
所以,我有两个线程。
线程一管理客户端连接。 (只有一个客户端和一个服务器)
我称它为我的服务器线程。
线程二管理向客户端发送消息。我称它为我的消息处理器线程。
线程一负责定期向客户端发送心跳。
在编程时,我假设套接字不是线程安全的,但缓冲区是,只要我为服务器和处理器线程使用单独的缓冲区就可以了。
我还假设“PrintWriter”类似于 Java 中的套接字缓冲区。
在这些假设下,我编写了这个函数来发送心跳:
public void sendHeartBeat(){
logger.info("Sending a hearbeat!");
PrintWriter printWriter=null;
try {
printWriter = new PrintWriter(clientSocket.getOutputStream());
} catch (IOException e) {
logger.info(e.toString());
}
if(printWriter!=null){
printWriter.print("HEARTBEAT#");
printWriter.flush();
}
}
另一个线程,“处理器”线程做了类似的事情:
printWriter=new PrintWriter(theServer.getClientSocket().getOutputStream());
以这种方式,我每次希望发送心跳时都会创建一个新的“缓冲区”,并且我的消息永远不会被覆盖。
不幸的是,情况似乎并非如此。我通过管道收到一条消息,如下所示: dsgdsbHEARTBEAT#sdg
这会导致稍后发生核心转储。
这是我的问题:
1) 套接字显然不是线程安全的,但是我从它们那里得到的 PrintWriters 是线程安全的吗?还是只是返回相同的 PrintWriter?
2) 什么类似于 Java 中的套接字缓冲区?我应该如何看待这个问题?
3) 如何使这些线程不写入套接字上的同一个缓冲区?
【问题讨论】:
标签: java multithreading sockets