项目一:udp1111

监听的有三个文件分别为:

guiHello.java 有关界面和事件响应功能

UdpFunc.java是udp类的封装:发送和接收

udpServer.java是入口函数,无实际意义

代码:

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.*;
  4. import java.util.Scanner;
  5.  
  6. import javax.swing.*;
  7. import javax.swing.border.Border;
  8. import javax.swing.border.LineBorder;
  9. ////
  10.  
  11. import java.net.DatagramSocket;
  12. import java.net.DatagramPacket;
  13. import java.net.InetAddress;
  14.  
  15. public class guiHello extends JFrame implements ActionListener {
  16.  
  17. private static UdpFunc func; //全局变量:调用udp类的实例化
  18. private static boolean status; //侦听状态改变标志位
  19. private static JLabel label = new JLabel("192.168.0.3:5050");
  20. private static JTextArea ta=new JTextArea(,);
  21. private JFileChooser jfc=new JFileChooser(new File("."));
  22. private JButton bOpen,bSave;
  23. private JButton bListen,bOk,bStop;
  24. public guiHello()
  25. {
  26. super("UDP监听GUI");
  27. JScrollPane ps=new JScrollPane(ta);
  28. bOpen=new JButton("选取源文件");
  29. bSave=new JButton("保存变量");
  30. bListen = new JButton("开始监听"); //这个是自定义的按钮
  31. bOk = new JButton("测试按钮");
  32.  
  33. //自定义两个 JPanel
  34. JPanel panel1 = new JPanel(new BorderLayout());
  35. JPanel panel2 = new JPanel(new BorderLayout());
  36.  
  37. //两个panel第二个背景为红色
  38. panel2.setBackground(Color.red);
  39. //panel1.add(bStop, BorderLayout.WEST);
  40. panel1.add(bListen, BorderLayout.CENTER);
  41.  
  42. add(panel1);
  43. panel2.add(label, BorderLayout.EAST);
  44. add(panel2);
  45.  
  46. setLayout(new FlowLayout(FlowLayout.CENTER,,));
  47.  
  48. add(ps);
  49. add(bOpen);
  50. add(bSave);
  51. // add(bListen);
  52. add(bOk);
  53. Border b = new LineBorder(Color.ORANGE, );
  54. bListen.setBorder(b);
  55. bOpen.addActionListener(this);
  56. bSave.addActionListener(this);
  57. bListen.addActionListener(this);
  58. bOk.addActionListener(this);
  59.  
  60. setVisible(true);
  61. setSize(,);
  62.  
  63. }
  64. /* public static void main(String[] args) {
  65. // TODO Auto-generated method stub
  66. guiHello frm=new guiHello();
  67. frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  68.  
  69. }
  70. */
  71. public void actionPerformed(ActionEvent e)
  72. {
  73. JButton jbt=(JButton)e.getSource();
  74. if(jbt==bOpen)
  75. {
  76. int status=jfc.showOpenDialog(this);
  77. if(status!=JFileChooser.APPROVE_OPTION)
  78. ta.setText("没有选择文件");
  79. else {
  80. try{
  81. File file1=jfc.getSelectedFile();
  82. Scanner scan=new Scanner(file1);
  83. String info="";
  84. while(scan.hasNext())
  85. {
  86. String str=scan.nextLine();
  87. info+=str+"\r\n";
  88. }
  89. scan.close();
  90. ta.setText(info);
  91. }
  92. catch(FileNotFoundException ex){
  93.  
  94. }
  95. }
  96.  
  97. }else if(jbt==bSave){
  98. Save();
  99.  
  100. }else if(jbt==bListen){
  101. ta.setText("开始监听...");
  102. status =true; //开始监听时为truejbt==bStop
  103. func = new UdpFunc();
  104. new Thread(new Logic()).start();
  105.  
  106. }else if(e.getActionCommand().equals("测试按钮")){
  107.  
  108. ta.setText("按钮bOk");
  109.  
  110. }else{
  111. ta.setText("未注册变量");
  112. }
  113. }
  114.  
  115. //每个按钮对应的函数
  116. private static void Save(){
  117. ta.setText("保存的按钮");
  118.  
  119. }
  120.  
  121. /*
  122. * 逻辑类,主要负责接收报文并显示出来
  123. *
  124. * @author ghost
  125. *
  126. */
  127. private static class Logic implements Runnable {
  128.  
  129. public void run() {
  130. //由于类为static,所以监听标志位也为静态变量,根据true flase决定监听线程是否一直开启
  131. while (true) {
  132. String message = func.read();
  133. //System.out.println(message);
  134. ta.setText(message);
  135.  
  136. }
  137.  
  138. }
  139.  
  140. }
  141.  
  142. }

guiHello.java

  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. import java.net.SocketException;
  6. import java.net.UnknownHostException;
  7.  
  8. public class UdpFunc {
  9.  
  10. DatagramSocket udp;
  11.  
  12. /**
  13. * 在指定端口监听udp消息
  14. * @param port
  15. */
  16. UdpFunc(int port) {
  17. try {
  18. udp=new DatagramSocket(port);
  19. } catch (SocketException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23.  
  24. /**
  25. * 向指定的ip地址的端口发送消息
  26. * @param message 要发送的消息
  27. * @param port 指定的端口
  28. * @param ip 指定的ip地址
  29. */
  30. void send(String message,int port,String ip) {
  31. try {
  32. byte temp[]=message.getBytes();
  33. InetAddress address=InetAddress.getByName(ip);
  34. DatagramPacket send_packet=new DatagramPacket(temp,temp.length,address,port);
  35. udp.send(send_packet);
  36. } catch (UnknownHostException e) {
  37. e.printStackTrace();
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. }
  41. }
  42.  
  43. /**
  44. * 从端口读取报文并返回报文数据
  45. * @return 报文数据
  46. */
  47. String read() {
  48. byte temp[]=new byte[2048];
  49. DatagramPacket receive_packet=new DatagramPacket(temp,temp.length);
  50. try {
  51. udp.receive(receive_packet);
  52. } catch (IOException e) {
  53. e.printStackTrace();
  54. }
  55. String result=new String(receive_packet.getData(),0,receive_packet.getLength());
  56. return result;
  57. }
  58. }

UdpFunc.java

  1. import javax.swing.JFrame;
  2.  
  3. public class udpServer {
  4.  
  5. /**
  6. * @param args
  7. */
  8. public static void main(String[] args) {
  9. // 开启GUI面板,打开侦听函数
  10. guiHello frm=new guiHello();
  11. frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  12. }
  13.  
  14. }

udpServer.java

项目二:udpChat

参考代码:

一个简易的udp聊天工具:

UdpFunc.java 是udp类的封装:发送和接收

UdpGui.java  GUI及对数据处理

代码:

  1. package com.ghost.chat.udp;
  2.  
  3. import java.io.IOException;
  4. import java.net.DatagramPacket;
  5. import java.net.DatagramSocket;
  6. import java.net.InetAddress;
  7. import java.net.SocketException;
  8. import java.net.UnknownHostException;
  9.  
  10. public class UdpFunc {
  11.  
  12. DatagramSocket udp;
  13.  
  14. /**
  15. * 在指定端口监听udp消息
  16. * @param port
  17. */
  18. UdpFunc(int port) {
  19. try {
  20. udp=new DatagramSocket(port);
  21. } catch (SocketException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25.  
  26. /**
  27. * 向指定的ip地址的端口发送消息
  28. * @param message 要发送的消息
  29. * @param port 指定的端口
  30. * @param ip 指定的ip地址
  31. */
  32. void send(String message,int port,String ip) {
  33. try {
  34. byte temp[]=message.getBytes();
  35. InetAddress address=InetAddress.getByName(ip);
  36. DatagramPacket send_packet=new DatagramPacket(temp,temp.length,address,port);
  37. udp.send(send_packet);
  38. } catch (UnknownHostException e) {
  39. e.printStackTrace();
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44.  
  45. /**
  46. * 从端口读取报文并返回报文数据
  47. * @return 报文数据
  48. */
  49. String read() {
  50. byte temp[]=new byte[2048];
  51. DatagramPacket receive_packet=new DatagramPacket(temp,temp.length);
  52. try {
  53. udp.receive(receive_packet);
  54. } catch (IOException e) {
  55. e.printStackTrace();
  56. }
  57. String result=new String(receive_packet.getData(),0,receive_packet.getLength());
  58. return result;
  59. }
  60. }

UdpFunc.java

  1. package com.ghost.chat.udp;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.List;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.text.SimpleDateFormat;
  8. import java.util.Date;
  9.  
  10. import javax.swing.JButton;
  11. import javax.swing.JFrame;
  12. import javax.swing.JLabel;
  13. import javax.swing.JPanel;
  14. import javax.swing.JScrollPane;
  15. import javax.swing.JTextArea;
  16. import javax.swing.JTextField;
  17.  
  18. public class UdpGui extends JFrame {
  19.  
  20. /**
  21. *
  22. */
  23. private static final long serialVersionUID = 1L;
  24.  
  25. private JTextField jtf_port; //服务器端口(也就是启动监听时服务器开的端口)
  26. private JTextField jtf_other_port; //other表示发送给一个电脑:端口为:jtf_other_port
  27. private JTextField jtf_other_ip; // ip为:jtf_other_ip
  28. private JButton btn_start;
  29. private JTextArea jta_message;
  30. private JTextField jtf_message;
  31. private JButton btn_send;
  32. private List jl_list;
  33. private UdpFunc func;
  34. private boolean status;
  35.  
  36. UdpGui() {
  37. super("UDP");
  38. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  39. guiInitialization();
  40. actionInitialization();
  41. this.setVisible(true);
  42. }
  43.  
  44. /**
  45. * 注册事件响应函数
  46. */
  47. private void actionInitialization() {
  48.  
  49. jtf_message.setEditable(false);
  50. btn_send.setEnabled(false);
  51. jl_list.setVisible(false);
  52.  
  53. btn_start.addActionListener(new ActionListener() {
  54.  
  55. public void actionPerformed(ActionEvent e) {
  56. if (e.getActionCommand().equals("start")) {
  57. int port = Integer.parseInt(jtf_port.getText());
  58. func = new UdpFunc(port);//服务器端口
  59. status = true;
  60. new Thread(new Logic()).start();
  61. postMessage("启动UDP服务器(" + port + ")");
  62. btn_start.setText("stop");
  63. jtf_port.setEditable(false);
  64. jtf_other_ip.setEditable(false);
  65. jtf_other_port.setEditable(false);
  66. jtf_message.setEditable(true);
  67. btn_send.setEnabled(true);
  68. } else if (e.getActionCommand().equals("stop")) {
  69. status = false;
  70. postMessage("服务器已经停止运行");
  71. btn_start.setText("start");
  72. jtf_port.setEditable(true);
  73. jtf_other_ip.setEditable(true);
  74. jtf_other_port.setEditable(true);
  75. jtf_message.setText("");
  76. jtf_message.setEditable(false);
  77. btn_send.setEnabled(false);
  78. } else {
  79. postMessage("发生未注册事件,请验证程序是否被修改");
  80. }
  81. }
  82.  
  83. });
  84.  
  85. btn_send.addActionListener(new ActionListener() {
  86.  
  87. public void actionPerformed(ActionEvent e) {
  88. if (e.getActionCommand().equals("send")) {
  89. String message = jtf_message.getText();
  90. if (message.trim().equalsIgnoreCase("")) {
  91. postMessage("警告:" + "你不能发送空字符串");
  92. } else {
  93. func.send(message,
  94. Integer.parseInt(jtf_other_port.getText()),//发送给客户机,需指定端口和IP
  95. jtf_other_ip.getText());
  96. postMessage("我:" + message);
  97. }
  98. jtf_message.setText("");
  99. jtf_message.requestFocus();
  100. } else {
  101. postMessage("发生未注册事件,请验证程序是否被修改");
  102. }
  103. }
  104.  
  105. });
  106.  
  107. jtf_message.addActionListener(new ActionListener() {
  108.  
  109. public void actionPerformed(ActionEvent e) {
  110. String message = jtf_message.getText();
  111. if (message.trim().equalsIgnoreCase("")) {
  112. postMessage("警告:" + "你不能发送空字符串");
  113. } else {
  114. func.send(message,
  115. Integer.parseInt(jtf_other_port.getText()),
  116. jtf_other_ip.getText());
  117. postMessage("自己:" + message);
  118. }
  119. jtf_message.setText("");
  120. jtf_message.requestFocus();
  121. }
  122.  
  123. });
  124.  
  125. }
  126.  
  127. /**
  128. * 得到当前系统时间
  129. *
  130. * @return 当前系统时间
  131. */
  132. String getTime() {
  133. Date date = new Date();
  134. SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss");
  135. return formater.format(date);
  136. }
  137.  
  138. /**
  139. * 向GUI界面递送显示的消息
  140. *
  141. * @param message
  142. * 要显示在界面上的消息(会自动加上当前系统时间)
  143. */
  144. void postMessage(String message) {
  145. if (jta_message.getLineCount() > 500) {
  146. jta_message.setText("time:" + getTime() + " " + "消息过多,执行自动清理...\n");
  147. }
  148. jta_message.append("time:" + getTime() + " " + message + "\n");
  149. jta_message.requestFocus();
  150. jta_message.setCaretPosition(jta_message.getText().length());
  151. }
  152.  
  153. /**
  154. * 初始化界面
  155. */
  156. private void guiInitialization() {
  157. this.setSize(800, 600);
  158. this.setLocation(400, 200);
  159. this.setResizable(false);
  160. JPanel container = new JPanel();
  161. this.add(container);
  162. container.setLayout(new BorderLayout());
  163. JPanel header = new JPanel();
  164. header.add(new JLabel("服务器端口:"));
  165. jtf_port = new JTextField("5050", 4);
  166. header.add(jtf_port);
  167. header.add(new JLabel("待发送客户机端口:"));
  168. jtf_other_port = new JTextField("5000", 4);
  169. header.add(jtf_other_port);
  170. header.add(new JLabel("待发送客户机IP:"));
  171. jtf_other_ip = new JTextField("192.168.1.108", 10); //127.0.0.1
  172. header.add(jtf_other_ip);
  173. btn_start = new JButton("start");
  174. header.add(btn_start);
  175. JPanel main = new JPanel();
  176. jta_message = new JTextArea();
  177. jta_message.setAutoscrolls(true);
  178. jta_message.setEditable(false);
  179. JScrollPane scorllPanel = new JScrollPane(jta_message);
  180. scorllPanel
  181. .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
  182. scorllPanel
  183. .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
  184. main.setLayout(new BorderLayout());
  185. main.add(scorllPanel, BorderLayout.CENTER);
  186. JPanel bottom = new JPanel();
  187. jtf_message = new JTextField("", 25);
  188. btn_send = new JButton("send");
  189. bottom.add(new JLabel("Send:"));
  190. bottom.add(jtf_message);
  191. bottom.add(btn_send);
  192. JPanel right = new JPanel();
  193. right.setLayout(new BorderLayout());
  194. jl_list = new List();
  195. right.add(jl_list, BorderLayout.CENTER);
  196. container.add(header, BorderLayout.NORTH);
  197. container.add(main, BorderLayout.CENTER);
  198. container.add(bottom, BorderLayout.SOUTH);
  199. container.add(right, BorderLayout.EAST);
  200. }
  201.  
  202. /**
  203. * 逻辑类,主要负责接收报文并显示出来
  204. *
  205. * @author ghost
  206. *
  207. */
  208. private class Logic implements Runnable {
  209.  
  210. public void run() {
  211. while (status) {//true
  212. String message = func.read();
  213. System.out.println(message);
  214. postMessage("对方:" + message);
  215. }
  216. }
  217.  
  218. }
  219.  
  220. /**
  221. * @param args
  222. */
  223. public static void main(String[] args) {
  224. // TODO Auto-generated method stub
  225. new UdpGui();
  226. }
  227.  
  228. }

UdpGui.java

自己利用项目一作为服务器,项目二作为客户端(实际上,也可以作为服务器),发送检验:

代码,上传上来,项目名为udp1111,udpchat,以供后续使用

udp服务器监听(多线程)的更多相关文章

  1. Scoket 服务器监听多个客户端发来的图片

    这是服务器 直接上代码 都有详细注释 注意线程需要自己手动关闭 不然程序会卡死 /* ######### ############ ############# ## ########### ### # ...

  2. 从零开始学习Node.js例子五 服务器监听

    httpsnifferInvoke.js var http = require('http'); var sniffer = require('./httpsniffer'); var server ...

  3. java项目---用java实现简单TCP服务器监听(3星)

    ---------------------------------------------服务端----------------------------------------------- 1 pa ...

  4. node.js 基础二 开启服务器监听

    1.server.js 2.监听 一 server.js 二 监听 运行server.js后,浏览器打开:http://localhost:8888/ //====================== ...

  5. java socket 网络通信 指定端口的监听 多线程 乱码

    Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首 ...

  6. 使用nginx做为静态服务器--监听两个域名配置

    #user  nobody; worker_processes  1; #error_log  logs/error.log; #error_log  logs/error.log  notice; ...

  7. php 启动服务器监听

    使用命令 php -S 域名:端口号 -t 项目路径 截图如下: 原本是通过localhost访问的 现在可以通过 127.0.0.1:8880 访问 此时命令行终端显示如下:

  8. Python 绝技 —— UDP 服务器与客户端

    i春秋作家:wasrehpic 0x00 前言 在上一篇文章「Python 绝技 —— TCP 服务器与客户端」中,介绍了传输层的核心协议 TCP ,并运用 Python 脚本的 socket 模块演 ...

  9. C# Socket基础(一)之启动异步服务监听

    本文主要是以代码为主..NET技术交流群 199281001 .欢迎加入. //通知一个或多个正在等待的线程已发生事件. ManualResetEvent manager = new ManualRe ...

随机推荐

  1. Sublime Text 2快捷键大全

    作者:zccst 2015-04-13 Sublime 插件安装 http://www.cnblogs.com/jingwhale/p/4421021.html 2014-09-17 Sublime ...

  2. iOS开发之监听键盘高度的变化

    最近做的项目中,有一个类似微博中的评论转发功能,屏幕底端有一个输入框用textView来做,当textView成为第一响应者的时候它的Y值随着键盘高度的改变而改变,保证textView紧贴着键盘,但又 ...

  3. FZU 1064 教授的测试

    递归构造答案. 根据当前整颗树的编号,可以计算左右子树有几个节点以及编号.因此,不断dfs下去就可以了. #include<cstdio> #include<cstring> ...

  4. s3c2440的GPIO驱动

    多个通用的GPIO,同时这些端口也拥有一些复用功能(如ADC输入),有部分端口只能输入,有部分端口只能输出,今天我们来看看如何设置一个GPIO的输出电平以及如何获取一个端口的GPIO电平 对GPIO进 ...

  5. iOS调试-LLDB学习总结

    from:http://www.jianshu.com/p/d6a0a5e39b0e LLDB阐述 LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的开源调试器.LLDB 绑定在 ...

  6. IOS开发-UI学习-UIImageView控件

    在页面上展现本地图片: // 使用本地图片 // 先初始化UIImageView myImageV = [[UIImageView alloc]initWithFrame:CGRectMake(, , ...

  7. HTTP协议快速入门

    一.定义 The Hypertext Transfer Protocol (HTTP) is an application protocol for distributed, collaborativ ...

  8. Struts2接受参数的几种类型和接受复杂类型参数(list<String>和list<Object>)

    Struts2接受参数的几种类型 大概有这几种类型: 1.使用Action的属性接受参数 在Action中加入成员变量,配置Getter和Setter方法,Getter而和Setter方法的名字和表单 ...

  9. UVa 10057 - A mid-summer night's dream

    题目大意:给n个数,找一个数A使得A与这n个数的差的绝对值最小.输出A最小的可能值,n个数中满足A的性质的数的个数以及满足A性质的不同的数的个数(不必从这n个数中挑选). 看见绝对值就想到了数轴上点之 ...

  10. iOS 之 UITextView

    _lableAssess = [[UITextView alloc] init]; [_lableAssess setFrame:CGRectMake(left2, top2, width2, siz ...