这是我毕设的最后一bug,明天验机,所以请快给回复。
在一个向服务器发送信息的线程中,
有代码如下:
public void run() {
try {
........
while (true) {
...... do {
System.out.println("请输入发送信息,每次一行回车表示,输入other结束当前会话,exit退出程序:");
BufferedReader usrinput = new BufferedReader(
new InputStreamReader(System.in));
theLine = usrinput.readLine();
if (theLine.equals("exit")) {
String x = "&over!&" + this.moudle;
byte[] y = x.getBytes();
DatagramPacket disconnect = new DatagramPacket(y,
y.length);
socket.send(disconnect);
socket.disconnect();
System.exit(0);
}
if (!theLine.equals("other")) {
theLine = id + "%" + this.moudle + "$" + theLine;
byte[] data = theLine.getBytes(); DatagramPacket output = new DatagramPacket(data,
data.length); socket.send(output);
} } while (!theLine.equals("other"));
Thread.yield();
}
} catch (IOException e) {
e.printStackTrace();
} }
我输入exit后,System.exit(0)(将0改为-1结果一样)之前的代码都执行了,但就是程序停滞在这块,无法终止运行,
之前我没用do-while循环语句却能正常返回退出,
这是为何?如何解决?
在一个向服务器发送信息的线程中,
有代码如下:
public void run() {
try {
........
while (true) {
...... do {
System.out.println("请输入发送信息,每次一行回车表示,输入other结束当前会话,exit退出程序:");
BufferedReader usrinput = new BufferedReader(
new InputStreamReader(System.in));
theLine = usrinput.readLine();
if (theLine.equals("exit")) {
String x = "&over!&" + this.moudle;
byte[] y = x.getBytes();
DatagramPacket disconnect = new DatagramPacket(y,
y.length);
socket.send(disconnect);
socket.disconnect();
System.exit(0);
}
if (!theLine.equals("other")) {
theLine = id + "%" + this.moudle + "$" + theLine;
byte[] data = theLine.getBytes(); DatagramPacket output = new DatagramPacket(data,
data.length); socket.send(output);
} } while (!theLine.equals("other"));
Thread.yield();
}
} catch (IOException e) {
e.printStackTrace();
} }
我输入exit后,System.exit(0)(将0改为-1结果一样)之前的代码都执行了,但就是程序停滞在这块,无法终止运行,
之前我没用do-while循环语句却能正常返回退出,
这是为何?如何解决?
在这后面加个 return;
你确定一下 无法停止的是否是服务器端程序?
exit退出时又一个前提的,假如安全管理器允许,
程序本身能通过调用System.exit(0);来退出程序。
try {
........
out:
while (true) {
...... do {
System.out.println("请输入发送信息,每次一行回车表示,输入other结束当前会话,exit退出程序:");
BufferedReader usrinput = new BufferedReader(
new InputStreamReader(System.in));
theLine = usrinput.readLine();
if (theLine.equals("exit")) {
String x = "&over!&" + this.moudle;
byte[] y = x.getBytes();
DatagramPacket disconnect = new DatagramPacket(y,
y.length);
socket.send(disconnect);
socket.disconnect();
//System.exit(0);
break out;//就是跳出循环
}
if (!theLine.equals("other")) {
theLine = id + "%" + this.moudle + "$" + theLine;
byte[] data = theLine.getBytes(); DatagramPacket output = new DatagramPacket(data,
data.length); socket.send(output);
} } while (!theLine.equals("other"));
Thread.yield();
}
} catch (IOException e) {
e.printStackTrace();
} }
socket.disconnect();
System.out.println("##################"); // 看看能运行到这一行吗?我怀疑
System.exit(0);
}
System.exit(1);
}
试试,怀疑有异常
或者你可以把while (true)去掉
客户端:
package houlei.client;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;public class SenderClient implements Runnable {
private Thread instance;
private String serverIp;
private int serverPort;
private boolean running=false;
public SenderClient(String serverIp, int serverPort) {
super();
this.serverIp = serverIp;
this.serverPort = serverPort;
instance=new Thread(null,this,"向服务器发送信息的线程");
} public void run() {
Socket socket = new Socket();
try {
socket.connect(new InetSocketAddress(serverIp,serverPort));
} catch (IOException e) {
e.printStackTrace();
return;
}
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
} catch (IOException e) {
e.printStackTrace();
return;
}
while (running){
try {
System.out.println("请输入发送信息,每次一行回车表示,输入other结束当前会话,exit退出程序:");
String line = br.readLine();
if(line==null)return;//return换成System.exit(0);也可以;参数一般无所谓是什么整数。
if(line.equalsIgnoreCase("other")){//不区分大小写。
//结束当前会话。程序应该跳出while循环。
socket.close();
break;
}else if(line.equalsIgnoreCase("exit")){
//退出程序。严格意义上来讲,应该调用System.exit(0);参数一般无所谓是什么整数。
return;//因为该程序就一个线程,所以,调用return就可以结束线程,进而退出程序。
}else{
sendMessage(bw,line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("结束当前会话后应该执行的代码。");
}
private void sendMessage(BufferedWriter bw, String line) throws IOException {
bw.write(line);bw.newLine();
bw.flush();
} public void start(){
if(running)return;
running=true;
instance.start();
}
public void stop(){
if(running==false)return;
running=false;
instance.interrupt();
// instance.join();
}
public static void main(String[] args) {
String serverIP="127.0.0.1";
int serverPort = 12345;
new SenderClient(serverIP,serverPort).start();
}}服务端:
package houlei.client;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class RecieveServer extends Thread{
private int port;
public RecieveServer(int port){
this.port=port;
}
public void run(){
try {
ServerSocket ss = new ServerSocket(port);
while(true){
Socket s = ss.accept();
new Printer(s).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private class Printer extends Thread{
private Socket s;
public Printer(Socket s){
this.s=s;
}
public void run(){
try{
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line =null;
while((line=br.readLine())!=null){
System.out.println(line);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new RecieveServer(12345).start();
}
}服务端比较简单。
谢谢。