我就是不明白我的程序为啥无法达到聊天的效果,客户端发过去的信息服务器端无法接受,为什么?
Server端:
import java.net.*;
import java.io.*;class ChatServer
{
public static void main(String[] agrs)
{
ServerSocket ss=null;
Socket s=null;
InputStream is=null;
BufferedReader br1=null;
BufferedReader br2=null;
OutputStreamWriter osw=null;
BufferedWriter bw=null;
InputStreamReader is1=null;
try
{
ss=new ServerSocket(2222);
while(true)
{
 System.out.println("Client:");
 s=ss.accept();
 is=s.getInputStream();
 is1=new InputStreamReader(is);
 br1=new BufferedReader(is1);
 System.out.print(br1.readLine());
 System.out.print("Server:");
   br2=new BufferedReader(new InputStreamReader(System.in));
   String c=br2.readLine();
     osw=new OutputStreamWriter(s.getOutputStream());
     bw=new BufferedWriter(osw);
   bw.write(c,0,c.length());
   bw.flush();
}
}
catch(IOException ioe)
{
System.out.println(ioe.getMessage());
}
}
}Client端:
import java.net.*;
import java.io.*;class ChatClient
{
public static void main(String[] args)
{
String c;

Socket s=null;
BufferedReader br1=null;
OutputStream os=null;
OutputStreamWriter osw=null;
BufferedReader br2=null;
BufferedWriter br3=null;
try
{

while(true)
{
s=new Socket("127.0.0.1",2222);
    System.out.print("Client:");
    br1=new BufferedReader(new InputStreamReader(System.in));
    c=br1.readLine();
    os=s.getOutputStream();
    osw=new OutputStreamWriter(os);
    br3=new BufferedWriter(osw);
    br3.write(c,0,c.length());
    br3.flush();
    System.out.print("Server:");
    br2=new BufferedReader(new InputStreamReader(s.getInputStream()));
    System.out.println(br2.readLine());
  }
  }
  catch(IOException ioe)
  {
   System.out.println(ioe.getMessage());
  }
}
}

解决方案 »

  1.   

    给楼主个我在书上看到的二人聊天室的代码吧
    ChatApp.java文件package chat2;import java.net.*;
    import java.io.*;
    import javax.swing.UIManager;
    import java.awt.*;
    public class ChatApp {
      boolean packFrame = false;  public ChatApp() {
        ChatFrame frame = new ChatFrame();
        if (packFrame) {
          frame.pack();
        }
        else {
          frame.validate();
        }
        //放置窗体在屏幕中央
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = frame.getSize();
        if (frameSize.height > screenSize.height) {
          frameSize.height = screenSize.height;
        }
        if (frameSize.width > screenSize.width) {
          frameSize.width = screenSize.width;
        }
        frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
        frame.setVisible(true);
        frame.waitforpackets();
      }  public static void main(String[] args) {
        try {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e) {
          e.printStackTrace();
        }
        new ChatApp();
      }
    }
    ChatFrame.java文件package chat2;import java.net.*;
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.lang.*;public class ChatFrame extends JFrame {
      JPanel contentPane;
      Label label1 = new Label();//发送消息
      Label label2 = new Label();//输入ip
      Label label3 = new Label();//输入端口标签
      Label label4 = new Label();//输出端口标签
      TextField textField1 = new TextField();//输入ip
      TextField textField2 = new TextField();//发送消息
      TextField textField3 = new TextField();//获得输入端口
      TextField textField4 = new TextField();//获得输出端口
      Button button1 = new Button();//发送消息
      Button button2 = new Button();//建立连接
      TextArea textArea1 = new TextArea();  boolean online = false;
      int portIn = 5000;//输入端口
      int portOut = 5001;//输出端口  DatagramPacket sendpacket,receivepacket;//声明发送和接收数据包
      DatagramSocket sendsocket,receivesocket;//声明发送和接收DatagramSocket
      public ChatFrame() {
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
        try {
          toInit();
        }
        catch(Exception e) {
          e.printStackTrace();
        }
      }
      
      private void toInit() throws Exception  {
        contentPane = (JPanel) this.getContentPane();
        label1.setText("发送信息:");
        label1.setBounds(new Rectangle(13, 100, 60, 21));
        contentPane.setLayout(null);
        this.setSize(new Dimension(363, 320));
        this.setTitle("二人聊天室");
        label2.setText("输入对方IP地址:");
        label2.setBounds(new Rectangle(12, 19, 109, 23));
        label3.setText("输入端口:");
        label3.setBounds(new Rectangle(12,58,55,22));
        label4.setText("输出端口:");
        label4.setBounds(new Rectangle(180,58,55,22));
        textField3.setText("5000");
        textField4.setText("5001");
        textField2.setText("210.77.26.60");    button1.setLabel("发送");
        button1.setBounds(new Rectangle(280, 100, 59, 21));
        button1.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(ActionEvent e) {
            button1_actionPerformed(e);
          }
        });
        button2.setLabel("连接");
        button2.setBounds(new Rectangle(280, 20, 59, 21));
        button2.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(ActionEvent e) {
            button2_actionPerformed(e);
          }
        });    textField4.setBounds(new Rectangle(240,58,90,22));
        textField3.setBounds(new Rectangle(70,58,90,22));
        textField2.setBounds(new Rectangle(123, 20, 120, 19));
    textField1.setBounds(new Rectangle(76, 100, 190, 19));
        textArea1.setBounds(new Rectangle(11, 140, 333, 134));
        textArea1.setEditable(false);
        contentPane.add(label4, null);
        contentPane.add(label3, null);
        contentPane.add(label2, null);
        contentPane.add(label1, null);
        contentPane.add(textField1, null);
        contentPane.add(textField2, null);
        contentPane.add(textField3, null);
        contentPane.add(textField4, null);
        contentPane.add(textArea1, null);
        contentPane.add(button1, null);
        contentPane.add(button2,null);
        
        try {    
            sendsocket=new DatagramSocket(5001);//实例化DatagramSocket类作为输出端
               receivesocket=new DatagramSocket(5000);//实例化DatagramSocket类作为输入端
               online = !(sendsocket.isClosed());
         }
          catch(SocketException se){//异常捕获
             se.printStackTrace() ;
             System.exit(0);
         }
      }
      
      protected void processWindowEvent(WindowEvent e) {
        super.processWindowEvent(e);
        if (e.getID() == WindowEvent.WINDOW_CLOSING) {
          System.exit(0);
        }
      }
      public void waitforpackets(){//检测并接受对方发来的消息
        while(true){
            try{
                 byte[]array=new byte[100];
                  receivepacket=new DatagramPacket(array,array.length );
                  receivesocket.receive(receivepacket);//接收
                  textArea1.append("\nfrom "+receivepacket.getAddress() +":"+receivepacket.getPort()+" get:");
                 byte data[]=receivepacket.getData() ;
                  String received=new String(data,0);
                  textArea1.append(received);
            }
            catch (IOException se){
                    se.printStackTrace() ;
            }
        }
      }
      
      void button2_actionPerformed(ActionEvent e){//和对方建立连接
      
       String str2 = new String();
        String str3 = new String();
       str2 = textField3.getText();
        str3 = textField4.getText();
            
        if(str2.compareTo("")!=0&&str3.compareTo("")!=0){
        
         portIn = (int) Integer.parseInt(str2);
         portOut = (int) Integer.parseInt(str3);
        
        
         if(online){
         sendsocket.close();
         receivesocket.close();
         textArea1.append("\n formal connection closed");
         }
             
         try {
          textArea1.append("\n building a connection use the port defined...");
            sendsocket=new DatagramSocket(portOut);
               receivesocket=new DatagramSocket(portIn);
               textArea1.append("\n connection builded.");
         }
          catch(SocketException se){
             se.printStackTrace() ;
             System.exit(0);
         }
         online = !(sendsocket.isClosed());
        }
        
        
    else
            textArea1.append("\nplease input ports and IP");
           
        }
      
      void button1_actionPerformed(ActionEvent e) {//发送消息到对方
           
            
            String str=textField2.getText();
            if(online){
             if(str.compareTo("")!=0 ){
            
                
                 try {
                
                                  
                     textArea1.append("\nto "+textField2.getText() +":"+portOut+" say: "+textField1.getText() );
                     String s=textField1.getText() ;
                     byte data[]=new byte[100];
                     s.getBytes(0,s.length() ,data,0);
                     sendpacket=new DatagramPacket(data,s.length() ,InetAddress.getByName(textField2.getText()),portOut);
                     sendsocket.send(sendpacket);
                 }
                 catch(IOException exc){
                    exc.printStackTrace() ;
                 }
            
             }
            
             }
            else textArea1.append("\nplease build a connection first!");
      }
    }
      

  2.   

    用数据流看下吧DataInputStream ,服务器端也是的。public class Client {
    public static void main(String[] args) 
      throws Exception{
    Socket so = new Socket("127.0.0.1",8899);
    DataInputStream dis = new 
    DataInputStream(so.getInputStream());
    DataOutputStream dos = new 
    DataOutputStream(so.getOutputStream());
    Scanner sc = new Scanner(System.in);
    while(true){
      String temp = sc.next();
      dos.writeUTF(temp);
      if("bye".equals(temp)) break;
      System.out.println(dis.readUTF());
    }
    dis.close();dos.close();
    so.close();
    }
    }
      

  3.   

    readLine()方法如果没遇到\n(也就是换行)它会一直阻塞,你的程序没在结尾加上\n。所以一直“卡”在那里了。
      

  4.   

    建议客户端与服务器端都用DataInputStream  DataOutputStream
    直接拿到全部内容,一次性写完输出...下面我只是简单的改了下代码,使得服务器能接收信息从客户端..
    其中肯定是可以运行的.但是会出现些问题还有待LZ去解决,import java.net.*; 
    import java.io.*; class ChatServer 

    public static void main(String[] agrs) 

    ServerSocket ss=null; 
    Socket s=null; 
    InputStream is=null; 
    BufferedReader br1=null; 
    BufferedReader br2=null; 
    OutputStreamWriter osw=null; 
    BufferedWriter bw=null; 
    InputStreamReader is1=null; 
    try 

    ss=new ServerSocket(2222); 
    while(true) 

    System.out.println("Server:"); 
    s=ss.accept(); 
    System.out.println("------------------have a Client has connected!----------------------");

    is=s.getInputStream(); 
    DataInputStream dis = new DataInputStream(s.getInputStream());
    String str = dis.readUTF();
    System.out.println(str);
    dis.close();



    catch(IOException ioe) 

    System.out.println(ioe.getMessage()); 


    } import java.net.*; 
    import java.io.*; class ChatClient 

    public static void main(String[] args) 

    String c; Socket s=null; 
    BufferedReader br1=null; 
    OutputStream os=null; 
    OutputStreamWriter osw=null; 
    BufferedReader br2=null; 
    BufferedWriter br3=null; 
    try 
    { while(true) 

    s=new Socket("127.0.0.1",2222); 
        System.out.print("Client:"); 
        String mess ="text";
        DataOutputStream dos = new DataOutputStream(s.getOutputStream());
        dos.writeUTF(mess);
        dos.flush();
        dos.close();
      } 
      } 
      catch(IOException ioe) 
      { 
      System.out.println(ioe.getMessage()); 
      } 

    }
      

  5.   

    你的客户端写的有问题把 改一下 如下
    System.out.print("Client:");
        br1=new BufferedReader(new InputStreamReader(s.getInputStream());
        c=br1.readLine();
        os=s.getOutputStream();
        osw=new OutputStreamWriter(os);
        br3=new BufferedWriter(osw);
        br3.write(c,0,c.length());
        br3.flush();
        
        System.out.println(br3.readLine()); 这样应该可以了吧