文章目录
前言
这里我粘贴一下,物联网大作业的简易聊天工具的相关代码
一、运行起来怎么样?
每一次设置昵称后需要手动建立连接一次
分享代码,希望大家指出我代码的不规范之处
好,那么直接上代码
二、具体代码
1.整体结构
如图:
2.Main代码
package MainMethed;
public class Main{
public static void main(String[] args) {
Thread thread1 = new Thread(new Chater());
thread1.start();
}
}
3.Chater代码
package MainMethed;
import MainFrame.MyFrame;
public class Chater implements Runnable{
public Chater() {
}
@Override
public void run() {
MyFrame myFrame = new MyFrame();
}
}
4.MassageRecieve代码
package MainMethed;
import MainFrame.MyFrame;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class MessageReceive extends Thread{
int get_port;
MyFrame myframe;
public MessageReceive(int get_port,MyFrame myframe) {
this.get_port = get_port;
this.myframe=myframe;
}
@Override
public void run() {
try {
DatagramSocket socket=new DatagramSocket(get_port);
while (true){
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);
if (new String(packet.getData(), 0, packet.getLength()).equals("bye")) {
break;
}
String msg=new String(packet.getData(), 0, packet.getLength());
myframe.text.setText(myframe.text.getText()+msg+"\n");
System.out.println(msg);
}
socket.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.MassageSend代码
package MainMethed;
import MainFrame.MyFrame;
import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class MessageSend extends Thread{
InetAddress To_ip;
int To_port;
int From_port;
String Sender_name;
MyFrame myframe;
public MessageSend(InetAddress to_ip,int to_port,String sender_name,int from_port, MyFrame myframe) {
To_ip = to_ip;
To_port = to_port;
Sender_name=sender_name;
From_port = from_port;
this.myframe=myframe;
}
@Override
public void run() {
try {
DatagramSocket socket =new DatagramSocket(From_port);
System.out.println("连接成功");
while (true){
while (myframe.in_text==null){
Thread.currentThread().sleep(20);
}
String msg =Sender_name+":"+myframe.in_text;
DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, To_ip, To_port);
socket.send(packet);
myframe.text.setText(myframe.text.getText()+Sender_name+":"+myframe.in_text+"\n");
myframe.in_text=null;
if(new String(packet.getData(),0,packet.getLength()).equals("bye")){
break;
}
}
socket.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
6.MyFrame代码
package MainFrame;
import MainMethed.MessageReceive;
import MainMethed.MessageSend;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
//1540*870
public class MyFrame extends JFrame {
public InetAddress to_ip;
public int to_port;
public int send_port;
public int receive_port;
public String in_text;
public TextArea text;
public String sender_name;//昵称
private JTextField t1;//输入框一,存储目的IP
private JTextField t2;//输入框二,目的的端口
private JTextField t3;//输入框三,发送端口
private JTextField t4;//输入框四,接受端口
private JTextField intertext;
private JButton enter;
private JButton name;
private JButton set_connection;
public MyFrame(){
//这一大块代码是为了创建JUI的整体模块
Container container = getContentPane();
setTitle("QQ简易版");
setVisible(true);
setBounds(570,135,400,600);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel panel1=new JPanel(new GridLayout(1,2));
JPanel panel2=new JPanel();
JPanel panel3=new JPanel(new GridLayout(2,1));
JPanel panel4=new JPanel(new FlowLayout());
panel3.add(panel4);
panel3.add(new JLabel(" ",SwingConstants.CENTER));
container.add(panel1,BorderLayout.NORTH);
container.add(panel2,BorderLayout.CENTER);
container.add(panel3,BorderLayout.SOUTH);
set_connection=new JButton("设置连接");
set_connection.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new ConnectionJDialog();
}
});
name=new JButton("设置昵称");
name.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new SetNameConnection();
}
});
text =new TextArea(30,35);
text.setBackground(Color.LIGHT_GRAY);
panel1.add(set_connection);
panel1.add(name);
panel2.add(text);
intertext=new JTextField(18);
enter=new JButton("发送");
panel4.add(intertext);
panel4.add(enter);
enter.addActionListener(new action_enter());
}
private class action_enter implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
in_text=intertext.getText();
intertext.setText("");
}
}
private class SetNameConnection extends JDialog{
public SetNameConnection() {
pack();
setVisible(true);
setTitle("昵称设置");
setBounds(500,200,400,70);
Container container = getContentPane();
container.setLayout(new FlowLayout());
setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
JLabel jLabel = new JLabel("请输入你的昵称:");
JTextField username = new JTextField(8);
username.setText(sender_name);
JButton button = new JButton("确认");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sender_name=username.getText();
System.out.println(sender_name);
}
});
container.add(jLabel);
container.add(username);
container.add(button);
}
}
private class ConnectionJDialog extends JDialog {
public ConnectionJDialog() {
setVisible(true);
setTitle("连接设置");
setBounds(200,200,400,200);
Container container = getContentPane();
container.setLayout(new GridLayout(5,2));
setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
t1=new JTextField();
t1.setText("127.0.0.1");
t2=new JTextField();
t2.setText(String.valueOf(to_port));
t3=new JTextField();
t3.setText(String.valueOf(send_port));
t4=new JTextField();
t4.setText(String.valueOf(receive_port));
JButton ok = new JButton("建立连接");
ok.addActionListener(new action_ok());
JLabel label1=new JLabel("目的IP:");
JLabel label2=new JLabel("目的端口:");
JLabel label3=new JLabel("发送端口:");
JLabel label4=new JLabel("接收端口");
JLabel Label5 = new JLabel("请确认-->");
container.add(label1);
container.add(t1);
container.add(label2);
container.add(t2);
container.add(label3);
container.add(t3);
container.add(label4);
container.add(t4);
container.add(ok);
}
private class action_ok implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
try {
to_ip = InetAddress.getByName(t1.getText());
to_port=Integer.parseInt(t2.getText());
send_port=Integer.parseInt(t3.getText());
receive_port=Integer.parseInt(t4.getText());
MessageSend thread1 = new MessageSend(to_ip,to_port,sender_name,send_port,MyFrame.this);
thread1.start();
MessageReceive thread2 = new MessageReceive(receive_port,MyFrame.this);
thread2.start();
} catch (UnknownHostException unknownHostException) {
unknownHostException.printStackTrace();
}
}
}
}
}
三. 项目打包部分
提示:其实打不打包也没多大关系
可以直接参考我的另一篇博客
文件打包教程
如果你实在搞不出来,可以去下载我的资源
这里面包含了代码项目原件(含注释版本),已经打包的jar和exe文件,已经可安装的setup文件
点击这里进入
版权声明:本文为qq_49559393原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。