java socket服务端只能连接一个客户端,怎么才能连过个客户端呢,代码如下,请指点
import java.awt.Color; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Socket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextArea; import javax.swing.WindowConstants; public class ServerSocket extends JFrame { /** * */ private static final long serialVersionUID = 1L; public static void main(String[] args) { new ServerSocket().createJFrame("宜诺腕表服务器程序"); } private static JLabel jlCurrNumber;// 连接的具体数目 private static JLabel jlSumNumber;// 总连接个数 private static JTextArea jArea;//用于显示接收的数据 private static int sumNumber = 0;// 连接总数 private static int currNumber = 0;// 当前链接数 /** * 创建窗体和相关控件 * * @param title * 窗体标题 */ public static void createJFrame(String title) { JFrame jFrame = new JFrame(title); Container container = jFrame.getContentPane(); container.setLayout(null); // 添加监听按钮 JButton jButton = new JButton("开始监听"); jButton.setBounds(10, 10, 100, 30); jButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub jButton.setEnabled(false); jButton.setText("正在监听。。。"); createThread(); } }); jButton.setFocusPainted(false); // 去掉文字周围的边框 // 添加文本标签 JLabel jlSumTitle = new JLabel("总连接数:"); jlSumTitle.setBounds(10, 50, 80, 30); container.add(jlSumTitle); // 总连接个数 jlSumNumber = new JLabel("0"); jlSumNumber.setBounds(90, 50, 20, 30); container.add(jlSumNumber); // 当前连接数目标题 JLabel jlCurrentTitle = new JLabel("当前连接数:"); jlCurrentTitle.setBounds(140, 50, 80, 30); container.add(jlCurrentTitle); // 连接的具体数目 jlCurrNumber = new JLabel("0"); jlCurrNumber.setBounds(220, 50, 20, 30); container.add(jlCurrNumber); jArea = new JTextArea(); jArea.setBounds(10, 100, 460, 250); jArea.setLineWrap(true);//激活自动换行功能 //jArea.setWrapStyleWord(true);//激活断行不断字功能 jArea.setBackground(Color.LIGHT_GRAY); container.add(jArea); container.add(jButton); container.setBackground(Color.white); jFrame.setBackground(Color.white); jFrame.setVisible(true); jFrame.setSize(500, 400); jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } private static java.net.ServerSocket server; // 服务端socket private static Socket socket;// 客户端socket private static BufferedReader reader; /** * 创建线程来监听客户端连接 */ private static void createThread() { Thread thread = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { server = new java.net.ServerSocket(2000); System.out.println("服务器套接字已经创建成功!"); while (true) { System.out.println("等待客户端的连接!"); socket = server.accept(); // 接收客户端连接 //reader = new BufferedReader(new InputStreamReader(getSocket().getInputStream())); System.out.println("客户端:" + socket.getRemoteSocketAddress()); sumNumber++; currNumber++; jlSumNumber.setText(String.valueOf(sumNumber)); jlCurrNumber.setText(String.valueOf(currNumber)); getClientMessage(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); thread.start(); } /** * 接收客户端信息 */ private static void getClientMessage() { try { String str = null; System.out.println("接收客户端信息!"); //(str = reader.readLine()) != null while (true) { InputStream in = socket.getInputStream(); byte[] buffer = new byte[in.available()]; if (buffer.length > 0) { //System.out.println("长度=" + in.available()); in.read(buffer); String message = new String(buffer, "UTF-8"); System.out.println(message); jArea.append(message + "\n"); } } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } try { if (reader != null) { reader.close(); } if (socket != null) { currNumber--; socket.close(); } } catch (IOException e) { // TODO: handle exception e.printStackTrace(); } } public static JTextArea getjArea() { return jArea; } public static JLabel getjlCurrNumber() { return jlCurrNumber; } public static JLabel getJlSumNumber() { return jlSumNumber; } public static Socket getSocket() { return socket; } public static void setSocket(Socket socket) { ServerSocket.socket = socket; } }
private static Socket socket;// 客户端socket
改成
private static List<Socket> sockets;// 客户端socket
socket = server.accept(); // 接收客户端连接
改成:
Socket socket = server.accept(); // 接收客户端连接
sockets.Add(socket);
while (true) {
InputStream in = socket.getInputStream();
改成:
while (true) {
foreach(Socket socket in sockets)
InputStream in = socket.getInputStream();