udp 服务器界面监听
今天在做项目的时候,发现不同子网下是不能做UDP通信的,不知道是不是这样呢
遇到一个错误:eclipse遇到报错:
The type JPEGImageEncoder is not accessible due to restriction on required library C:\Java\jre1.6.0_07\lib\rt.jar
google后发现用以下方式解决:
这个事eclipse的设置问题,它默认把这些受访问限制的API设成了ERROR,你只要把
Windows-Preferences-Java-Complicer-Errors/Warnings
里面的Deprecated and restricted API中的Forbidden references(access rules)选为Warning就可以编译通过了。
Java UDP服务器代码:
package gui;
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.io.IOException;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.net.InetAddress; public class guiHello extends JFrame implements ActionListener { private static JLabel label = new JLabel("192.168.0.3:8888");
private static JTextArea ta=new JTextArea(30,80);
private JFileChooser jfc=new JFileChooser(new File("."));
private JButton bOpen,bSave;
private JButton bListen,bOk;
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(bListen, BorderLayout.CENTER);
add(panel1);
panel2.add(label, BorderLayout.EAST);
add(panel2); setLayout(new FlowLayout(FlowLayout.CENTER,10,15));
// add(label);
add(ps);
add(bOpen);
add(bSave);
// add(bListen);
add(bOk);
Border b = new LineBorder(Color.ORANGE, 2);
bListen.setBorder(b);
bOpen.addActionListener(this);
bSave.addActionListener(this);
bListen.addActionListener(this);
bOk.addActionListener(this);
setVisible(true);
setSize(1600,1500); }
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){ //监听函数须加try catch
Runnable tr = new Runnable() {
public void run() {
try {
Listen(); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
javax.swing.SwingUtilities.invokeLater(tr); }else{
ta.setText("服务器已开启");
test(); }
} //每个按钮对应的函数
private static void Save(){
ta.setText("保存的按钮"); }
private static void Listen() throws IOException{
//1、创建DatagramSocket;指明服务器端口
DatagramSocket server = new DatagramSocket(8888);
byte[] recvBuf = new byte[1024];
//2、创建数据包,用于接收内容。
DatagramPacket recvPacket
= new DatagramPacket(recvBuf , recvBuf.length);
//3、接收数据
server.receive(recvPacket);
//System.out.println(packet.getData().toString());
//以上语句打印信息错误,因为getData()返回byte[]类型数据,直接toString会将之序列化,而不是提取字符。应该使用以下方法:
String recvStr = new String(recvPacket.getData() , 0 , recvPacket.getLength());
System.out.println("Hello World!" + recvStr);
int port = recvPacket.getPort();
//地址为InetAddress类型:(为了回发时使用)
InetAddress inetAddr = recvPacket.getAddress();
//地址为字符串类型:
String strAdd = recvPacket.getAddress().getHostAddress();
ta.setText("监听\n到客户机地址:"+strAdd+"\n端口:"+port+"\n内容:"+recvStr); String sendStr = "Hello ! I'm Server";
byte[] sendBuf;
sendBuf = sendStr.getBytes();
DatagramPacket sendPacket
= new DatagramPacket(sendBuf , sendBuf.length , inetAddr , port );
server.send(sendPacket);
//4、关闭连接。
server.close(); }
private static void test(){ ta.setText("测试的按钮:bOk");
}
}
Java 客户机代码:
package socket;
/*UDP客户端
UDP客户端首先向被动等待联系的服务器发送一个数据报文。一个典型的UDP客户端主要执行下面三步:
1.创建一个DatagramSocket实例,可以选择对本地地址和端口号进行设置。
2.使用DatagramSocket类的send()方法和receive()方法发送和接受DatagramPacket实例,进行通信。
3.通信完成后,使用DatagramSocket类的close()方法来销毁该套接字。 DatagramSocket类的connect()方法确实允许指定远程地址和端口,但该功能是可选的。
*/
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.DatagramPacket; public class udpSendTest{ public static void main(String[] args) throws Exception{
//1、创建DatagramSocket用于UDP数据传送。
//DatagramSocket socket = new DatagramSocket(); //本机地址(默认的),任何可用端口
//本机地址(缺点是必须知道,并且必须是本地IP地址),指定本机端口 我方地址和端口
DatagramSocket socket = new DatagramSocket(4567, InetAddress.getByName("192.168.1.103")); //2、创建需要发送的数据包
byte[] buf = "哈利波特之死亡圣器,长岛是没有雪的2的222".getBytes();
//对方地址和端口192.168.0.3
DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.1.103"), 8888); //3、发送
socket.send(packet); //4、关闭连接
socket.close();
}
}
udp 服务器界面监听的更多相关文章
- .net core Kestrel宿主服务器自定义监听端口配置
在.net core的web程序中,除了可以在项目中硬编码服务器的监听端口外,还可以在外部通过json文件配置. 方法如下: 第一步:在项目中新建一个名为Hosting.json的文件.当然,文件名可 ...
- 安卓作为udp服务器,PC作为客户端,仅监听
安卓客户端作为udp服务器,监听其他客户端的数据,测试已成功 本次实验所用数据: 安卓作为服务器: 端口:8888 IP:192.168.1.104 电脑作为客户端: 端口:50 ...
- C#的UDP服务器
最新优化版本 /* http://www.cnblogs.com/zengqinglei/archive/2013/04/27/3046119.html */ using System; using ...
- ActiveMQ监听消息并进行转发,监听不同的mq服务器和不同的队列
工作中刚接触mq消息业务,其实也就是监听一下别的项目发送的消息然后进行对应的转发,但是监听的mq会有多个,而且转发的地址也可能有多个,这里就使用spring集成的方式!记录一下实现方式: 监听多个mq ...
- C# Socket系列一 简单的创建socket的监听
socket的应用场景,在快速,稳定,保持长连接的数据传输代码.Http也是socket封装出来的,基于一次请求一次回复,然后断开的socket连接封装. 比如我们常见的游戏服务器,目前的很火的物联网 ...
- linux网络连接的查看和端口的监听
网络软件都是由客户端和服务端组成,由服务端在服务器上监听指定的端口处理接收到的数据,而客户端是向服务器端监听的端口发送数据,并由服务器端对该数据进行处理,然后将处理结果返回给客户端. 那么我们在lin ...
- KestrelServer详解[1]:注册监听终结点(Endpoint)
具有跨平台能力的KestrelServer是最重要的服务器类型.针对KestrelServer的设置均体现在KestrelServerOptions配置选项上,注册的终结点是它承载的最重要的配置选项. ...
- Oracle 监听配置详解(转载)
使用ORACLE的SQL*Net V.2连接客户机和服务器,需配置每个客户机和服务器.在服务器上需配置的文件有:listener.ora./etc/services,在客户机上需配置tnsna ...
- 【故障•监听】TNS-12518、TNS-00517和 Linux Error:32:Broken pipe
[故障|监听]TNS-12518.TNS-00517和 Linux Error:32:Broken pipe 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱 ...
随机推荐
- C#webbrowser控件技巧(取得javascript变量值,禁止显示脚本错误)
C#中的webbrowser控件比较好用. 下面本人搜索整理的几个小技巧. 1. 从C#中取得javascript的变量值. using mshtml;using System.Reflection; ...
- 《玩转Bootstrap(基础)》笔记
基本的HTML模板 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- mongodb学习(三) 安装和基本CRUD
菜鸟啊...先吐槽一下自己 发现mongodb已经升级到2.6标准版了. 服务端最新安装方法: http://www.cnblogs.com/lzrabbit/p/3682510.html 一 准备 ...
- mongodbVUE基本操作(转)
基本操作: http://my.oschina.net/u/1026531/blog/188336
- 更改pandas dataframe 列的顺序
摘自 stackoverflow 这是我的df: Net Upper Lower Mid Zsore Answer option More than once a day 0% 0.22% -0.12 ...
- 使用布局(Layout资源)
实际上从我们学习第一个Android应用开始,已经开始接触Android的Layout资源了,因此此处不会详细介绍Android Layout资源的知识,会对Layout资源进行简单的归纳. Layo ...
- 几个获取Windows系统信息的Delphi程序
1.获取windows版本信息 可以通过Windows API函数GetVersionEx来获得. 具体程序如下: Procedure Tform1.Button1Click(sender:TObje ...
- Delphi遍历文件夹及子文件夹(可查找固定格式文件)
Delphi遍历文件夹及子文件夹 {-------------------------------------------------------------------------------过程名 ...
- JS模板引擎:基于字符串拼接
目的 编写一个基于字符串拼接的js模板引擎雏形,这里并不会提供任何模板与数据的绑定. 基本原理 Javascript中创建函数的方式有多种,包括: 1. var func = function () ...
- I/O流
转自:http://www.cnblogs.com/dolphin0520/p/3791327.html 一.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的 ...