Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Messenger套接字_Java_Sockets - Fatal编程技术网

Java Messenger套接字

Java Messenger套接字,java,sockets,Java,Sockets,我正在尝试制作一个“messenger”(只是为了真正的学习),我对Socket/ServerSocket还很陌生,目前正在制作网络部分。 另外,我知道客户端网络还不完善。我曾试图完成它,但我被难倒了 ServerMain: public class ServerMain extends JFrame { int WIDTH = 480; int HEIGHT = 320; String writeToConsole; JPanel mainPanel, userPanel, consol

我正在尝试制作一个“messenger”(只是为了真正的学习),我对Socket/ServerSocket还很陌生,目前正在制作网络部分。 另外,我知道客户端网络还不完善。我曾试图完成它,但我被难倒了

ServerMain:

public class ServerMain extends JFrame {

int WIDTH = 480;
int HEIGHT = 320;

String writeToConsole;

JPanel mainPanel, userPanel, consolePanel;
JTabbedPane tabbedPane;
JButton launchButton;
JTextArea console;
JTextField consoleInput;
JScrollPane consoleScroll;

public ServerMain() {
    super("Messenger Server");

    mainPanel = new JPanel();
    mainPanel.setLayout(null);

    Networking();
    createConsolePanel();

    userPanel = new JPanel();
    userPanel.setLayout(null);

    tabbedPane = new JTabbedPane();

    tabbedPane.add(mainPanel, "Main");
    tabbedPane.add(userPanel, "Users");
    tabbedPane.add(consolePanel, "Console");

    add(tabbedPane);
}

public static void main(String[] args) {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

    } catch(UnsupportedLookAndFeelException e) {
        e.printStackTrace();

    } catch (ClassNotFoundException e) {
        e.printStackTrace();

    } catch (InstantiationException e) {
        e.printStackTrace();

    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

    ServerMain frame = new ServerMain();
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.setSize(frame.WIDTH, frame.HEIGHT);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.setResizable(false);
}

public void Networking() {
    ServerNetworking net;
    try {
        net = new ServerNetworking();
        net.start();
    } catch(Exception e) {
        e.printStackTrace();
    }
}

public void createConsolePanel() {
    consolePanel = new JPanel();
    consolePanel.setLayout(null);

    console = new JTextArea();
    console.setFont(new Font("", Font.PLAIN, 13 + 1/2));
    console.setBounds(0, 0, WIDTH, HEIGHT - 100);
    console.setEditable(false);
    console.setLineWrap(true);


    consoleInput = new JTextField(20);
    consoleInput.setBounds(0, 0, WIDTH, 25);
    consoleInput.setLocation(0, 240);
    consoleInput.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent event) {
            String input = consoleInput.getText();

            if(input.equalsIgnoreCase("/sendmessage")) {
                //console.append(input);
                console.append("Input who you would like to send the message to:");
                consoleInput.setText("");

            } if (input.equalsIgnoreCase("/ban")) {
                console.append("Who you would like to ban");
                consoleInput.setText("");
            } 
        }
    });

    consolePanel.add(console);
    consolePanel.add(consoleInput);
}

public void consoleWrite(String write) {
    console.append(write);
}
}
服务器网络(线程):

}

ClientMain:

public class ClientMain extends JFrame {

int WIDTH = 640;
int HEIGHT = 480;

JTabbedPane tabbedPane;
JMenuBar topMenuBar;
JMenu userMenu, helpMenu, settingsMenu;
JRadioButtonMenuItem menuItem;
JPanel mainPanel, friendsPanel, groupsPanel, testPanel;
JLabel title;
JScrollPane consoleScrollPane;
JSplitPane friendsPane;
JTextArea messageArea, testArea;
JTextField testField;
Box box;

public ClientMain() {
    super("Messenger Client");

    Networking();

    title = new JLabel("Client!");
    title.setFont(new Font("Impact", Font.PLAIN, 32));

    mainPanel = new JPanel();
    mainPanel.setLayout(null);
    mainPanel.add(title);

    groupsPanel = new JPanel();
    groupsPanel.setLayout(null);

    friendsPanel = new JPanel();
    friendsPanel.setLayout(null);

    testPanel = new JPanel();
    testPanel.setLayout(null);

    testArea = new JTextArea();
    testArea.setFont(new Font("", Font.PLAIN, 13 + 1/2));
    testArea.setBounds(0, 0, WIDTH, HEIGHT - 100);
    testArea.setEditable(false);
    testArea.setLineWrap(true);

    testField = new JTextField(20);
    testField.setBounds(0, 380, 640, 25);
    //testField.setLocation(0, HEIGHT - 50);
    testField.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            ClientNet net = new ClientNet();
            String input = null;
            input = testField.getText();
            testArea.append(input);
            testField.setText("");

            if(input.equalsIgnoreCase("/sendmessage")) {
                testArea.append("\n Input who you would like to send the message to:");
                input = null;

                if(input.equalsIgnoreCase("Hello")) {
                    net.userEntry = input;
                }
            }
        }
    });

    testPanel.add(testArea);
    testPanel.add(testField);

    tabbedPane = new JTabbedPane();

    tabbedPane.add(mainPanel, "Main");
    tabbedPane.add(friendsPanel, "Friends");
    tabbedPane.add(groupsPanel, "Groups");
    tabbedPane.add(testPanel, "Test");

    topMenuBar = new JMenuBar();

    userMenu = new JMenu("User");

    settingsMenu = new JMenu("Settings");

    helpMenu = new JMenu("Help");

    menuItem = new JRadioButtonMenuItem("Something here");

    userMenu.add(menuItem);

    topMenuBar.add(userMenu, "User");
    topMenuBar.add(settingsMenu, "Settings");
    topMenuBar.add(helpMenu, "Help");

    add(topMenuBar);
    add(tabbedPane);
}

public static void main(String[] args) {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

    } catch(UnsupportedLookAndFeelException e) {
        e.printStackTrace();

    } catch (ClassNotFoundException e) {
        e.printStackTrace();

    } catch (InstantiationException e) {
        e.printStackTrace();

    } catch (IllegalAccessException e) {
        e.printStackTrace();

    }

    ClientMain frame = new ClientMain();
    Insets insets = frame.getInsets();
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.setSize(frame.WIDTH, frame.HEIGHT);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.setResizable(false);
    frame.setJMenuBar(frame.topMenuBar);

}

public void Networking() {
    ClientNet net;
    try {
        net = new ClientNet();
        net.start();

    } catch(Exception e) {
        e.printStackTrace();
    }
}

public void createMenuBar() {
    topMenuBar = new JMenuBar();

    userMenu = new JMenu("User");
    settingsMenu = new JMenu("Settings");
    helpMenu = new JMenu("Help");

    menuItem = new JRadioButtonMenuItem("MenuItem");
    menuItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

        }
    });

    topMenuBar.add(userMenu, "User");
    topMenuBar.add(settingsMenu, "Settings");
    topMenuBar.add(helpMenu, "Help");
}

public void getFriends(String username) {

}
}

客户端网络(线程):

这是启动服务器时出现的错误,然后启动客户端: 它不应该说“消息已收到”,因为我实际上没有发送消息

Opening port...

Message received.

* Closing connection... *
Exception in thread "Thread-1" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at Server.ServerNetworking.handleClient(ServerNetworking.java:29)
at Server.ServerNetworking.run(ServerNetworking.java:53)

我认为问题在于
ServerNetworking
类中的以下循环:

while (!message.equals("***CLOSE***")) {
    System.out.println("Message received.");
    numMessages++;
    output.println("Message " +
    numMessages + ": " + message);
    message = input.nextLine();
}
此代码的问题是,在从客户端接收完整消息后,最后一行代码

message = input.nextLine();
从消息中查找下一行,但由于消息已被使用,因此引发以下异常:

NoSuchElementException - if no line was found 
因此,在阅读下一行之前,你需要确保有下一行需要阅读。您可以使用

hasNextLine()
方法,如果有下一行,则返回true,否则返回false

if(input.hasNextLine()) {
    message = input.nextLine();  // read the next line
} else {
   break;  // exit the loop because, nothing to read left
}

那么,你到底有什么问题?如果你不想得到一百万张反对票,请阅读这篇文章——对不起,我赶时间,我没有时间具体说明。它主要在ClientNetworking线程中。我需要帮助设置和输入(发送到服务器)和输出(从服务器接收)以及套接字连接。我知道如何连接到它(大多数情况下),只是无法设置字符串和内容,以便从线程本身访问字符串。我尝试这样做:(代码)String message=main.input//其中ClientMain=newclientmain();(/code)但每次我试图在ClientNetworking线程中创建ClientMain的实例时,它都会给我一个stackoverflow错误。我知道(code)这件事不起作用,但我无法让三重空格代码起作用。@Dig我添加了启动客户端和服务器(当然是服务器优先)时出现的错误@user2843197:您已经发布了两次clientmain代码,但没有发布ClientNet。我按照您所说的做了,但它返回了以下消息:服务器>消息1:null*关闭连接…*线程“thread-1”java.lang.NullPointerException位于Client.ClientNet.accessServer(ClientNet.java:32)的Client.ClientNet.run(ClientNet.java:53)的异常您没有发布
ClientNet
的代码,但是发布了两次
ClientMain
。请同时提供
ClientNet
代码。同样在while条件下,您需要放置
消息!=服务器中的null
hasNextLine()
if(input.hasNextLine()) {
    message = input.nextLine();  // read the next line
} else {
   break;  // exit the loop because, nothing to read left
}