将线程用在socket上面,老是实现不了,非常不解...请各位高手指点一下。
package work_2;import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Panel;
import java.awt.BorderLayout;import java.net.Socket;
import java.net.UnknownHostException;import java.io.InputStreamReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.BufferedReader; 
import java.io.PrintWriter;public class chat_client extends JFrame implements ActionListener { /**
 * 
 */
private static final long serialVersionUID = 1L;
/**
 * @param args
 */
JButton jb = new JButton("start");
List list = new List();
Panel p1 = new Panel(), p2 = new Panel();
Socket s = null;
InputStream ip = null;
PrintWriter pw;
InputStreamReader ir = null;
BufferedReader br = null; chat_client() {
jb.addActionListener(this);
this.setLayout(new BorderLayout());
this.add(list, BorderLayout.CENTER);
this.add(p1, BorderLayout.SOUTH);
p1.setLayout(new BorderLayout());
p1.add(jb, BorderLayout.EAST);
this.setSize(275, 345);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
try {
s = new Socket("season", 3000);
} catch (UnknownHostException ue) {
list.add("UnknownHostException");
System.exit(0);
} catch (IOException ie) {
list.add("IOException");
System.exit(0);
}
new Thread(run()).start();
} private Runnable run() {
// TODO Auto-generated method stub
if (s != null) {
while (true) {
try {
ip = s.getInputStream();
ir = new InputStreamReader(ip);
br = new BufferedReader(ir);
list.add(br.readLine());
} catch (IOException e) {
// TODO Auto-generated catch block
list = new List();
list.add("IOException :can't get data");
}
}
}else{
System.exit(0);
}
return run();
} public static void main(String[] args) {
// TODO Auto-generated method stub
new chat_client();
} public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object b = e.getSource();
if (b.equals(jb)) {
try {
pw = new PrintWriter(s.getOutputStream());
pw.println("ok    ");
pw.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
System.out.println("op error");
}
} }
}
package work_2;import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JFrame;
import javax.swing.JButton;import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.InputStreamReader; 
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.PrintWriter;
public class chat_server extends JFrame implements ActionListener { /**
 * 
 */
private static final long serialVersionUID = 1L;
/**
 * @param args
 */
JButton jb = new JButton("work");
ServerSocket ss = null;
Socket s = null;
InputStream ip = null;
InputStreamReader ir = null;
BufferedReader br = null;
PrintWriter pw; chat_server() {
jb.addActionListener(this);
this.setLayout(new FlowLayout());
this.add(jb);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(200, 100);
this.setVisible(true);
try {
ss = new ServerSocket(3000);
} catch (IOException ie) {
System.exit(0);
System.out.println("IOException on newing");
}
} public static void main(String[] args) {
// TODO Auto-generated method stub
new chat_server();
} public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object b = e.getSource();
if (b.equals(jb)) {
new Thread(run()).start();
}
} private Runnable run() {
// TODO Auto-generated method stub
if (ss != null) {
while (true) {
try {
s = ss.accept();
new Thread(run2(s)).start();
} catch (IOException e) {
// TODO Auto-generated catch block
System.exit(0);
}
}
}
return run();
} private Runnable run2(Socket s2) {
// TODO Auto-generated method stub
if (s2 != null) {
try {
ip = s2.getInputStream();
ir = new InputStreamReader(ip);
br = new BufferedReader(ir);
String string = br.readLine().trim();
pw = new PrintWriter(s2.getOutputStream());
pw.println(string);
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("thread2               ");
}
}
return run2(s2);
}}
首先谢谢看完的朋友,再多谢回答的朋友,这个线程和socket自己学着感觉问题很多,而且自己动手写的没有运行到过..搞到我人都烦了.所以请高手指点下.

解决方案 »

  1.   

    private Runnable run() {
            // TODO Auto-generated method stub
            if (ss != null) {
                while (true) {
                    try {
                        s = ss.accept();
                        new Thread(run2(s)).start();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        System.exit(0);
                    }
                }
            }
            return run();
        }
     return run();
    你程序能跑的好好的?
      

  2.   

    ...你創建線程的目的是什么?你為什么要在你的類里邊寫那個 run方法?
      

  3.   

     
    private Runnable run() {
            // TODO Auto-generated method stub
            if (ss != null) {
                while (true) {
                    try {
                        s = ss.accept();
                        new Thread(run2(s)).start();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        System.exit(0);
                    }
                }
            }
            return run();
        }这一块没能看懂
      

  4.   

    这样写线程好像不对吧,第一次看到这样写,我觉得可以写成匿名内部类的形式,如下:
    new Thread(new Runnable(){
         if (ss != null) {
                while (true) {
                    try {
                        s = ss.accept();
                        new Thread(run2(s)).start();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        System.exit(0);
                    }
                }
        }
    }).start();
    只有启动线程就没有问题了
      

  5.   

    不好意思,又写错,应该是:
    new Thread(new Runnable(){
        public void run() {
              if (ss != null) {
                  while (true) {
                      try {
                          s = ss.accept();
                          new Thread(run2(s)).start();
                      } catch (IOException e) {
                          // TODO Auto-generated catch block
                          System.exit(0);
                      }
                  }
              }
        }
    }).start(); 
    忘了run方法
      

  6.   


    回复1楼的hxl1013 :
    我觉得可以,只要将1个Runnable类附在线程上就行了吧.回复2楼的yuchui :
    我测试的时候,基本能完成客户端的操作,但是在客户端断开连接的时候,服务端出错,抛出lang的溢出异常:回复3楼的Sniper_Killer :
    创建线程的目的是想要监听Socket,在接收到客户方的信息的时候可以再新建1个线程分配给它,完成信息的接收以及相关的操作回复4楼的xiongwenhua365 :
    我这么写是想在这个监督Socket的线程里面也给每个接收到的信息分配1个子的线程.回复5楼的xuhua205 :
    这个我试了下,但是在客户端只能显示到1个ok(正确的是显示100行ok),然后客户端就不能工作了.我都不清楚怎么回事.多谢大家的建议以及指点!有错的地方,不妨用直接以及激进的口吻指出.
      

  7.   

    线程基础的就两种方法,一个是实现RUNNABLE借口的类,在THREAD()中引用。
    另一个是extends thread一个类,然后直接START。
    改一下写法大概就行了。
      

  8.   

    谢谢大家的指点,问题已经解决:
    以下是本人的总结,不正确请高人指出!
    错误1:构建线程错误:不能直接构建Runnable run()方法,应该构建类再extends Runnable;
    错误2:服务方的接收条件,应该是在s != null的情况下循环(这点是我的理解出了问题);
    错误3:没有考虑到线程的运行原理,由于系统都是时分的,所以每个线程都有一定的工作时间,如果超时,就会出现显示信息不足够的错误.以下是修改之后的代码,给大家分享,虽然这个代码很+very+十分基础,但是也来个班门弄斧,因为总不能老是发错误的代码吧!
    package work_2;import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.JFrame;
    import javax.swing.JButton;import java.net.ServerSocket;
    import java.net.Socket;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.InputStream;
    import java.io.BufferedReader;
    import java.io.PrintWriter;import java.util.concurrent.Executors;
    import java.util.concurrent.ExecutorService;public class chat_server extends JFrame implements ActionListener { /**
     * 
     */
    private static final long serialVersionUID = 1L;
    /**
     * @param args
     */
    JButton jb = new JButton("work");
    ServerSocket ss = null;
    Socket s = null;
    InputStream ip = null;
    InputStreamReader ir = null;
    BufferedReader br = null;
    // OutputStream op = null;
    PrintWriter pw;
    ExecutorService exec = Executors.newFixedThreadPool(100); chat_server() {
    jb.addActionListener(this);
    this.setLayout(new FlowLayout());
    this.add(jb);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(200, 100);
    this.setVisible(true);
    try {
    ss = new ServerSocket(3000);
    } catch (IOException ie) {
    System.exit(0);
    System.out.println("IOException on newing");
    }
    // new Thread(run()).start();
    } public static void main(String[] args) {
    // TODO Auto-generated method stub
    new chat_server();
    } public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    Object b = e.getSource();
    if (b.equals(jb)) {
    new Thread_1().start();
    }
    } class Thread_1 extends Thread {
    // TODO Auto-generated method stub
    public void run() {
    if (ss != null) {
    while (true) {
    try {
    s = ss.accept();
    new Thread_2(s).start();
    } catch (IOException e) {
    System.exit(0);
    }
    }
    }
    } } class Thread_2 extends Thread {
    private Socket socket; Thread_2(Socket so) {
    this.socket = so;
    } public void run() {
    try {
    ip = socket.getInputStream();
    ir = new InputStreamReader(ip);
    br = new BufferedReader(ir);
    while (socket != null) {
    String string = br.readLine().trim();
    pw = new PrintWriter(socket.getOutputStream(), true);
    pw.println(string);

    }
    } catch (IOException e) {
    //这里会报错的,是因为Socket关闭的时候pw再也print不到了;
                                    //大家可以去完善一下;               
    }
    }
    }}
    package work_2;import javax.swing.JFrame;
    import javax.swing.JButton;
    import java.awt.List;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.Panel;
    import java.awt.BorderLayout;import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.concurrent.TimeUnit;import java.io.InputStreamReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.BufferedReader; //import java.io.OutputStream;
    import java.io.PrintWriter;public class chat_client extends JFrame implements ActionListener { /**
     * 
     */
    private static final long serialVersionUID = 1L;
    /**
     * @param args
     */
    JButton jb = new JButton("start");
    List list = new List();
    Panel p1 = new Panel(), p2 = new Panel();
    Socket s = null;
    InputStream ip = null;
    PrintWriter pw;
    InputStreamReader ir = null;
    BufferedReader br = null; chat_client() {
    jb.addActionListener(this);
    this.setLayout(new BorderLayout());
    this.add(list, BorderLayout.CENTER);
    this.add(p1, BorderLayout.SOUTH);
    p1.setLayout(new BorderLayout());
    p1.add(jb, BorderLayout.EAST);
    this.setSize(275, 345);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
    try {
    s = new Socket("season", 3000);
    } catch (UnknownHostException ue) {
    list.add("UnknownHostException");
    System.exit(0);
    } catch (IOException ie) {
    list.add("IOException");
    System.exit(0);
    }
    new Thread(run()).start();
    } private Runnable run() {
    // TODO Auto-generated method stub
    if (s != null) {
    while (true) {
    try {
    ip = s.getInputStream();
    ir = new InputStreamReader(ip);
    br = new BufferedReader(ir);
    list.add(br.readLine());
    } catch (IOException e) {
    // TODO Auto-generated catch block
    list = new List();
    list.add("IOException :can't get data");
    }
    }
    } else {
    System.exit(0);
    }
    return run();
    } public static void main(String[] args) {
    // TODO Auto-generated method stub
    new chat_client();
    } public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    Object b = e.getSource();
    if (b.equals(jb)) {
    try {
    pw = new PrintWriter(s.getOutputStream(), true);
    for (int i = 0; i < 10; i++)
    {
    pw.println("ok    ");
    try {
    TimeUnit.MILLISECONDS.sleep(20);
                                            //添加时间间隔的目的是为了让线程有足够的时间发送信息;
    } catch (InterruptedException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    }
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    System.out.println("op error");
    }
    } }
    }
    在此再次多谢关注帖子的朋友,谢谢,敬礼.