【发布时间】:2016-12-30 14:22:35
【问题描述】:
在主线任务之前,我想说对不起我的英语不好(我不是以英语为母语的人)
我有一个很大的学校项目,为了这个项目,我决定创建一个简单的java聊天程序。 我的老师说,如果我写下我获取该代码的地方,则可以使用开源代码。
我从这里获取了代码: https://www.youtube.com/watch?v=kqBmsLvWU14&t=411s
视频以 JFrame 形式创建程序,如果我完全喜欢视频,它对我有用。但是,如果我只是扩展 JFrame 而不以 JFrame 形式创建文件,则代码不起作用。如果您观看视频和我的代码,我想您会明白我的意思。
package Chat;
//Server
import java.awt.*;
import java.awt.event.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.*;
public class Chat_Server extends JFrame implements ActionListener{
JButton jb1 = new JButton("Invite");
JButton Name = new JButton("Name");
JButton Enter = new JButton("Enter");
JPanel jp1 = new JPanel();
JPanel jp2 = new JPanel();
JPanel jp3 = new JPanel();
static JTextArea textarea = new JTextArea(500,500);
JTextField textfield = new JTextField(35);
static ServerSocket SS;
static Socket S;
static DataInputStream DIS;
static DataOutputStream DOS;
public Chat_Server(){
jp1.setLayout(new FlowLayout());
jp1.add(jb1); jp1.add(Name);
jb1.addActionListener(this);
Name.addActionListener(this);
jp2.add(textarea);
jp3.setLayout(new FlowLayout());
jp3.add(textfield); jp3.add(Enter);
add(jp1, BorderLayout.NORTH);
add(jp2, BorderLayout.CENTER);
add(jp3, BorderLayout.SOUTH);
setSize(500,500);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
String name;
if(e.getSource()==jb1)
Call();
if(e.getSource()==Name){
name = JOptionPane.showInputDialog("Type your name");
String Servername = name;
}
if(e.getSource()==Enter){
try{
String MessageOut= "";
MessageOut = textfield.getText();
DOS.writeUTF(MessageOut);
}catch( Exception ex){
}
}
}
public void Call(){
Chat_Client CC = new Chat_Client();
}
public static void main (String[] args){
Chat_Server cs = new Chat_Server();
String MessageIn = "";
try{
SS = new ServerSocket(1000);
Socket S = SS.accept();
DIS = new DataInputStream(S.getInputStream());
DOS = new DataOutputStream(S.getOutputStream());
while (!MessageIn.equals("Stop the chat")){
MessageIn = DIS.readUTF();
textarea.setText(textarea.getText()+"\n"+MessageIn);
}
}
catch(Exception e){
}
}
}
------------------------结束下一个代码---------- ----------------------
package Chat;
import static Chat.Chat_Server.SS;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Chat_Client extends JFrame implements ActionListener{
JButton Name = new JButton("Namn");
JButton Enter = new JButton("Enter");
JPanel jp1 = new JPanel();
JPanel jp2 = new JPanel();
JPanel jp3 = new JPanel();
static JTextArea textarea = new JTextArea(500,500);
JTextField textfield = new JTextField(35);
static ServerSocket SS;
static Socket S;
static DataInputStream DIS;
static DataOutputStream DOS;
public Chat_Client(){
jp1.add(Name);
Name.addActionListener(this);
jp2.add(textarea);
jp3.setLayout(new FlowLayout());
jp3.add(textfield); jp3.add(Enter);
add(jp1, BorderLayout.NORTH);
add(jp2, BorderLayout.CENTER);
add(jp3, BorderLayout.SOUTH);
setSize(500,500);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
String name;
if(e.getSource()==Name){
name = JOptionPane.showInputDialog("Ange ditt namn");
String Kundname = name;
}
if(e.getSource()==Enter){
try{
String MessageOut= "";
MessageOut = textfield.getText();
DOS.writeUTF(MessageOut);
}catch( Exception ex){
}
}
}
public static void main (String[] args){
Chat_Client cc = new Chat_Client();
String MessageIn = "";
try{
S = new Socket("127.0.0.1",1000);
DIS = new DataInputStream(S.getInputStream());
DOS = new DataOutputStream(S.getOutputStream());
while (!MessageIn.equals("Stop the chat")){
MessageIn = DIS.readUTF();
textarea.setText(textarea.getText()+"\n"+MessageIn);
}
}
catch(Exception e){
}
}
}
如果我单击名称为 Enter 的 JButton,文本必须在另一个屏幕的 JTextArea 上可见,就像在视频中一样,但在我的情况下,Java 不发送任何内容,我不明白为什么会这样 :(
【问题讨论】:
-
不要复制代码。学习想法并复制它们,但编写所有您自己的代码,您就会理解它并避免类似的问题。
-
另外,如果那个教程告诉你在做的时候使用一堆静态字段和空的 catch 块,那么它不值得观看或学习。
-
@DontKnowMuchButGettingBetter 是的,该代码非常可怕。例如,所有那些 catch 块都是 empty 是绝对可怕。这意味着任何错误消息都会被丢弃。
-
我必须同意其他人的观点。您正在尝试组合 2 个复杂的 Java 字段,并且似乎不理解一些基本的东西,因为异常处理是灾难的根源。要么让自己接受 2 周的紧张学习,要么选择更容易做的事情。
-
@javaprogrammer 请首先更改您的 catch 块,至少打印堆栈跟踪。做 e.printStackTrace();在每个 catch 块中。然后,运行程序并让我们知道您是否遇到任何错误。否则,就像其他人建议的那样重新开始。该代码的标准非常低。最好试试标准的 Java 教程。