我正在尝试创建一个点对点的语音聊天程序,该程序试图在程序开始时在两个对等体之间建立连接。
我创建了两个线程,一个线程Call
处理用户呼叫某人的请求,receiveCall
处理来电。
我想要做的是,当你接到电话或打电话给别人是为了“杀死”另一个线程,因为它符合它的目的。
创建两个线程的方法。
public Peer(String[] args) {
port = Integer.parseInt(args[0]);
stateHandler = new StateHandler();
scanner = new Scanner(System.in);
call = new Thread(new ReceiveCall());
call.start();
receiveCall = new Thread(new Call());
receiveCall.start();
}
Call
方法:
class Call implements Runnable {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
System.out.print(">");
String ip;
int port;
DataOutputStream output;
String call;
call = scanner.nextLine();
while (!call.contains("call") && findMatches(call, " ") != 2 && !callFlag) {
System.out.println("Usage: call <ip> <port>");
call = scanner.nextLine();
}
String[] parts = call.split(" ");
ip = parts[1];
port = Integer.parseInt(parts[2]);
socket = new Socket(ip, port);
//Send invite
output = new DataOutputStream(socket.getOutputStream());
output.writeUTF("INVITE");
stateHandler.manageStates(StateHandler.StateEvent.CALLING, socket);
} catch (IOException e) {
Thread.currentThread().interrupt();
}
}
}
}
ReceiveCall
方法:
class ReceiveCall implements Runnable {
@Override
public void run() {
DataInputStream inputStream;
DataOutputStream outputStream = null;
String answer, msg = null;
try {
serverSocket = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
//Accept connection
try {
socket = serverSocket.accept();
call.interrupt(); //Here I want to interrupt the other thread
inputStream = new DataInputStream(socket.getInputStream());
outputStream = new DataOutputStream(socket.getOutputStream());
msg = inputStream.readUTF();
} catch (IOException e) {
e.printStackTrace();
}
if (!msg.equals("INVITE")) {
}
System.out.println(socket.getInetAddress().toString() + " is calling you! Answer? (Y/N)");
synchronized (scanner) {
answer = scanner.nextLine();
}
if (!answer.equals("Y")) {
System.out.println("Ready to receive a call or call...");
}
try {
outputStream.writeUTF("TRO");
} catch (IOException e) {
e.printStackTrace();
}
stateHandler.manageStates(StateHandler.StateEvent.RECEIVE_CALL, socket);
}
}
该程序是基于状态的,因此当其中一个线程完成时,它应该转到另一个状态并在那里执行相应的代码。