项目一: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. LPC1788的spi使用

    #ifndef __SPI_H_ #define __SPI_H_ #include "common.h" #include "delay.h" // cs p ...

  2. 机器学习算法与实现 之 Logistic Regression---java实现

    Logistic Regression和Linear Regression实现起来几乎是一样的,有疑问的同学可以看一看Andrew N.g在coursera上的machine learning课程. ...

  3. JNI错误总结(转)

    源:JNI错误总结 最近公司里要用JNI技术,用java去调用已经写好的本地DLL库.之前自己也没接触过相关技术,其中花了大部分时间在调试改错上面,网上对于错误的解决方案也不多,现在项目接近完工,自己 ...

  4. foreach笔记

    结合泛型使用,不然就只能写成for(Object o : T). 缺点是没有下标,如下面代码 public class ForeachTest { public static void main(St ...

  5. MS SQL Server数据库修复/MDF数据文件数据恢复/MDF质疑/mdf无法附加

    微软的SQL Server 数据库最常用的有两种类型的文件: 1.主要数据文件,文件后缀一般是.MDF: 2.事务日志文件,文件后缀一般是.LDF. 用户数据表.视图.存储过程等等数据,都是存放在MD ...

  6. OI队内测试——石门一

    T1: 题目大意: 给你一个立方体,每个面上有些数字,给你一个数字K,你可以玩K轮游戏, 每轮你会将每个面上的数均分为4份,分给相邻的面,求K轮游戏后,上面的数字是 依次给你前.后.上.下.左.右的起 ...

  7. UVa 481 - What Goes Up

    题目大意:给你一系列数,找出它的最长(严格)递增子序列. 由于数据量较大,使用O(n2)的LIS算法会超时,要使用O(nlogn)的LIS算法,这里有详细的介绍. #include <cstdi ...

  8. Android控件上添加图片

    项目中有一个点赞功能,点赞的小图标添加在点赞列表旁边,在xml里可以进行设置,也可以在代码中进行绘图. 下面是两种方法的设置: 1.xml里:一些控件:button.textView等等里面有个属性是 ...

  9. eclipse中集成svn maven开发手册---maven编译打包

    使用eclipse中maven进行打包. 打好的包在相应的workspace下面会有一个release的文件夹,如图

  10. Sublime Text 3 安装 Emmet 插件

    首先安装 Package Control 1.通过快捷键 ctrl+` 或者 View > Show Console 菜单打开控制台 2.粘贴以下代码后回车安装 import  urllib.r ...