用Socket监听有没有其他Socket请求连接,
如果不用多线程,
一开始监听就堵塞,
整个UI就死了,
只有用多线程才能实现在监听的同时还可以操作UI吧?
具体应该怎么实现呢?

解决方案 »

  1.   

    http://blog.csdn.net/mhapdream/article/details/8929253  Socket:java与C之间的文件传送<1>(C语言之间的通信)
    http://blog.csdn.net/mhapdream/article/details/8929457  Socket:java与C之间的文件传送<2>(JAVA语言之间的通信)
    http://blog.csdn.net/mhapdream/article/details/8929590  Socket:java与C之间的文件传送<3>(JAVA与C通信需要注意的地方)
    http://blog.csdn.net/mhapdream/article/details/8929638  Socket:java与C之间的文件传送<4>(JAVA与C通信)
      

  2.   

    各自用独立的类实现,彼此之间公布接口进行调用。
    socket部分用多线程控制。import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    import java.net.*;
    import java.io.*;
    import java.util.*;
    class ClientSocketListener extends Thread
    {
    private Socket socket;
    private BufferedReader br;
    ServerFrame  serverFrame;
    ClientSocketListener(Socket socket,ServerFrame  serverFrame)
    throws Exception
    {
    this.socket = socket;
    br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    this.serverFrame = serverFrame;
    } public void run()
    {
    String s = null;
    try
    {
    while ( (s = br.readLine())!=null)
    {
    //向其他客户端发送
    //ServerSocketThread.SendMsg(s);
    //显示在Server的界面上
    serverFrame.printServerMsg(s+"\r\n");
    }
    }
    catch (Exception e)
    {
    e.printStackTrace();
    } }}class ServerSocketThread implements Runnable
    {
    ServerSocket serverSocket;
    ServerFrame  serverFrame; static private ArrayList<PrintStream> sClientList = new ArrayList<PrintStream>();
    static private ServerSocketThread serverSocketThread;

    static public ServerSocketThread makeServerSocketThread(ServerFrame serverFrame)
    {
    if (serverSocketThread == null)
    {
    serverSocketThread = new ServerSocketThread(serverFrame);
    } return serverSocketThread;
    } //使用单例模式
    private ServerSocketThread(ServerFrame  serverFrame)
    {
    try
    {
    serverSocket = new ServerSocket(20000);
    this.serverFrame = serverFrame;
    }
    catch (Exception e)
    {
    e.printStackTrace();
    } }
    //服务器逻辑线程接口
    static public void SendMsg(String s)
    {
    for (PrintStream os: sClientList)
    {
    try
    {
    os.println(s);
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    }
    } public void run()
    {
    while (true)
    {
    try
    {
    Socket s = serverSocket.accept();
    OutputStream os = s.getOutputStream();
    PrintStream ps = new PrintStream(os);
    ps.println("你好!你已经成功连接到服务器!");
    if (serverFrame != null)
    {
    serverFrame.printServerMsg("有一个客户端连接到服务器了!"+s+"\r\n");
    }
    sClientList.add(ps);
    new ClientSocketListener(s,serverFrame).start(); //os.close();
    //s.close();
    }
    catch (Exception e)
    {
    e.printStackTrace();
    } }
    }
    }
    //服务器UI部分
    class ServerFrame extends JFrame
    {
    JButton btnMsg = new JButton("发送消息");
    JTextArea txt = new JTextArea(30,30);
    JTextField field = new JTextField(20);
    ServerFrame()
    {
    setTitle("服务器");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    btnMsg.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {
    //JOptionPane.showMessageDialog(null,"显示消息");
    ServerSocketThread.SendMsg(field.getText());

    }

    });
    txt.setText("来自客户端的消息");

    JPanel panel = new JPanel();
    panel.add(field);
    panel.add(btnMsg);
    add(panel,BorderLayout.NORTH);
    add(new JScrollPane(txt),BorderLayout.CENTER);
    pack();
    } //对外抛出打印接口
    public void printServerMsg(String s)
    {
    txt.append(s);
    }
    }
    class ClientSocketThread extends Thread
    {
    private Socket socket = null;
    private ClientFrame clientFrame = null;
    BufferedReader br = null;
    PrintStream ps = null; {
    try
    {
    socket = new Socket("127.0.0.1",20000);
    InputStream is = socket.getInputStream();
    br = new BufferedReader(new InputStreamReader(is));
    ps = new PrintStream(socket.getOutputStream());
    }
    catch (Exception e)
    {
    e.printStackTrace();
    JOptionPane.showMessageDialog(null,"连接服务器失败了!");
    }
    }
    public void run()
    {
    while (true)
    {
    try
    {
    String buf =  null;
    while ((buf = br.readLine())!=null)
    {
    clientFrame.txt.append(buf+"\r\n");
    }
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    }
    } ClientSocketThread(ClientFrame clientFrame)
    {
    this.clientFrame = clientFrame;
    }
    //关闭时调用销毁函数
    public void destory() throws Exception
    {
    br.close();
    socket.close();
    } public void sendMsg(String s)
    {
    ps.println(s);
    }
    }class ClientFrame extends JFrame
    {
    JButton btnSend ;
    JTextArea txt;
    JTextField field;
    ClientSocketThread csocketThread = null;
    ClientFrame()
    {
    setResizable(false);
    setTitle("客户端");
    setBounds(100,100,500,600);
    btnSend = new JButton("发送");
    btnSend.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {
    try
    {
    if (csocketThread != null)
    {
    csocketThread.sendMsg(field.getText());
    }
    }
    catch (Exception ex)
    {
    ex.printStackTrace();
    }
    }

    }); JPanel panel = new JPanel();
    field = new JTextField(30);
    panel.add(field);
    panel.add(btnSend);
    add(panel,BorderLayout.SOUTH);
    txt = new JTextArea(20,20);
    add(new JScrollPane(txt),BorderLayout.CENTER);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    pack();
    } public void printMsg(String s)
    {
    txt.append(s);
    } public void setSoeckt(ClientSocketThread csocketThread)
    {
    this.csocketThread = csocketThread;
    }
    }public class SoketFrame 
    {
    public static void main(String[] args) 
    {
    ServerFrame serverFrame = new ServerFrame();
    ServerSocketThread sthread = 
    ServerSocketThread.makeServerSocketThread(serverFrame);
    new Thread(sthread).start(); ClientFrame clientFrame = new ClientFrame();
    ClientSocketThread cthread = new ClientSocketThread(clientFrame);
    clientFrame.setSoeckt(cthread);
    cthread.start();
    System.out.println("Hello World!");
    }
    }