http://dev.csdn.net/develop/article/25/25074.shtm

解决方案 »

  1.   

    真的假的,我晚上给你写一个Echo!
      

  2.   

    //ServeOneSocket.java 服务端源程序import java.io.*;
    import java.net.*;public class ServeOneSocket extends Thread { private Socket socket;
     private BufferedReader in;
     private PrintWriter out;
     private String content;  /**
       * Constructor
       */
      public ServeOneSocket(Socket s,String c)throws IOException {
          socket=s;
          content=c;
          in=new BufferedReader(
              new InputStreamReader(
                socket.getInputStream()));
          //enable auto-flush
          out=new PrintWriter(
               new BufferedWriter(
                 new OutputStreamWriter(
                  socket.getOutputStream())),true);
          start();//calls run()
      }  public void run(){
          try{
           while (true){
             String str=in.readLine();
             if (str.equals("END"))break;
             System.out.println("Echoing:"+str);
             out.println(str);
             out.println(content);
           }
           System.out.println("Closing...");
          }catch(IOException e){
          }finally{
            try{
              socket.close();
              }catch(IOException e){}
          }
      }
    }//SocketClientThread.java 客户端源程序import java.net.*;
    import java.io.*;class SocketClientThread extends Thread{
      private Socket socket;
      private BufferedReader in;
      private PrintWriter out;
      private static int counter=0;
      private int id=counter++;
      private static int threadcount=0;
      final int port=8110;  public static int threadCount(){
        return threadcount;
      }  public SocketClientThread(InetAddress addr){
        System.out.println("Making client:"+id);
        threadcount++;
        try{
          socket=new Socket(addr,port);
        }catch(IOException e){
        }
        try{
           in=new BufferedReader(
                new InputStreamReader(
                  socket.getInputStream()));
           out=new PrintWriter(
              new BufferedWriter(
                new OutputStreamWriter(
                   socket.getOutputStream())),true);
           start();
        }catch(IOException e){
           try{
             socket.close();
           }catch(IOException e2){}
        }
      }  public void run(){
        try{
          for (int i=0;i<25;i++){
            out.println("Client:"+id+":"+i);
            String str=in.readLine();
            System.out.println(str);
          }
          out.println("END");
        }catch(IOException e){
        }finally{
           try{
             socket.close();
           }catch(IOException e){}
         threadcount--;
        }
       }
    }public class MultiSocketClient {
       static final int MAX_THREADS=10;
      /**
       * main
       * @param args
       */
      public static void main(String[] args)throws IOException,InterruptedException {
         InetAddress addr=InetAddress.getByName(null);
         while (true){
            if (SocketClientThread.threadCount()<MAX_THREADS)
              new SocketClientThread(addr);
            Thread.currentThread().sleep(100);
          }
      }
    }
     
     
      

  3.   

    Client.java
    /*
     * Created on 2004/10/14
     *
     * TODO To change the template for this generated file go to
     * Window - Preferences - Java - Code Style - Code Templates
     */
    package chatserver.easychat;import java.awt.Button;
    import java.awt.Color;
    import java.awt.Frame;
    import java.awt.GridLayout;
    import java.awt.Label;
    import java.awt.Panel;
    import java.awt.TextArea;
    import java.awt.TextField;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;/**
     * @author guest1
     *
     * TODO To change the template for this generated type comment go to
     * Window - Preferences - Java - Code Style - Code Templates
     */
    public class Client extends Frame implements ActionListener,Runnable{
    private TextField tf1,tf2;
    private Label la1,la2;
    private TextArea ta1,ta2;
    private Socket s;
    private Button b,l;
    private BufferedReader br = null;
    private PrintWriter pw = null;

    public static void main(String args[]){
    new Client();
    }

    public Client(){
    setLayout(new GridLayout(6,1));
    Panel panel = new Panel();
    tf1 = new TextField(20);
    tf2 = new TextField(10);
    la1 = new Label("IP:");
    la2 = new Label("port:");
    Button l = new Button("connect");
    l.setBackground(Color.GRAY);
    panel.add(tf1);
    panel.add(la1);
    panel.add(tf2);
    panel.add(la2);
    panel.add(l);
    add(panel);
    ta1 = new TextArea(500,300);
    add(new Label("messages"));
    add(ta1);

    add(new Label("input"));
    ta2 = new TextArea(30,300);
    add(ta2);
    Panel p2 = new Panel();
    b = new Button("send");
    b.setBackground(Color.YELLOW);
    p2.add(b);
    add(p2);
    setTitle("Client");
    setSize(300,450);
    setResizable(false);
    setVisible(true);
    l.addActionListener(this);
    addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent exit){
    System.exit(0);
    }
    });
    Thread ThreadReader = new Thread(this);
    ThreadReader.start();
    b.addActionListener(this);
    }

    public void run(){
    while(true){
    try{
    ta1.append("\n#_______________________#\n"+br.readLine());
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    }

    public void actionPerformed(ActionEvent e){
    String command = e.getActionCommand();
    if("send".equals(command)){
    if(ta2.getText().trim()!=null){
    ta1.append("\n message from Client:\n"+ta2.getText());
                    pw.println(ta2.getText()+"\n");
    }else if(ta2.getText().trim()==null){
    ta1.append("\n please input your IP and \n"+"message can't be null");
    ta2.setText("");
    }
    }else if("connect".equals(command)){
    try{
    s = new Socket(tf1.getText().toString(),Integer.parseInt(tf2.getText().trim()));
    br = new BufferedReader(new InputStreamReader(s.getInputStream()));
    pw = new PrintWriter(s.getOutputStream(),true);
    }catch(Exception ex){
    ex.printStackTrace();
    }
    }
    }
    }
      

  4.   

    Server.java
    /*
     * Created on 2004/10/14
     *
     * TODO To change the template for this generated file go to
     * Window - Preferences - Java - Code Style - Code Templates
     */
    package chatserver.easychat;import java.io.*;
    import java.net.*;
    import java.awt.*;
    import java.awt.event.*;/**
     * @author guest1
     *
     * TODO To change the template for this generated type comment go to
     * Window - Preferences - Java - Code Style - Code Templates
     */
    public class Server{
    public static void main(String args[]){
    ServerService MyServer = new ServerService(8000,10);
    }
    }
      

  5.   

    ServerService.java
    /*
     * Created on 2004/10/14
     *
     * TODO To change the template for this generated file go to
     * Window - Preferences - Java - Code Style - Code Templates
     */
    package chatserver.easychat;import java.io.*;
    import java.net.*;
    import java.awt.event.*;
    import java.awt.*;/**
     * @author guest1
     *
     * TODO To change the template for this generated type comment go to
     * Window - Preferences - Java - Code Style - Code Templates
     */
    public class ServerService extends Frame{
    ServerSocket Listener;
    TextArea ListenerMeg;
    ServiceThread MyST;
    public ServerService(int port,int Count){
    try{
    Listener = new ServerSocket(port,Count);
    setTitle("Listen for Server");
    this.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
    ((Frame)e.getWindow()).dispose();
    System.exit(0);
    }
    });
    setLayout(new BorderLayout());
    ListenerMeg=new TextArea("listener is run\n",10,50);
    add("Center",ListenerMeg);
    setResizable(false);
    pack();

    show();
    while(true){
    Socket connected = Listener.accept();
    InetAddress ClientAdress = connected.getInetAddress();
    ListenerMeg.append("\n Client conntectd from :"+ClientAdress);
    MyST = new ServiceThread(this,connected);
    MyST.ConnectedThread.start();
    }
    }catch(Exception e){
    e.printStackTrace();
    }
    }

    public void addMeg(String s){
    ListenerMeg.append(s);
    }
    }
      

  6.   

    感谢  jerrykey(钥匙) ,但缺少了 ServiceThread 类的代码。多谢其它几位同仁的帮助,本人绝不食言,明天结帖,到时请注意领分。各位高人,还有什么好的Socket代码请贴出来,大家一起参照,一起学习。
      

  7.   

    以前用JBuilder做了一个,拿上来看看,也不知道是否符合要求,没整理,全部copy上来了.
      

  8.   

    客户端代码:package client;import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import com.borland.jbcl.layout.*;
    import java.io.*;
    import java.net.*;
    /**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2004</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */public class ClientFrame extends JFrame {
      JPanel contentPane;
      XYLayout xYLayout1 = new XYLayout();
      Label label1 = new Label();
      TextField textField1 = new TextField();
      Button button1 = new Button();
      TextArea textArea1 = new TextArea();
      Label label2 = new Label();
      TextField textField2 = new TextField();
      Button button2 = new Button();
      Socket client;
      InputStream input;                     //socket输入流
      OutputStream output;                   //   socket输出流
      //Construct the frame
      public ClientFrame() {
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
        try {
          jbInit();
        }
        catch(Exception e) {
          e.printStackTrace();
        }
      }
      //Component initialization
      //----------------界面处理部分-----------------------------//
      private void jbInit() throws Exception  {
        contentPane = (JPanel) this.getContentPane();
        label1.setFont(new java.awt.Font("Dialog", 0, 14));
        label1.setText("发送消息");
        contentPane.setLayout(xYLayout1);
        this.setSize(new Dimension(400, 340));
        this.setTitle("Client");
        textField1.setText("");
        button1.setLabel("发送");
        button1.addActionListener(new ClientFrame_button1_actionAdapter(this));
        label2.setText("服务器");
        label2.setFont(new java.awt.Font("Dialog", 0, 14));
        textField2.setText("");
        button2.setLabel("连接");
        button2.addActionListener(new ClientFrame_button2_actionAdapter(this));
        textArea1.setText("");
        contentPane.add(textField1,   new XYConstraints(78, 10, 158, 25));
        contentPane.add(button1,  new XYConstraints(255, 11, 67, -1));
        contentPane.add(textArea1,     new XYConstraints(26, 47, 338, 194));
        contentPane.add(label2,    new XYConstraints(25, 260, -1, -1));
        contentPane.add(textField2,  new XYConstraints(79, 261, 167, 25));
        contentPane.add(button2,  new XYConstraints(266, 259, 67, -1));
        contentPane.add(label1,  new XYConstraints(9, 12, -1, -1));
      }
      //Overridden so we can exit when window is closed
      protected void processWindowEvent(WindowEvent e) {
        super.processWindowEvent(e);
        if (e.getID() == WindowEvent.WINDOW_CLOSING) {
          System.exit(0);
        }
      }
    /*----开启客户端,连接服务器,发送自己的IP信息,
                  接收服务器的返回信息
       */
      public void runClient(){
        try{
          client = new Socket(InetAddress.getByName(textField2.getText()),5000);
          output = client.getOutputStream();//没有此行代码,消息不能发送出去
          Thread t = new Thread(){
            public void run() {
              String inStr = new String();
              char c;
              try {
                while(true){
                inStr = ""; //解决输入信息累加问题
                input = client.getInputStream();
                while ((c = (char) input.read()) != '\n')
                  inStr = inStr + String.valueOf(c);
                  inStr += "\n"; //去掉不能实现广播和换行
                textArea1.append(inStr);}
              }catch (IOException ex) {}
            }
          };
            t.start();
        }catch(Exception e){}  }  void button2_actionPerformed(ActionEvent e) {
        String s = new String();
          if(button2.getLabel() == "连接"){
              runClient();            //开启客户端,连接服务器
              button2.setLabel("停止");
              button1.enable(true);
          }
          else{
            button2.setLabel("连接");
          try{
            output = client.getOutputStream();
            s = "goodbye\n";
            textArea1.append(s);
            for (int i = 0;i<s.length();i++)
              output.write((int)s.charAt(i));
              client.close();
              button1.enable(false);
              System.exit(0);
          }catch(Exception ex){}
          }
          }/*-------------------------发送按钮处理函数,请实现发送的功能-----------
       注意:服务器端的动作是:接到的只要不是"goodbye",就把该消息立即发给客户端
       */
      void button1_actionPerformed(ActionEvent e) {
         String str = new String();
           try{
          str = textField1.getText() + "\n";
         for (int i = 0;i<str.length();i++)
           output.write((int)str.charAt(i));
          //textArea1.append(str);  //此行代码会在发送消息的客户端显示输入的消息
          str = "";
           }catch(Exception ec){}  }}
    class ClientFrame_button2_actionAdapter implements java.awt.event.ActionListener {
      ClientFrame adaptee;  ClientFrame_button2_actionAdapter(ClientFrame adaptee) {
        this.adaptee = adaptee;
      }
      public void actionPerformed(ActionEvent e) {
        adaptee.button2_actionPerformed(e);
      }
    }class ClientFrame_button1_actionAdapter implements java.awt.event.ActionListener {
      ClientFrame adaptee;  ClientFrame_button1_actionAdapter(ClientFrame adaptee) {
        this.adaptee = adaptee;
      }
      public void actionPerformed(ActionEvent e) {
        adaptee.button1_actionPerformed(e);
      }
    }
      

  9.   

    服务端:package server;import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import com.borland.jbcl.layout.*;
    import java.io.*;
    import java.net.*;
    import java.util.Vector;
    /**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2004</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */public class ServrFrame extends JFrame {
      JPanel contentPane;
      XYLayout xYLayout1 = new XYLayout();
      Label label1 = new Label();
      List list1 = new List();
      Button button1 = new Button();
      TextArea textArea1 = new TextArea();
      ServrFrame sf;
      ServerSocket server;
      Socket connection;    //连接后的socket对象
      OutputStream output;  //输出流
      InputStream input;    //输入流
      Vector v = new Vector();  //Construct the frame
      public ServrFrame() {
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
        try {
          jbInit();
        }
        catch(Exception e) {
          e.printStackTrace();
        }
      }
      //Component initialization
      private void jbInit() throws Exception  {
        contentPane = (JPanel) this.getContentPane();
        label1.setFont(new java.awt.Font("Dialog", 0, 14));
        label1.setText("客户端");
        contentPane.setLayout(xYLayout1);
        this.setSize(new Dimension(400, 324));
        this.setTitle("ServerFrame");
        button1.setLabel("运行服务器");
        button1.addActionListener(new ServrFrame_button1_actionAdapter(this));
        contentPane.add(label1, new XYConstraints(17, 9, 45, 26));
        contentPane.add(list1,      new XYConstraints(19, 37, 153, 249));
        contentPane.add(button1,   new XYConstraints(230, 8, 94, 23));
        contentPane.add(textArea1,   new XYConstraints(201, 37, 170, 249));
      }
      //Overridden so we can exit when window is closed
      protected void processWindowEvent(WindowEvent e) {
        super.processWindowEvent(e);
        if (e.getID() == WindowEvent.WINDOW_CLOSING) {
          System.exit(0);
        }
      }
      //此函数完成开启服务的功能
         public void runServer(){
            sf = this;
           Thread t = new Thread(){
             public void run(){
               try{
                 server = new ServerSocket(5000,100);
                 while(true){
                   connection = server.accept();
                   ServerThread s = new ServerThread(connection,sf);
                   v.add(s);
                   s.start();
                 }
               }catch(Exception e){}
             }
           };
           t.start();   }// ----------启动/停止服务器的处理函数--------------------//
      void button1_actionPerformed(ActionEvent e) {
         if(button1.getLabel().compareTo("运行服务器")==0){
           button1.setLabel("停止服务器");
           runServer();
         }
         else
           System.exit(0);
      }
    }class ServrFrame_button1_actionAdapter implements java.awt.event.ActionListener {
      ServrFrame adaptee;  ServrFrame_button1_actionAdapter(ServrFrame adaptee) {
        this.adaptee = adaptee;
      }
      public void actionPerformed(ActionEvent e) {
        adaptee.button1_actionPerformed(e);
      }
    }
      

  10.   

    在 Server端建个ServerThreadpackage server;
    import java.io.*;
    import java.net.*;
    /**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2004</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */public class  ServerThread extends Thread{
      Socket connection;
      InputStream input;
      OutputStream output;
      ServrFrame sf;
    public ServerThread(Socket so, ServrFrame s) {
      connection = so;
      sf = s;
      try {
        input = connection.getInputStream();
        output = connection.getOutputStream();
        sf.list1.add(connection.getInetAddress().toString() + ":" +
                     connection.getPort());
      }catch (IOException ioe) {}
    }public void run() {
      String str = new String();
      while (true) {
        try {
         str= "";
          char c;
          while ( (c = (char) input.read()) != '\n')//出错原因所在,多加了个;,不能广播
          str = str + String.valueOf(c);
          str += "\n";
          sf.textArea1.append("From Client " + connection.getPort() + ":");
          sf.textArea1.append(str);
          //str = "";  //此行代码应该注释掉,服务器收到消息不会发给另外的客户机
          if (str.compareTo("goodbye" + "\n") == 0) {
            sf.textArea1.append(connection.getInetAddress().toString() + "断开\n");
            sf.list1.remove(connection.getInetAddress().toString() + ":" +
                            connection.getPort());
            sf.v.remove(this);
            connection.close();
            break;
          }
          for (int i=0;i<sf.v.size();i++){
            ServerThread st = (ServerThread)sf.v.elementAt(i);
            st.sendMsg(connection.getInetAddress() + ":" + connection.getPort() + ":" + str);
    }
        }catch (IOException e) {}
      }
    }public void sendMsg(String outstr) {
      try {
        output = connection.getOutputStream();
        for (int i = 0; i < outstr.length(); i++)
          output.write( (int) outstr.charAt(i));
        //outstr = "";
      }catch (IOException e) {}
    }
    }