项目一: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服务器监听(多线程)的更多相关文章

  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. HUST 1372 marshmallow

    很简单的博弈题.....算几组能得到规律了. 某个状态先手要赢 等价于 之前有一种状态是后手赢,先手可以保证让现在这个状态到达那个状态 #include<cstdio> #include& ...

  2. (简单) HDU 3308 LCIS,线段树+区间合并。

    Problem Description Given n integers. You have two operations: U A B: replace the Ath number by B. ( ...

  3. Mac下配置node.js环境(Mac 10.12)

    有安装就有卸载,卸载教程参考:http://www.cnblogs.com/EasonJim/p/6287141.html 一.官方下载pkg安装包 1.安装 到官网https://nodejs.or ...

  4. git如何正确回滚代码

    git如何正确回滚代码 方法一,删除远程分支再提交 ①首先两步保证当前工作区是干净的,并且和远程分支代码一致 $ git co currentBranch $ git pull origin curr ...

  5. java web面试

    1. session和cookie的区别和联系,session的生命周期,多个服务部署时session管理. 原博http://blog.csdn.net/shuaishenkkk/article/d ...

  6. 【蓝牙数据采集模块】-01-Sensor Controller 功能介绍

    一. CC2650芯片内部的结构框图如图,内部包含: 一个Cortex-M3主控制器,用来做整个芯片的功能与任务实现 一个Cortex-M0射频控制器,用来驱动RF相关电路 一个Sensor Cont ...

  7. robotium从入门到放弃 三 基于apk的自动化测试

      1.apk重签名   在做基于APK的自动化测试的过程中,需要确保的一点是,被测试的APK必须跟测试项目具有相同的签名,那怎么做才能确保两者拥有相同的签名呢?下面将给出具体的实现方法. 首先将被测 ...

  8. error: WatchKit App doesn't contain any WatchKit Extensions whose WKAppBundleIdentifier matches

    error: WatchKit App doesn't contain any WatchKit Extensions whose WKAppBundleIdentifier matches &quo ...

  9. centos 6.5下安装、配置并启动SSH远程访问

    centos 6.5下安装.配置并启动SSH远程访问 1.登录centos 6.5系统,使用root用户登录,如果为非root用户则执行su或su - 或su root或su - root切换为roo ...

  10. Struts2 属性驱动、模型驱动、异常机制

    模型驱动使用单独的VO(值对象)来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果. 一.使用模型驱动 1.login.action采用模型驱动模式实现,采用模型驱动时必 ...