udp服务器监听(多线程)
项目一:udp1111
监听的有三个文件分别为:
guiHello.java 有关界面和事件响应功能
UdpFunc.java是udp类的封装:发送和接收
udpServer.java是入口函数,无实际意义
代码:
- import java.awt.*;
- import java.awt.event.*;
- import java.io.*;
- import java.util.Scanner;
- import javax.swing.*;
- import javax.swing.border.Border;
- import javax.swing.border.LineBorder;
- ////
- import java.net.DatagramSocket;
- import java.net.DatagramPacket;
- import java.net.InetAddress;
- public class guiHello extends JFrame implements ActionListener {
- private static UdpFunc func; //全局变量:调用udp类的实例化
- private static boolean status; //侦听状态改变标志位
- private static JLabel label = new JLabel("192.168.0.3:5050");
- private static JTextArea ta=new JTextArea(,);
- private JFileChooser jfc=new JFileChooser(new File("."));
- private JButton bOpen,bSave;
- private JButton bListen,bOk,bStop;
- public guiHello()
- {
- super("UDP监听GUI");
- JScrollPane ps=new JScrollPane(ta);
- bOpen=new JButton("选取源文件");
- bSave=new JButton("保存变量");
- bListen = new JButton("开始监听"); //这个是自定义的按钮
- bOk = new JButton("测试按钮");
- //自定义两个 JPanel
- JPanel panel1 = new JPanel(new BorderLayout());
- JPanel panel2 = new JPanel(new BorderLayout());
- //两个panel第二个背景为红色
- panel2.setBackground(Color.red);
- //panel1.add(bStop, BorderLayout.WEST);
- panel1.add(bListen, BorderLayout.CENTER);
- add(panel1);
- panel2.add(label, BorderLayout.EAST);
- add(panel2);
- setLayout(new FlowLayout(FlowLayout.CENTER,,));
- add(ps);
- add(bOpen);
- add(bSave);
- // add(bListen);
- add(bOk);
- Border b = new LineBorder(Color.ORANGE, );
- bListen.setBorder(b);
- bOpen.addActionListener(this);
- bSave.addActionListener(this);
- bListen.addActionListener(this);
- bOk.addActionListener(this);
- setVisible(true);
- setSize(,);
- }
- /* public static void main(String[] args) {
- // TODO Auto-generated method stub
- guiHello frm=new guiHello();
- frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- }
- */
- public void actionPerformed(ActionEvent e)
- {
- JButton jbt=(JButton)e.getSource();
- if(jbt==bOpen)
- {
- int status=jfc.showOpenDialog(this);
- if(status!=JFileChooser.APPROVE_OPTION)
- ta.setText("没有选择文件");
- else {
- try{
- File file1=jfc.getSelectedFile();
- Scanner scan=new Scanner(file1);
- String info="";
- while(scan.hasNext())
- {
- String str=scan.nextLine();
- info+=str+"\r\n";
- }
- scan.close();
- ta.setText(info);
- }
- catch(FileNotFoundException ex){
- }
- }
- }else if(jbt==bSave){
- Save();
- }else if(jbt==bListen){
- ta.setText("开始监听...");
- status =true; //开始监听时为truejbt==bStop
- func = new UdpFunc();
- new Thread(new Logic()).start();
- }else if(e.getActionCommand().equals("测试按钮")){
- ta.setText("按钮bOk");
- }else{
- ta.setText("未注册变量");
- }
- }
- //每个按钮对应的函数
- private static void Save(){
- ta.setText("保存的按钮");
- }
- /*
- * 逻辑类,主要负责接收报文并显示出来
- *
- * @author ghost
- *
- */
- private static class Logic implements Runnable {
- public void run() {
- //由于类为static,所以监听标志位也为静态变量,根据true flase决定监听线程是否一直开启
- while (true) {
- String message = func.read();
- //System.out.println(message);
- ta.setText(message);
- }
- }
- }
- }
guiHello.java
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- import java.net.InetAddress;
- import java.net.SocketException;
- import java.net.UnknownHostException;
- public class UdpFunc {
- DatagramSocket udp;
- /**
- * 在指定端口监听udp消息
- * @param port
- */
- UdpFunc(int port) {
- try {
- udp=new DatagramSocket(port);
- } catch (SocketException e) {
- e.printStackTrace();
- }
- }
- /**
- * 向指定的ip地址的端口发送消息
- * @param message 要发送的消息
- * @param port 指定的端口
- * @param ip 指定的ip地址
- */
- void send(String message,int port,String ip) {
- try {
- byte temp[]=message.getBytes();
- InetAddress address=InetAddress.getByName(ip);
- DatagramPacket send_packet=new DatagramPacket(temp,temp.length,address,port);
- udp.send(send_packet);
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 从端口读取报文并返回报文数据
- * @return 报文数据
- */
- String read() {
- byte temp[]=new byte[2048];
- DatagramPacket receive_packet=new DatagramPacket(temp,temp.length);
- try {
- udp.receive(receive_packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- String result=new String(receive_packet.getData(),0,receive_packet.getLength());
- return result;
- }
- }
UdpFunc.java
- import javax.swing.JFrame;
- public class udpServer {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // 开启GUI面板,打开侦听函数
- guiHello frm=new guiHello();
- frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- }
- }
udpServer.java
项目二:udpChat
参考代码:
一个简易的udp聊天工具:
UdpFunc.java 是udp类的封装:发送和接收
UdpGui.java GUI及对数据处理
代码:
- package com.ghost.chat.udp;
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- import java.net.InetAddress;
- import java.net.SocketException;
- import java.net.UnknownHostException;
- public class UdpFunc {
- DatagramSocket udp;
- /**
- * 在指定端口监听udp消息
- * @param port
- */
- UdpFunc(int port) {
- try {
- udp=new DatagramSocket(port);
- } catch (SocketException e) {
- e.printStackTrace();
- }
- }
- /**
- * 向指定的ip地址的端口发送消息
- * @param message 要发送的消息
- * @param port 指定的端口
- * @param ip 指定的ip地址
- */
- void send(String message,int port,String ip) {
- try {
- byte temp[]=message.getBytes();
- InetAddress address=InetAddress.getByName(ip);
- DatagramPacket send_packet=new DatagramPacket(temp,temp.length,address,port);
- udp.send(send_packet);
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 从端口读取报文并返回报文数据
- * @return 报文数据
- */
- String read() {
- byte temp[]=new byte[2048];
- DatagramPacket receive_packet=new DatagramPacket(temp,temp.length);
- try {
- udp.receive(receive_packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- String result=new String(receive_packet.getData(),0,receive_packet.getLength());
- return result;
- }
- }
UdpFunc.java
- package com.ghost.chat.udp;
- import java.awt.BorderLayout;
- import java.awt.List;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JPanel;
- import javax.swing.JScrollPane;
- import javax.swing.JTextArea;
- import javax.swing.JTextField;
- public class UdpGui extends JFrame {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private JTextField jtf_port; //服务器端口(也就是启动监听时服务器开的端口)
- private JTextField jtf_other_port; //other表示发送给一个电脑:端口为:jtf_other_port
- private JTextField jtf_other_ip; // ip为:jtf_other_ip
- private JButton btn_start;
- private JTextArea jta_message;
- private JTextField jtf_message;
- private JButton btn_send;
- private List jl_list;
- private UdpFunc func;
- private boolean status;
- UdpGui() {
- super("UDP");
- this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- guiInitialization();
- actionInitialization();
- this.setVisible(true);
- }
- /**
- * 注册事件响应函数
- */
- private void actionInitialization() {
- jtf_message.setEditable(false);
- btn_send.setEnabled(false);
- jl_list.setVisible(false);
- btn_start.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if (e.getActionCommand().equals("start")) {
- int port = Integer.parseInt(jtf_port.getText());
- func = new UdpFunc(port);//服务器端口
- status = true;
- new Thread(new Logic()).start();
- postMessage("启动UDP服务器(" + port + ")");
- btn_start.setText("stop");
- jtf_port.setEditable(false);
- jtf_other_ip.setEditable(false);
- jtf_other_port.setEditable(false);
- jtf_message.setEditable(true);
- btn_send.setEnabled(true);
- } else if (e.getActionCommand().equals("stop")) {
- status = false;
- postMessage("服务器已经停止运行");
- btn_start.setText("start");
- jtf_port.setEditable(true);
- jtf_other_ip.setEditable(true);
- jtf_other_port.setEditable(true);
- jtf_message.setText("");
- jtf_message.setEditable(false);
- btn_send.setEnabled(false);
- } else {
- postMessage("发生未注册事件,请验证程序是否被修改");
- }
- }
- });
- btn_send.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if (e.getActionCommand().equals("send")) {
- String message = jtf_message.getText();
- if (message.trim().equalsIgnoreCase("")) {
- postMessage("警告:" + "你不能发送空字符串");
- } else {
- func.send(message,
- Integer.parseInt(jtf_other_port.getText()),//发送给客户机,需指定端口和IP
- jtf_other_ip.getText());
- postMessage("我:" + message);
- }
- jtf_message.setText("");
- jtf_message.requestFocus();
- } else {
- postMessage("发生未注册事件,请验证程序是否被修改");
- }
- }
- });
- jtf_message.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- String message = jtf_message.getText();
- if (message.trim().equalsIgnoreCase("")) {
- postMessage("警告:" + "你不能发送空字符串");
- } else {
- func.send(message,
- Integer.parseInt(jtf_other_port.getText()),
- jtf_other_ip.getText());
- postMessage("自己:" + message);
- }
- jtf_message.setText("");
- jtf_message.requestFocus();
- }
- });
- }
- /**
- * 得到当前系统时间
- *
- * @return 当前系统时间
- */
- String getTime() {
- Date date = new Date();
- SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss");
- return formater.format(date);
- }
- /**
- * 向GUI界面递送显示的消息
- *
- * @param message
- * 要显示在界面上的消息(会自动加上当前系统时间)
- */
- void postMessage(String message) {
- if (jta_message.getLineCount() > 500) {
- jta_message.setText("time:" + getTime() + " " + "消息过多,执行自动清理...\n");
- }
- jta_message.append("time:" + getTime() + " " + message + "\n");
- jta_message.requestFocus();
- jta_message.setCaretPosition(jta_message.getText().length());
- }
- /**
- * 初始化界面
- */
- private void guiInitialization() {
- this.setSize(800, 600);
- this.setLocation(400, 200);
- this.setResizable(false);
- JPanel container = new JPanel();
- this.add(container);
- container.setLayout(new BorderLayout());
- JPanel header = new JPanel();
- header.add(new JLabel("服务器端口:"));
- jtf_port = new JTextField("5050", 4);
- header.add(jtf_port);
- header.add(new JLabel("待发送客户机端口:"));
- jtf_other_port = new JTextField("5000", 4);
- header.add(jtf_other_port);
- header.add(new JLabel("待发送客户机IP:"));
- jtf_other_ip = new JTextField("192.168.1.108", 10); //127.0.0.1
- header.add(jtf_other_ip);
- btn_start = new JButton("start");
- header.add(btn_start);
- JPanel main = new JPanel();
- jta_message = new JTextArea();
- jta_message.setAutoscrolls(true);
- jta_message.setEditable(false);
- JScrollPane scorllPanel = new JScrollPane(jta_message);
- scorllPanel
- .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
- scorllPanel
- .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
- main.setLayout(new BorderLayout());
- main.add(scorllPanel, BorderLayout.CENTER);
- JPanel bottom = new JPanel();
- jtf_message = new JTextField("", 25);
- btn_send = new JButton("send");
- bottom.add(new JLabel("Send:"));
- bottom.add(jtf_message);
- bottom.add(btn_send);
- JPanel right = new JPanel();
- right.setLayout(new BorderLayout());
- jl_list = new List();
- right.add(jl_list, BorderLayout.CENTER);
- container.add(header, BorderLayout.NORTH);
- container.add(main, BorderLayout.CENTER);
- container.add(bottom, BorderLayout.SOUTH);
- container.add(right, BorderLayout.EAST);
- }
- /**
- * 逻辑类,主要负责接收报文并显示出来
- *
- * @author ghost
- *
- */
- private class Logic implements Runnable {
- public void run() {
- while (status) {//true
- String message = func.read();
- System.out.println(message);
- postMessage("对方:" + message);
- }
- }
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- new UdpGui();
- }
- }
UdpGui.java
自己利用项目一作为服务器,项目二作为客户端(实际上,也可以作为服务器),发送检验:
代码,上传上来,项目名为udp1111,udpchat,以供后续使用
udp服务器监听(多线程)的更多相关文章
- Scoket 服务器监听多个客户端发来的图片
这是服务器 直接上代码 都有详细注释 注意线程需要自己手动关闭 不然程序会卡死 /* ######### ############ ############# ## ########### ### # ...
- 从零开始学习Node.js例子五 服务器监听
httpsnifferInvoke.js var http = require('http'); var sniffer = require('./httpsniffer'); var server ...
- java项目---用java实现简单TCP服务器监听(3星)
---------------------------------------------服务端----------------------------------------------- 1 pa ...
- node.js 基础二 开启服务器监听
1.server.js 2.监听 一 server.js 二 监听 运行server.js后,浏览器打开:http://localhost:8888/ //====================== ...
- java socket 网络通信 指定端口的监听 多线程 乱码
Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首 ...
- 使用nginx做为静态服务器--监听两个域名配置
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; ...
- php 启动服务器监听
使用命令 php -S 域名:端口号 -t 项目路径 截图如下: 原本是通过localhost访问的 现在可以通过 127.0.0.1:8880 访问 此时命令行终端显示如下:
- Python 绝技 —— UDP 服务器与客户端
i春秋作家:wasrehpic 0x00 前言 在上一篇文章「Python 绝技 —— TCP 服务器与客户端」中,介绍了传输层的核心协议 TCP ,并运用 Python 脚本的 socket 模块演 ...
- C# Socket基础(一)之启动异步服务监听
本文主要是以代码为主..NET技术交流群 199281001 .欢迎加入. //通知一个或多个正在等待的线程已发生事件. ManualResetEvent manager = new ManualRe ...
随机推荐
- Sublime Text 2快捷键大全
作者:zccst 2015-04-13 Sublime 插件安装 http://www.cnblogs.com/jingwhale/p/4421021.html 2014-09-17 Sublime ...
- iOS开发之监听键盘高度的变化
最近做的项目中,有一个类似微博中的评论转发功能,屏幕底端有一个输入框用textView来做,当textView成为第一响应者的时候它的Y值随着键盘高度的改变而改变,保证textView紧贴着键盘,但又 ...
- FZU 1064 教授的测试
递归构造答案. 根据当前整颗树的编号,可以计算左右子树有几个节点以及编号.因此,不断dfs下去就可以了. #include<cstdio> #include<cstring> ...
- s3c2440的GPIO驱动
多个通用的GPIO,同时这些端口也拥有一些复用功能(如ADC输入),有部分端口只能输入,有部分端口只能输出,今天我们来看看如何设置一个GPIO的输出电平以及如何获取一个端口的GPIO电平 对GPIO进 ...
- iOS调试-LLDB学习总结
from:http://www.jianshu.com/p/d6a0a5e39b0e LLDB阐述 LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的开源调试器.LLDB 绑定在 ...
- IOS开发-UI学习-UIImageView控件
在页面上展现本地图片: // 使用本地图片 // 先初始化UIImageView myImageV = [[UIImageView alloc]initWithFrame:CGRectMake(, , ...
- HTTP协议快速入门
一.定义 The Hypertext Transfer Protocol (HTTP) is an application protocol for distributed, collaborativ ...
- Struts2接受参数的几种类型和接受复杂类型参数(list<String>和list<Object>)
Struts2接受参数的几种类型 大概有这几种类型: 1.使用Action的属性接受参数 在Action中加入成员变量,配置Getter和Setter方法,Getter而和Setter方法的名字和表单 ...
- UVa 10057 - A mid-summer night's dream
题目大意:给n个数,找一个数A使得A与这n个数的差的绝对值最小.输出A最小的可能值,n个数中满足A的性质的数的个数以及满足A性质的不同的数的个数(不必从这n个数中挑选). 看见绝对值就想到了数轴上点之 ...
- iOS 之 UITextView
_lableAssess = [[UITextView alloc] init]; [_lableAssess setFrame:CGRectMake(left2, top2, width2, siz ...