解决方案 »

  1.   

    重贴一下代码public class MyServer extends JFrame {
    private JTextArea jta = new JTextArea();
    private JScrollPane jsp = new JScrollPane(jta);
    private JTextField jtf = new JTextField(20);
    private JPanel panel = new JPanel();
    private JButton btn = new JButton("发送");
    private PrintWriter pw = null;public MyServer() {
    try {
    ServerSocket ss = new ServerSocket(8888);
    Socket s = ss.accept();InputStreamReader isr = new InputStreamReader(s.getInputStream());
    BufferedReader br = new BufferedReader(isr);pw=new PrintWriter(s.getOutputStream(),true);while (true) {
    String msgClient = br.readLine();
    jta.append("来自客户端: \n");
    jta.append(msgClient + "\n");
    }} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    String msgServer = jtf.getText();
    if (msgServer != null) {
    jta.append("来自服务器: \n");
    jta.append(msgServer + "\n");
    pw.print(msgServer);jtf.setText("");}
    }});panel.add(jtf);
    panel.add(btn);
    jsp.setBorder(new LineBorder(Color.black));
    add(jsp, BorderLayout.CENTER);
    add(panel, BorderLayout.SOUTH);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("服务器端");
    this.setSize(400, 300);
    this.setVisible(true);}public static void main(String[] args) {
    // TODO Auto-generated method stub
    MyServer myClient = new MyServer();
    }
    }
    public class MyClient extends JFrame{
    private JTextArea jta=new JTextArea();
    private JScrollPane jsp=new JScrollPane(jta);
    private JTextField jtf=new JTextField(20);
    private JPanel panel=new JPanel();
    private JButton btn=new JButton("发送");
    private PrintWriter pw=null;
    public MyClient(){try {
    Socket s = new Socket("127.0.0.1",8888);
    InputStreamReader isr=new InputStreamReader(s.getInputStream());
    BufferedReader br=new BufferedReader(isr);
    pw=new PrintWriter(s.getOutputStream());while(true){String msgServer=br.readLine();
    jta.append("来自服务器:\n");
    jta.append(msgServer+"\n");}
    }  catch (Exception e) {e.printStackTrace();
    }btn.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e)
    {
    String msgClient=jtf.getText();
    jta.append("来自客户端:\n");
    jta.append(msgClient+"\n");
    pw.print(msgClient);
    jtf.setText("hello");
    }});
    panel.add(jtf);
    panel.add(btn);
    jsp.setBorder(new LineBorder(Color.black));
    add(jsp,BorderLayout.CENTER);
    add(panel,BorderLayout.SOUTH);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("客户端"); 
    this.setSize(400,300);
    this.setVisible(true);}
    public static void main(String[] args) {
           MyClient myClient=new MyClient();
    }}
      

  2.   

    显然,你new client的时候直接去连服务器了,所以client这边必须要等和服务器收完之后才会进行后面的动作。而服务器这一侧,则是要等客户端连完之后才继续。所以你的代码的行为就怪怪的了。服务器侧,14-26行的代码应该放在新建的线程中执行。客户端侧11-26应该放在action performed 中执行。这样子,客户端才会在你按下button 的时候发送数据,从服务器读数据。
      

  3.   

    代码给你改好了,直接复制过去跑起来看看。public class MyServer extends JFrame {
    private JTextArea jta = new JTextArea();
    private JScrollPane jsp = new JScrollPane(jta);
    private JTextField jtf = new JTextField(20);
    private JPanel panel = new JPanel();
    private JButton btn = new JButton("发送");
    private PrintWriter pw = null; public MyServer() { panel.add(jtf);
    panel.add(btn);
    jsp.setBorder(new LineBorder(Color.black));
    add(jsp, BorderLayout.CENTER);
    add(panel, BorderLayout.SOUTH); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("服务器端");
    this.setSize(400, 300);
    this.setVisible(true);

    btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    String msgServer = jtf.getText();
    if (msgServer != null) {
    jta.append("来自服务器: \n");
    jta.append(msgServer + "\n");
    pw.println(msgServer); jtf.setText(""); }
    } });

    try {
    ServerSocket ss = new ServerSocket(8888);
    Socket s = ss.accept(); InputStreamReader isr = new InputStreamReader(s.getInputStream());
    BufferedReader br = new BufferedReader(isr); pw = new PrintWriter(s.getOutputStream(), true); while (true) {
    String msgClient = br.readLine();
    jta.append("来自客户端: \n");
    jta.append(msgClient + "\n");
    } } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } } public static void main(String[] args) {
    // TODO Auto-generated method stub
    MyServer myClient = new MyServer();
    }
    }public class MyClient extends JFrame {
    private JTextArea jta = new JTextArea();
    private JScrollPane jsp = new JScrollPane(jta);
    private JTextField jtf = new JTextField(20);
    private JPanel panel = new JPanel();
    private JButton btn = new JButton("发送");
    private PrintWriter pw = null; public MyClient() { panel.add(jtf);
    panel.add(btn);
    jsp.setBorder(new LineBorder(Color.black));
    add(jsp, BorderLayout.CENTER);
    add(panel, BorderLayout.SOUTH); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("客户端");
    this.setSize(400, 300);
    this.setVisible(true); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
    String msgClient = jtf.getText();
    jta.append("来自客户端:\n");
    jta.append(msgClient + "\n");
    pw.println(msgClient);
    jtf.setText("hello");
    } });

    try {
    Socket s = new Socket("127.0.0.1", 8888);
    InputStreamReader isr = new InputStreamReader(s.getInputStream());
    BufferedReader br = new BufferedReader(isr);
    pw = new PrintWriter(s.getOutputStream(),true); while (true) { String msgServer = br.readLine();
    jta.append("来自服务器:\n");
    jta.append(msgServer + "\n"); }
    } catch (Exception e) { e.printStackTrace();
    } } public static void main(String[] args) {
    MyClient myClient = new MyClient();
    }}
      

  4.   

    然后顺便说说你的问题:
    1、Socket是阻塞IO,所以连接服务器或者是服务器等待连接都是阻塞的
    2、你都while(true)了,后面绘制Swing界面的代码就执行不到了,也就是看不到界面了
    3、你说的关掉eclipse才出现,并不是关掉eclipse时出现,而是关掉服务器时就会出现,还是因为第2点,你绘制界面的代码写在连接服务器之后,且你用了while(true),所以只有当抛出异常时才退出循环,你才能看到界面
    4、向socket写入数据用pw.println而不是print,且pw的构造第二个参数要为true(设置自动flush,PrintWriter是缓冲流),这样你才能在另一端读到改完这些你的程序就能正常运行了
      

  5.   

    Socket s = ss.accept();
    把这句代码移动到while(true)中去,我曾经写了一个超级简单的,你可以去看看,模仿qq通信的
    https://github.com/thinkMore123/Java-Socket