回 帖 发 新 帖 刷新版面

主题:初学者的一个很急的问题 帮帮忙哈~~

这个聊天室还没做完  只做了一部分遇到问题然后就做不下去了 我是个初学者  希望各位高手指教!!!!挺着急 ~   问题是:如果只运行一个客户端的话可以将输入的数据传到服务端并打印出来 但是我开两个客户端就传不过去了   找不到原因在那~~帮帮我哈!!!!
客户端:
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
class ChatClient extends Frame implements ActionListener 
{
         Panel panel=new Panel();
         Label lb=new Label("您的称呼:");
         TextField tf1,tf2;
         TextArea ta=new TextArea();
         Button bt=new Button("点击连接");
         Socket s=null;
         DataOutputStream dos=null;
    public void mod()
    {
         tf1=new TextField();
         tf2=new TextField(8);
         add(panel,BorderLayout.NORTH);
         add(ta,BorderLayout.CENTER);
         add(tf1,BorderLayout.SOUTH);
         panel.setLayout(new FlowLayout(12));
         panel.add(lb);
         panel.add(tf2);
         panel.add(bt);
         pack();
         setSize(300,400);
         setVisible(true);
         bt.addActionListener(new lianjie());
         addWindowListener(new WindowAdapter()
        {
              public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
        tf1.addActionListener(this);
        //connect();
    }
    public void connect()
    {
        try
        {
            if (s==null)//如果SOCKET还没有连接的话则连接
            {
                s=new Socket("localhost",8888);
                System.out.println("a client is connected");
            }
        }
        catch (Exception e)
        {
        }/*finally
        {
            try
            {
                s.close();
            }
            catch (Exception e)
            {
            }
        }*/
    }
    public void actionPerformed(ActionEvent e)
        {
            String str;
            str=tf1.getText();
            ta.setText(ta.getText()+tf2.getText()+":"+str+"\n");
            tf1.setText("");
            try
            {
                dos=new DataOutputStream(s.getOutputStream());
                dos.writeUTF(tf2.getText()+":"+str);
                dos.flush();
            }
            catch (Exception ee)
            {
            }
        }
    public static void main(String args[])
    {
         new ChatClient().mod();
    }
    class lianjie implements ActionListener
    {
         public void actionPerformed(ActionEvent e)
        {
            connect();
        }
    }
}
服务器端:
import java.net.*;
import java.io.*;
class ChatServer
{
        ServerSocket ss=null;
        DataInputStream dis=null;
        String str=null;
   public static void main(String args[])
   {
      new ChatServer().resv();
   }
   public void resv()
    {
           Socket s=null;
           try
       {
          ss=new ServerSocket(8888);
          while(true)
           {
               s=ss.accept();
               System.out.println("connected");
               ClientNo c=new ClientNo(s);
               new Thread(c).start();
           }
          
       }
       catch (IOException e)
       {

       }/*finally
       {
          try
          {
            ss.close();
            s.close();
          }
          catch (Exception e)
          {
          }
       }*/
    }
   class ClientNo implements Runnable
   {
       private Socket s=null;
       public ClientNo(Socket s)
       {
           this.s=s;
           try
           {
            dis=new DataInputStream(s.getInputStream());
           }
           catch (Exception e)
           {
           }
       }
       public void run()
       {
           String str1=null;
          try
          {
          while(true)
           {
              str1=dis.readUTF(); 
              System.out.println(str1);
           }
          }
          catch (Exception e)
          {
          }
       }
   }
}

回复列表 (共6个回复)

沙发

能不能帮我看看啊  就当是帮忙了~

板凳

dis不应该是ChatServer的变量
而应该是每个连接者的变量
不然,每个连接进来的线程都用同一个dis
这样当然会出问题


import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ChatServer {
    ServerSocket ss = null;

    //DataInputStream dis = null;  //全局变量改为局部变量

    String str = null;

    public static void main(String args[]) {
        System.out.println("Server running ...");
        new ChatServer().resv();
    }

    public void resv() {
        Socket s = null;
        try {
            ss = new ServerSocket(8888);
            while (true) {
                s = ss.accept();
                System.out.println(s.getInputStream() + "connected");
                ClientNo c = new ClientNo(s);
                new Thread(c).start();
            }

        } catch (IOException e) {

        }/*finally
         {
         try
         {
         ss.close();
         s.close();
         }
         catch (Exception e)
         {
         }
         }*/
    }

    class ClientNo implements Runnable {
        private Socket s = null;
        
        //------------------------
        
        DataInputStream dis = null;
        
        //-----------------------

        public ClientNo(Socket s) {
            this.s = s;
            try {
                
                dis = new DataInputStream(s.getInputStream());
            } catch (Exception e) {
            }
        }

        public void run() {
            String str1 = null;
            try {
                while (true) {
                    str1 = dis.readUTF();
                    System.out.println(str1);
                }
            } catch (Exception e) {
            }
        }
    }
}

3 楼

没写过C/S程序,以下是疑问:
ChatServer只持有一个Socket,始终保持最后连接的客户的套接字
服务程序无法知道总共连接了几个客户

服务端只有InputStream,而客户端只有OutputSteam,单向通信?

4 楼

同时,同步是否存在问题
譬如当第一个客户连接之后,服务器端执行到new ClientNo的时候(这需要一定的时间)
另一个客户连接,此时ss.accept()并不在执行中。服务器似乎是不会反应的。。

5 楼

[quote]没写过C/S程序,以下是疑问:
ChatServer只持有一个Socket,始终保持最后连接的客户的套接字
服务程序无法知道总共连接了几个客户

服务端只有InputStream,而客户端只有OutputSteam,单向通信?
[/quote]
不防  自己尝试写个 程序  测试下
也可顺便  增加 理解

6 楼

sjhlovejava  谢谢你  问题解决了  一看您的回答我就明白了 真晕  
这么明显的问题我都没发现  真垃圾 呵呵 再次感谢!!!!!
3楼的朋友  我解释下  我这程序还没写完 在实现从客户端写入服务器的时候出问题没解决所以没往下走
现在可以实现信息交互了 如果再遇到问题再问你们哈~~呵呵~~~

我来回复

您尚未登录,请登录后再回复。点此登录或注册