这是我毕设的最后一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循环语句却能正常返回退出,
这是为何?如何解决? 

解决方案 »

  1.   

    Thread.yield();  暂停当前正在执行的线程对象,并执行其他线程。调cancel?
      

  2.   

    System.exit(0);  
    在这后面加个  return;
      

  3.   

    //Thread.yield后一样存在无法退出
      

  4.   

    无法停止?
    你确定一下 无法停止的是否是服务器端程序?
    exit退出时又一个前提的,假如安全管理器允许,
    程序本身能通过调用System.exit(0);来退出程序。
      

  5.   

    system.exit(0/1)这两个都不行?。。
      

  6.   

    public void run() {  
    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();  
    }  } 
      

  7.   

    (theLine.equals("exit")) 这个有没有确定为true?
      

  8.   

    既然是线程 为什么非要用System.exit(0);   ??? 直接改成return 就可以终止了么
      

  9.   

    socket.send(disconnect); 
    socket.disconnect(); 
    System.out.println("##################"); // 看看能运行到这一行吗?我怀疑
    System.exit(0); 
    }  
      

  10.   

    catch (IOException e) {  
     System.exit(1);  
    }  
    试试,怀疑有异常
      

  11.   

    socket.isConnected();看看套节字是不是还处于连接状态,是得话,socket.close();
      

  12.   

    分别在System.exit(0); 和socket.send(output);  后加个return
      或者你可以把while (true)去掉
      

  13.   

    我觉得break out;//就是跳出循环     这个有问题,应该直接跳出吧
      

  14.   

    哈哈,我自己解决了,debug时发现代码执行到socket.disconnect()就不动了,所以直接用DatagramPacket disconnect = new DatagramPacket(y,y.length,this.server, this.port);去掉了那句代码!就一切OK了
      

  15.   

    我自己给楼主写了一个程序。楼主要是有兴趣就自己看看,可能会有启发。
    客户端:
    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();
    }
    }服务端比较简单。
    谢谢。