点对点聊天不是 receiving/sending 消息
Peer-to-peer chat not receiving/sending messages
我正在尝试创建相互连接的对等点,并且能够 send/receive 向他们同时连接的每个人发送消息。它们都在同一台机器上 运行。一旦连接到对等点并获得套接字连接,我将启动两个线程,一个正在读取,一个正在写入。但是,readLine()
无限期阻塞,我不确定问题出在哪里。对等点成功连接,但消息交换失败。中断一个对等点会导致从与其连接的其他对等点读取 "null"
消息。
编辑:在PrintWriter
中使用autoflush = true
会向连接到中断对等点的其他对等点抛出"ConnectionReset"
异常。
我试过在发送消息之前等待读取线程启动,从对等端的任何一端获取套接字连接,将 input/output 流存储在存储为成员变量的列表中,并且只传递socket/all 流到每个线程。也尝试了不同的阅读方式,如阅读帖评论所示。
class ConnectionListener extends Thread{
public void run(){
try {
while (!allPeersJoined()) {
Socket socket = null;
socket = peerServer.accept();
new PeerReader(socket).start();
new PeerWriter(socket).start();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
}
class PeerWriter extends Thread{
PrintWriter writer;
public PeerWriter(Socket socket){
try {
this.writer = new PrintWriter(socket.getOutputStream(), true);
}catch (IOException e){
e.printStackTrace();
}
}
@Override
public void run() {
writer.println("Hello");
}
}
class PeerReader extends Thread{
BufferedReader reader;
public PeerReader(Socket socket){
try {
this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}catch (IOException e){
e.printStackTrace();
}
}
@Override
public void run() {
String input = "";
System.out.println("Waiting to receive messages...");
try {
System.out.println(reader.readLine());
// while((input = reader.readLine()) != null){
// System.out.println(input);
// }
}catch (IOException e){
e.printStackTrace();
}
}
}
编辑:添加套接字创建
Thread t = new ConnectionListener();
t.start();
// Connect to all peers
for (String peer : peers) {
new Socket("127.0.0.1", Integer.valueOf(peer));
}
您正在创建多个套接字,但从未使用过它们。
现在 ConnectionListener 获得您的连接,在连接的套接字上发送字节,但套接字从不响应...因为您从未告诉他们。
您应该按照与 ConnectionListener 相同的方式,创建一个名为
ClientConnection,它有自己的编写器和 reader.
我正在尝试创建相互连接的对等点,并且能够 send/receive 向他们同时连接的每个人发送消息。它们都在同一台机器上 运行。一旦连接到对等点并获得套接字连接,我将启动两个线程,一个正在读取,一个正在写入。但是,readLine()
无限期阻塞,我不确定问题出在哪里。对等点成功连接,但消息交换失败。中断一个对等点会导致从与其连接的其他对等点读取 "null"
消息。
编辑:在PrintWriter
中使用autoflush = true
会向连接到中断对等点的其他对等点抛出"ConnectionReset"
异常。
我试过在发送消息之前等待读取线程启动,从对等端的任何一端获取套接字连接,将 input/output 流存储在存储为成员变量的列表中,并且只传递socket/all 流到每个线程。也尝试了不同的阅读方式,如阅读帖评论所示。
class ConnectionListener extends Thread{
public void run(){
try {
while (!allPeersJoined()) {
Socket socket = null;
socket = peerServer.accept();
new PeerReader(socket).start();
new PeerWriter(socket).start();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
}
class PeerWriter extends Thread{
PrintWriter writer;
public PeerWriter(Socket socket){
try {
this.writer = new PrintWriter(socket.getOutputStream(), true);
}catch (IOException e){
e.printStackTrace();
}
}
@Override
public void run() {
writer.println("Hello");
}
}
class PeerReader extends Thread{
BufferedReader reader;
public PeerReader(Socket socket){
try {
this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}catch (IOException e){
e.printStackTrace();
}
}
@Override
public void run() {
String input = "";
System.out.println("Waiting to receive messages...");
try {
System.out.println(reader.readLine());
// while((input = reader.readLine()) != null){
// System.out.println(input);
// }
}catch (IOException e){
e.printStackTrace();
}
}
}
编辑:添加套接字创建
Thread t = new ConnectionListener();
t.start();
// Connect to all peers
for (String peer : peers) {
new Socket("127.0.0.1", Integer.valueOf(peer));
}
您正在创建多个套接字,但从未使用过它们。
现在 ConnectionListener 获得您的连接,在连接的套接字上发送字节,但套接字从不响应...因为您从未告诉他们。
您应该按照与 ConnectionListener 相同的方式,创建一个名为 ClientConnection,它有自己的编写器和 reader.