小妹刚学java,用scoket编写了一个聊天室的代码,能支持多客户端,但就是信息无法发送给服务器端,下面是我客户端的代码,请各位大虾帮忙看一下我哪写错了,或是思路哪里不对,万分感谢!!
我服务器端用StringBuffer来存放所有客户的聊天内容!
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Client implements ActionListener,WindowListener{
JTextField jtf = new JTextField(25);
static JTextArea jta = new JTextArea(15,35);
Socket sk;
        String temp = "";  //存放当前聊天信息
String state ="" ;  //用于存放窗口的状态
@Override
public void windowClosing(WindowEvent we) {
state = we.WINDOW_CLOSING+"";  
}
@Override
public void actionPerformed(ActionEvent ae) {
    temp = jtf.getText();
    System.out.println(temp+1);
    jtf.setText("");
    System.out.println(temp+2);
    try{
        show();
    }catch(Exception e){
         e.printStackTrace();
    }
    System.out.println(temp+5);
}
public void show() throws Exception{
 DataInputStream dis = new DataInputStream(sk.getInputStream());
 System.out.println(dis);
 DataOutputStream dos = new DataOutputStream(sk.getOutputStream());
 String all = null;  //存放整个聊天内容
 if(!("201".equals(state))){  //当前窗口未关闭时
 System.out.println(temp+3);
     dos.writeUTF(temp);  //将文本框中的内容写入到服务器端
     while(true){
          String s =dis.readUTF(); //从服务器端读出数据
          if(s==null) break;
             all = all+s;
         }
     System.out.println(temp+4);
  System.out.println(all);
      jta.setText(all); //将聊天内容显示在文本框中
 }else{  //当前窗口关闭时
 System.out.println(temp+6);
      dos.writeUTF(state);  //将窗口状态写入到服务器端
      while(true){
          String s =dis.readUTF();
          if(s==null) break;
             all = all+s;
         }
  System.out.println(all);
      jta.setText(all); //将聊天内容显示在文本框中
      dos.close();
     dis.close();
     sk.close();
     }
}
public Client(Socket sk){
this.sk = sk;
JFrame jf = new JFrame("聊天室");
JPanel jp1 = new JPanel();
JPanel jp2 = new JPanel();
JLabel jl = new JLabel("fiona:");
JButton jb = new JButton("发送");
jp1.add(new JScrollPane(jta));
jp2.add(jl);
jp2.add(jtf);
jp2.add(jb);
jf.add(jp1);
jf.add(jp2,BorderLayout.SOUTH);
jb.addActionListener(this);
jf.addWindowListener(this);
jf.setSize(500,400);
jf.setResizable(false);
jf.setLocation(300,200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) throws Exception{
Socket sk = new Socket("127.0.0.1",3171);
 new Client(sk);
}
@Override
public void windowActivated(WindowEvent arg0) {
}
@Override
public void windowClosed(WindowEvent arg0) {
}
@Override
public void windowDeactivated(WindowEvent arg0) {
}
@Override
public void windowDeiconified(WindowEvent arg0) {
}
@Override
public void windowIconified(WindowEvent arg0) {
}
@Override
public void windowOpened(WindowEvent arg0) {
}
}

解决方案 »

  1.   

     @Override 
    public void actionPerformed(ActionEvent ae) { 
        temp = jtf.getText(); 
        System.out.println(temp+1); 
        jtf.setText(""); 
        System.out.println(temp+2); 
        try{ 
            show(); 
        }catch(Exception e){ 
            e.printStackTrace(); 
        } 
        System.out.println(temp+5); 

    在这个方法中调用write方法。
    在write方法中不用死循环
      

  2.   

    下面写的是问别人的,只是思路,我还没实现。
    private int flag = 0;//属性
    在show()方法中
    String input = flag+":"+userName+":"+temp;  //把flag传输给服务器做判断
    XX.writeUTF(input);//发送到服务器
    flag = 0;
    actionPerformed()方法中
    触发一次,flag=1;//区别触发信息在服务器端中
    private static String temp = "";run()方法中
    Sting tt =  XX.readUTF();//读取客户端信息
    String[] ss = tt.split(":");//按:存到ss
    String t = tt.subString(3);//舍去1:或0:
    if(ss[0]==1){//如果是触发就加入缓存中
        temp = temp+t; 
    }
    XX.writeUTF(temp);
    另外要一定时间清空缓存。 
      

  3.   

    下面写的是问别人的,只是思路,我还没实现。
    private int flag = 0;//属性
    在show()方法中
    String input = flag+":"+userName+":"+temp;  //把flag传输给服务器做判断
    XX.writeUTF(input);//发送到服务器
    flag = 0;
    actionPerformed()方法中
    触发一次,flag=1;//区别触发信息在服务器端中
    private static String temp = "";run()方法中
    Sting tt =  XX.readUTF();//读取客户端信息
    String[] ss = tt.split(":");//按:存到ss
    String t = tt.subString(3);//舍去1:或0:
    if(ss[0]==1){//如果是触发就加入缓存中
        temp = temp+t; 
    }
    XX.writeUTF(temp);
    另外要一定时间清空缓存。 
      

  4.   

    就下面这段代码的话:用红色标出的代码能实现,但中间用蓝色标出的代码却实现不了,这是为什么?? 也就是说我打开了客户端的界面,在文本框中输入了消息,按发送按钮后,能打印出来,但消息还留在文本框中,而且按钮按下了,却起不来!
       @Override 
    public void actionPerformed(ActionEvent ae) { 
        temp = jtf.getText(); 
        System.out.println(temp+1);  
        jtf.setText(""); 
        System.out.println(temp+2); 
        try{ 
            show(); 
        }catch(Exception e){ 
            e.printStackTrace(); 
        } 
        System.out.println(temp+5); 

      

  5.   

       个人觉得没必要弄得这样复杂,,把一个小小的功能拆分成一个一个的方法..就挺好的..比如客端只发..把用用户的信息加上标记(区分私聊信息或发给所有的人信息)  直接发到服务端..由服务端解析..然后服务器中有个集合存放所有连进上去的用户的SOCKET或输出流...再来个遍历.. 向集合中所有输出流对象写出消息....