免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1205 | 回复: 0
打印 上一主题 下一主题

Java Socket简单应用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-24 09:24 |只看该作者 |倒序浏览
Server.java
  1. package chat.ui;

  2. import java.awt.Dimension;
  3. import java.awt.event.WindowAdapter;
  4. import java.awt.event.WindowEvent;
  5. import java.io.DataInputStream;
  6. import java.io.DataOutputStream;
  7. import java.io.IOException;
  8. import java.net.ServerSocket;
  9. import java.net.Socket;
  10. import java.util.ArrayList;
  11. import java.util.Date;
  12. import java.util.List;
  13. import java.util.concurrent.ExecutorService;
  14. import java.util.concurrent.Executors;

  15. import javax.swing.JFrame;
  16. import javax.swing.JScrollPane;
  17. import javax.swing.JTextArea;

  18. @SuppressWarnings("serial")
  19. public class Server extends JFrame {

  20.     private JScrollPane pane;
  21.     private JTextArea textAreaShow;
  22.     private ServerSocket serverSocket;
  23.     private List<Socket> connectedSockets = new ArrayList<Socket>();

  24.     public Server() {
  25.         initFrame();
  26.         int port = 8888;
  27.         try {
  28.             startServer(port);
  29.         } catch (IOException e) {
  30.             String text = "以端口号" + port + "启动Socket服务失败,检查端口是否被占用,并重新启动服务";
  31.             textAreaShow.append(text);
  32.         }
  33.     }

  34.     // 窗口初始化
  35.     private void initFrame() {

  36.         setTitle("服务端");
  37.         setSize(500, 400);
  38.         setMinimumSize(new Dimension(250, 200));

  39.         setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
  40.         addWindowListener(new WindowAdapter() {
  41.             @Override
  42.             public void windowClosing(WindowEvent event) {
  43.                 if (serverSocket != null) {
  44.                     try {
  45.                         serverSocket.close();
  46.                     } catch (IOException e) {
  47.                         e.printStackTrace();
  48.                         System.exit(1);
  49.                     }
  50.                     System.exit(0);
  51.                 }
  52.             }
  53.         });

  54.         // 重写JTextArea的append方法
  55.         textAreaShow = new JTextArea() {
  56.             @Override
  57.             public void append(String str) {
  58.                 str = (new Date().toString()) + "  " + str + "\n";
  59.                 super.append(str);
  60.             }
  61.         };
  62.         textAreaShow.setEditable(false);
  63.         textAreaShow.setLineWrap(true);
  64.         textAreaShow.setWrapStyleWord(true);

  65.         pane = new JScrollPane(textAreaShow,
  66.                 JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
  67.                 JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

  68.         add(pane);

  69.         setVisible(true);
  70.     }

  71.     // 启动服务,等待客户端连接
  72.     private void startServer(int port) throws IOException {
  73.         ExecutorService executorService = Executors.newCachedThreadPool();
  74.         serverSocket = new ServerSocket(port);
  75.         Socket socket;
  76.         textAreaShow.append("服务已启动,端口号" + port);
  77.         while (true) {
  78.             socket = serverSocket.accept();
  79.             String connectedMsg = "端口号" + socket.getPort() + " 已连接";
  80.             textAreaShow.append(connectedMsg);
  81.             dispatchMessage(connectedMsg);
  82.             connectedSockets.add(socket);
  83.             executorService.execute(new ServerThread(socket));
  84.         }
  85.     }

  86.     // 向各客个连接转发发送消息
  87.     private void dispatchMessage(String str) {
  88.         DataOutputStream dos;
  89.         for (Socket soc : connectedSockets) {
  90.             try {
  91.                 dos = new DataOutputStream(soc.getOutputStream());
  92.                 dos.writeUTF(str);
  93.             } catch (IOException e) {
  94.                 e.printStackTrace();
  95.             }
  96.         }
  97.     }

  98.     // 处理各连接的线程
  99.     private class ServerThread implements Runnable {

  100.         private Socket socket;
  101.         private DataInputStream in;

  102.         public ServerThread(Socket socket) {
  103.             this.socket = socket;
  104.             try {
  105.                 in = new DataInputStream(socket.getInputStream());
  106.             } catch (IOException e) {
  107.                 textAreaShow.append(e.getMessage());
  108.             }
  109.         }

  110.         @Override
  111.         public void run() {
  112.             try {
  113.                 String str;
  114.                 while ((str = in.readUTF()) != null) {
  115.                     str = socket.getPort() + "说:" + str;
  116.                     textAreaShow.append(str);
  117.                     dispatchMessage(str);
  118.                 }
  119.             } catch (IOException e) {
  120.                 textAreaShow.append("Port " + socket.getPort() + " 已断开连接");
  121.                 connectedSockets.remove(socket);
  122.                 closeSocket();
  123.             }
  124.         }

  125.         private void closeSocket() {
  126.             if (in != null) {
  127.                 try {
  128.                     in.close();
  129.                 } catch (IOException e) {
  130.                     e.printStackTrace();
  131.                 }
  132.             }
  133.             if (socket != null) {
  134.                 try {
  135.                     socket.close();
  136.                 } catch (IOException e) {
  137.                     e.printStackTrace();
  138.                 }
  139.             }
  140.         }
  141.     }

  142.     public static void main(String[] args) {
  143.         new Server();
  144.     }
  145. }
复制代码
Client.java
  1. package chat.ui;

  2. import java.awt.BorderLayout;
  3. import java.awt.Dimension;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.WindowAdapter;
  7. import java.awt.event.WindowEvent;
  8. import java.io.DataInputStream;
  9. import java.io.DataOutputStream;
  10. import java.io.IOException;
  11. import java.net.Socket;
  12. import java.util.Date;

  13. import javax.swing.JButton;
  14. import javax.swing.JFrame;
  15. import javax.swing.JPanel;
  16. import javax.swing.JScrollPane;
  17. import javax.swing.JTextArea;
  18. import javax.swing.JTextField;

  19. @SuppressWarnings("serial")
  20. public class Client extends JFrame {

  21.     private JTextArea textAreaShow;
  22.     private JTextField textFieldInput;
  23.     private JButton buttonSend;
  24.     private JScrollPane paneTop;
  25.     private JPanel paneBottom;
  26.     private Socket socket;
  27.     private DataInputStream in;
  28.     private DataOutputStream out;
  29.     private String str;
  30.     SendActionListener sendActionListener;

  31.     public Client() {
  32.         initFrame();
  33.         connect();
  34.     }

  35.     private void initFrame() {

  36.         setTitle("客户端");
  37.         setSize(500, 400);
  38.         setMinimumSize(new Dimension(250, 200));
  39.         setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
  40.         addWindowListener(new WindowExitListener());

  41.         // 重写append方法,在前面加上日期和在末尾加上换行
  42.         textAreaShow = new JTextArea() {
  43.             @Override
  44.             public void append(String str) {
  45.                 str = new Date().toString() + "   " + str + "\n";
  46.                 super.append(str);
  47.             }
  48.         };
  49.         textAreaShow.setEditable(false);
  50.         textAreaShow.setLineWrap(true);
  51.         textAreaShow.setWrapStyleWord(true);

  52.         SendActionListener sendActionListener = new SendActionListener();
  53.         textFieldInput = new JTextField();
  54.         textFieldInput.addActionListener(sendActionListener);
  55.         buttonSend = new JButton("发送");
  56.         buttonSend.addActionListener(new SendActionListener());

  57.         paneTop = new JScrollPane(textAreaShow,
  58.                 JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
  59.                 JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

  60.         paneBottom = new JPanel(new BorderLayout());
  61.         paneBottom.add(textFieldInput, BorderLayout.CENTER);
  62.         paneBottom.add(buttonSend, BorderLayout.EAST);

  63.         add(paneTop, BorderLayout.CENTER);
  64.         add(paneBottom, BorderLayout.SOUTH);

  65.         setVisible(true);
  66.     }

  67.     // 连接到服务,并得到输入输出流
  68.     private void connect() {
  69.         int port = 8888;
  70.         try {
  71.             socket = new Socket("localhost", port);
  72.             textAreaShow.append("连接到服务,本地端口号" + socket.getLocalPort());
  73.             setTitle("客户端" + socket.getLocalPort());
  74.             in = new DataInputStream(socket.getInputStream());
  75.             out = new DataOutputStream(socket.getOutputStream());

  76.             String message;
  77.             while ((message = in.readUTF()) != null) {
  78.                 textAreaShow.append(message);
  79.             }
  80.         } catch (IOException e) {
  81.             textAreaShow.append("连接异常");
  82.             close();
  83.         }
  84.     }

  85.     // 释放资源
  86.     private int close() {
  87.         int exitCode = 0;
  88.         if (out != null) {
  89.             try {
  90.                 out.close();
  91.             } catch (IOException e) {
  92.                 e.printStackTrace();
  93.                 exitCode = 1;
  94.             }
  95.         }
  96.         if (in != null) {
  97.             try {
  98.                 in.close();
  99.             } catch (IOException e) {
  100.                 e.printStackTrace();
  101.                 exitCode = 1;
  102.             }

  103.         }
  104.         if (socket != null) {
  105.             try {
  106.                 socket.close();
  107.             } catch (IOException e) {
  108.                 exitCode = 1;
  109.                 e.printStackTrace();
  110.             }
  111.         }
  112.         return exitCode;
  113.     }

  114.     // 响应关闭操作
  115.     private class WindowExitListener extends WindowAdapter {
  116.         @Override
  117.         public void windowClosing(WindowEvent event) {
  118.             System.exit(close());
  119.         }
  120.     }

  121.     // 响应发送操作
  122.     private class SendActionListener implements ActionListener {

  123.         @Override
  124.         public void actionPerformed(ActionEvent event) {
  125.             str = textFieldInput.getText();
  126.             try {
  127.                 out.writeUTF(str);
  128.                 textFieldInput.setText("");
  129.             } catch (IOException e) {
  130.                 e.printStackTrace();
  131.             }
  132.         }

  133.     }

  134.     public static void main(String[] args) {
  135.         new Client();
  136.     }

  137. }
复制代码
捕获.PNG   


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP