这篇文章主要介绍“基于UDP协议开发Java聊天系统的方法”,在日常操作中,相信很多人在基于UDP协议开发Java聊天系统的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于UDP协议开发Java聊天系统的方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
下面展示一些 Client类。
/**-------------------
* 发送端
**---------------------*/
class Client extends Thread{
private static String content; //发送内容
private static int port; //发送端口
private static int target; //目标端口
private static byte[] addr; //目标ip地址
/**-------------------
*构造函数
**---------------------*/
public Client(String content,int port,int target,byte[] addr){
this.content=content;
this.port=port;
this.target=target;
this.addr=addr;
}
/**-------------------
*发送端函数
**---------------------*/
public void run(){
DatagramSocket client= null;
try {
//定义发送端端口为 port 的DatagramSocket对象
client = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
String str=content;
DatagramPacket packet= null;
try {
//定义DatagramPacket对象,用于封装发送的数据以及目标地址 target
packet = new DatagramPacket(str.getBytes(),str.getBytes().length,
InetAddress.getByAddress(addr),target);
} catch (UnknownHostException e) {
e.printStackTrace();
}
try {
//发送数据
client.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
//关闭释放资源
client.close();
}
}
/**-------------------
*接收端
**---------------------*/
class Server extends Thread{
private static JTextArea jt; //对话框
private static int target; //目标端口
/*-------------------
构造函数
---------------------*/
public Server(JTextArea jt,int target){
this.jt=jt;
this.target=target;
}
下面展示一些 Server类。
/*-------------------
接收端
---------------------*/
class Server extends Thread{
private static JTextArea jt; //对话框
private static int target; //目标端口
/*-------------------
构造函数
---------------------*/
public Server(JTextArea jt,int target){
this.jt=jt;
this.target=target;
}
/*-------------------
接收端函数
---------------------*/
public void run(){
String str;
DatagramSocket server= null;
try {
//定义一个端口号为 target 的接收端DatagramSocket对象
server = new DatagramSocket(target);
} catch (SocketException e) {
e.printStackTrace();
}
byte[] buf=new byte[1024];
//定义一个DatagramPacket数据报对象,用于封装接收数据
DatagramPacket packet=new DatagramPacket(buf, buf.length);
while (true){
try {
//等待接收数据,在数据没有被接收到之前会被堵塞
server.receive(packet);
} catch (IOException e) {
e.printStackTrace();
}
//使用DatagramPacket的方法获得接收到的信息,并转为字符串类型
str=new String(packet.getData(),
0,packet.getLength());
//将接收到的信息打印到对话框
jt.append("接收到:"+str+"
");
}
}
}
下面展示一些 Main类。
public class Main {
public static int port;
public static int target;
public static byte[] addr;
public static void Login(){
System.out.print("请输入端口号:");
Scanner ScPort=new Scanner(System.in);
port=ScPort.nextInt();
System.out.print("请输入目标端口号1:");
Scanner ScTarget=new Scanner(System.in);
target=ScTarget.nextInt();
System.out.print("请输入目标端口号2:");
Scanner ScTarget2=new Scanner(System.in);
int target2=ScTarget2.nextInt();
System.out.print("请输入目标IP地址:");
Scanner Scaddr=new Scanner(System.in);
/*---------------------
将目标IP存储到数组中
-----------------------*/
String ip=Scaddr.nextLine();
/*---------------------
public String[] split(String regex):
根据给定正则表达式的匹配拆分此字符串
----------------------*/
String[] ii=ip.split("\.");
/*---------------------
我们现在使用的IPv4是用一个32位的二进制数来存储的,为了方便记忆,
会将其分成4个8位的二进制数(4个一字节的二进制数),每8位之间用圆点隔开。
而每8位二进制数可以转换为一个0~255的十进制数,例如103.42.176.244,
这种写法被称为点数表示法
----------------------*/
byte[] addr=new byte[4];
for(int i=0;i<4;i++){
addr[i]=(byte)(Integer.parseInt(ii[i]));
}
System.out.println("窗口启动中....");
new Thread(new Server(CreateAndShowGUI(port,target,addr),target2),"接收服务").start();
}
/*-------------------
GUI界面
---------------------*/
public static JTextArea CreateAndShowGUI(int port,int target,byte[] addr){
/*---------------------
创建界面
----------------------*/
JFrame jf=new JFrame("聊天界面");
jf.setLocation(400,200);
jf.setSize(400,300);
/*---------------------
设置布局
----------------------*/
jf.setLayout(new BorderLayout());
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/*---------------------
创建聊天窗口
----------------------*/
JTextArea jt=new JTextArea(14,34);
JScrollPane scrollPane=new JScrollPane(jt);
jt.setEditable(false);
/*---------------------
创建发送窗口
----------------------*/
JTextField jte=new JTextField(20);
JButton jb=new JButton("发送");
jb.addActionListener(e->{
String content=jte.getText();
/*---------------------
为发送按钮创建动作
----------------------*/
if (content!=null&&!content.trim().equals("")){
/*-------------------
判断信息是否为空
若为空,在在对话框提示 你输入的内容为空
反之发送
--------------------*/
jt.append("输入信息为:"+content+"
");
/*--------------
将发送框信息发送到目标对话框
传入Client方法的参数分别为
“发送内容,发送端口,目标端口,目标IP地址”
----------------*/
try {
new Thread(new Client(content,port,target,addr),"发送服务").start();
} catch (Exception exception) {
exception.printStackTrace();
}
}else{
jt.append("你输入的内容为空");
}
jte.setText(""); //信息发送后,将发送框重置
});
JPanel jp=new JPanel();
JLabel jl=new JLabel("聊天信息");
jp.add(jl);
jp.add(jte);
jp.add(jb);
jf.add(jt,BorderLayout.PAGE_START);
jf.add(jp,BorderLayout.PAGE_END);
//显示GUI界面
jf.setVisible(true);
return jt;
}
public static void main(String[] args) throws Exception{
Login();
}
}
到此,关于“基于UDP协议开发Java聊天系统的方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。