package 实验14;
/**
* 只需要在重新复制一个类 修改接口 和 类名 就可以实现简单的通信了 新手所写 大家见谅
* 另外 我的文本区并没有添加滚动面板 还有 如果要添加滚动面板 需要在接收类设置jta1.setCaretPosition(jta1.getText().length());
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class UDP通讯2 {
public static void main(String[] args) {
new UDPInterface2("李四");
}
}
class UDPInterface2 {
String name = "";
JFrame jf = null;
JButton jb1 = new JButton("发送");
JButton jb2 = new JButton("清屏");
JTextField jtf1 = new JTextField(20);
JTextField jtf2 = new JTextField(10);
JTextField jtf3 = new JTextField(10);
JLabel jl1 = null;
JTextArea jta1 = new JTextArea(500, 400);
JTextArea jta2 = new JTextArea(100, 400);
JPanel jp1 = new JPanel();
JPanel jp2 = new JPanel();
static int sendPort = 58202;
static int receivePort = 45670;
boolean flag = true;
// static int sendPort = 45670;
// static int receivePort = 58202;
static String IP = "127.0.0.255"; // 广播地址
// boolean flag = false;
boolean isSend = false;
public UDPInterface2(String name) {
new Thread(new UDPReceiver()).start();
this.name = name;
jf = new JFrame(this.name + "UDP网络通讯");
jtf1.setText(IP);
jta1.setEditable(false);
jtf2.setText(String.valueOf(receivePort));
jtf3.setText(sendPort + "");
jl1 = new JLabel("当前正在监听" + receivePort + "端口", JLabel.CENTER);
jp1.setLayout(null);
jp1.setBounds(0, 0, 1000, 500);
jta1.setBounds(0, 0, 1000, 300);
jta2.setBounds(0, 300, 1000, 200);
jp1.add(jta1);
jp1.add(jta2);
jta1.setBackground(Color.GRAY);
jta1.setFont(new Font("微软雅黑", Font.BOLD, 20));
jta1.setText("HelloWorld!\n");
jta1.setForeground(Color.GREEN);
jp2.add(jtf1);
jp2.add(new JLabel("接收端口:"));
jp2.add(jtf2);
jp2.add(new JLabel("发送端口:"));
jp2.add(jtf3);
jp2.add(jb1);
jp2.add(jb2);
jf.add(jp1);
jf.add(jp2, BorderLayout.SOUTH);
jf.add(jl1, BorderLayout.NORTH);
jf.setBounds(300, 300, 1000, 600);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.addWindowListener(new WL());
ActionListener AL = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == jb1) { // 发送
isSend = true;
new Thread(new UDPSend()).start();
// System.out.println(jta2.getText());
} else if (e.getSource() == jb2) {// 清屏
jta1.setText("");
jta2.setText("");
} else if (e.getSource() == jtf1) { // IP
IP = jtf1.getText();
} else if (e.getSource() == jtf2) { // PORT
receivePort = Integer.parseInt(jtf2.getText());
jl1.setText("当前正在监听" + receivePort + "端口");
jf.validate();
} else if (e.getSource() == jtf3) {
sendPort = Integer.parseInt(jtf3.getText());
jf.validate();
}
}
};
jb1.addActionListener(AL);
jb2.addActionListener(AL);
jtf1.addActionListener(AL);
jtf2.addActionListener(AL);
jtf3.addActionListener(AL);
}
class UDPSend implements Runnable {
@Override
public void run() {
try {
DatagramSocket ds = new DatagramSocket();
String str = jta2.getText();
byte[] bytes = str.getBytes();
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getByName(IP), sendPort);
ds.send(dp);
jta2.setText("");
isSend = false;
ds.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// isSend = false;
}
}
}
class UDPReceiver implements Runnable {
@Override
public void run() {
try {
DatagramSocket ds = new DatagramSocket(receivePort);
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
while (flag) {
ds.receive(dp);
String str = new String(dp.getData(), 0, dp.getLength());
// System.out.println("收到" + dp.getAddress().getHostAddress() + "发送的数据-----" +
// str);
str = "收到" + dp.getAddress().getHostAddress() + "发送的数据-----" + str;
String temp = jta1.getText();
temp += str;
jta1.setText(temp + "\n\n");
}
ds.close();
} catch (SocketException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
class WL extends WindowAdapter{
@Override
public void windowClosed(WindowEvent e) {
flag = false;
}
}
}