零、前言
1.本文不是大讲特讲UDP和TCP的区别,或者其流程,只是基于此作些小测试
2.完成两个计算机、手机、计算机与手机之间的信息数据传输
3.把控制台输出及GUI操作 以及Android展现形式
4.既然都是Java,可以让计算机与Android端通信,在java的控制台上操作Android
5.java控制台、java的GUI、Android界面都只是作为java的一种展现形式,任何一方都可以作为客户端或服务端
1.java控制台与控制台测试
udp发送与接收消息_控制台.png2.java的GUI测试
udp发送与接收消息.png3.java控制台与安卓测试
udp发送与接收消息android.png一、java控制台与控制台测试
1:updSocket服务端:数据发送方
思路
1---建立updSocket服务。
2---提供数据,并将数据封装到数据包中。
3---通过socket服务的发送功能,将数据包发出去。
4---关闭资源。
public class UDPServer {
public static void main(String[] args) {
System.out.println("这是服务端");
try {
//1: 通过DatagramSocket对象创建updSocket服务:端口8081
DatagramSocket datagramSocket = new DatagramSocket(8081);
//2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)
byte[] buf = "土豆土豆,我是地瓜".getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.56.1"), 8080);
//3,通过socket服务,将已有的数据包发送出去。通过send方法。
datagramSocket.send(dp);
//4,关闭资源。
datagramSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2:客户端:数据接收方
思路
1---定义udpSocket服务。通常会监听一个端口。(给网络应用定义数字标识--便于该应用程序处理传来数据过来)
2---定义一个数据包,因为要存储接收到的字节数据(数据包对象中有更多功能可以提取字节数据中的不同数据信息)
3---通过socket服务的receive方法将收到的数据存入已定义好的数据包中。
4---通过数据包对象的特有功能。将这些不同的数据取出。打印在控制台上。
5---关闭资源。
class UDPClient {
public static void main(String[] args) throws Exception {
System.out.println("这是客户端");
//1:创建udp socket,建立端点。
DatagramSocket ds = new DatagramSocket(8080);
while (true) {
//2:定义数据包。用于存储数据。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
//3:通过服务的receive方法将收到数据存入数据包中。
ds.receive(dp);//阻塞式方法。
//4:通过数据包的方法获取其中的数据。
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());
int port = dp.getPort();
System.out.println("来自" + ip + ":" + port + ":" + data);
}
//5:关闭资源
//ds.close();
}
}
udp发送与接收消息_控制台.png1.先打开客户端,然后程序由于ds.receive(dp);会进入等待
2.打开服务端后,客户端会接收到服务端数据
3.如果客户端在其他的电脑上,对应好IP和端口,也可以打印到其他电脑上
二、java的GUI测试
控件是通过Idea拖拽的
主要逻辑是不变的,只是在按钮点击时进行数据的发送文本框中的字符串,关闭窗口时关闭服务
1:GUI实现服务端
public class UDPServer {
private JPanel mPanel1;
private JButton mButton1;
private JTextField mMsg;
private DatagramSocket mDatagramSocket;
public UDPServer() {
mDatagramSocket = null;
try {
//1: 通过DatagramSocket对象创建updSocket服务
mDatagramSocket = new DatagramSocket(8081);
} catch (Exception e) {
e.printStackTrace();
}
mButton1.addActionListener(e -> {
//2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)
byte[] buf = mMsg.getText().getBytes();
DatagramPacket dp = null;
try {
dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.56.1"), 8080);
//3,通过socket服务,将已有的数据包发送出去。通过send方法。
mDatagramSocket.send(dp);
} catch (Exception e1) {
e1.printStackTrace();
}
});
}
public void close() {
//4,关闭资源。
mDatagramSocket.close();
}
public static void main(String[] args) {
JFrame frame = new JFrame("服务端");
frame.setSize(400, 400);
frame.setLocation(300, 200);
UDPServer UDPServer = new UDPServer();
frame.setContentPane(UDPServer.mPanel1);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
UDPServer.close();
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
2:GUI实现客户端
public class UDPClient {
private JPanel mPanel1;
private JTextArea mTextArea1;
public static void main(String[] args) {
JFrame frame = new JFrame("客户端");
frame.setSize(400, 400);
frame.setLocation(300, 200);
UDPClient client = new UDPClient();
frame.setContentPane(client.mPanel1);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
StringBuilder sb = new StringBuilder();
//1:创建udp socket,建立端点。
DatagramSocket ds = null;
try {
ds = new DatagramSocket(8080);
while (true) {
//2:定义数据包。用于存储数据。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
//3:通过服务的receive方法将收到数据存入数据包中。
ds.receive(dp);//阻塞式方法。
//4:通过数据包的方法获取其中的数据。
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());
int port = dp.getPort();
sb.append("来自" + ip + ":" + port + ":" + data+"\n");
client.mTextArea1.setText(sb.toString());
System.out.println(sb.toString());
}
//5:关闭资源
//ds.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
udp发送与接收消息.png
三、java控制台与Android
ip.png在设置-->关于手机-->状态信息 中查看手机的ip(此处使用wifi测试)
在服务端要写对应的ip。
1.服务端的java代码:
public class UDPServer2 {
public static void main(String[] args) throws IOException {
System.out.println("这是服务端");
//1: 通过DatagramSocket对象创建updSocket服务:端口8081
DatagramSocket datagramSocket = new DatagramSocket(8081);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = br.readLine()) != null) {
if ("886".equals(line)) {
break;
}
byte[] buf = line.getBytes();
//2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.10.111"), 8080);
//3,通过socket服务,将已有的数据包发送出去。通过send方法。
datagramSocket.send(dp);
}
//4,关闭资源。
datagramSocket.close();
}
}
2.客户端的Android代码
本示例并不需要网络权限!
必须要在子线程接收数据,不然报异常,所以使用handler进行控件刷新
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@BindView(R.id.id_tv_ip)
TextView mIdTvIp;
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
String obj = (String) msg.obj;
mSb.append(obj + " ");
mIdTvIp.setText(mSb.toString());
}
};
private StringBuffer mSb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
mSb = new StringBuffer();
new Thread() {
@Override
public void run() {
try {
//1:创建udp socket,建立端点。
DatagramSocket ds = new DatagramSocket(8080);
while (true) {
//2:定义数据包。用于存储数据。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
//3:通过服务的receive方法将收到数据存入数据包中。
ds.receive(dp);//阻塞式方法。
//4:通过数据包的方法获取其中的数据。
String data = new String(dp.getData(), 0, dp.getLength());
Message msg = Message.obtain();
msg.obj = data;
mHandler.sendMessage(msg);
}
//5:关闭资源
//ds.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
udp发送与接收消息android.png
如果你想要对网络传输有一点兴趣,不妨亲自试一下,用电脑控制手机或其他电脑的感觉还蛮不错的。好了,就酱紫。
后记:捷文规范
1.本文成长记录及勘误表
项目源码 | 日期 | 备注 |
---|---|---|
V0.1--无 | 2018-10-2 | 基于UDP的网络数据传输测试(Java+Android) |
V0.2--无 | - | - |
2.更多关于我
笔名 | 微信 | 爱好 | |
---|---|---|---|
张风捷特烈 | 1981462002 | zdl1994328 | 语言 |
我的github | 我的简书 | 我的CSDN | 个人网站 |
3.声明
1----本文由张风捷特烈原创,转载请注明
2----欢迎广大编程爱好者共同交流
3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
4----看到这里,我在此感谢你的喜欢与支持
网友评论