2012-12-27, 18:59
#1
Hej, har skrivit ett litet "chatrum" i java och det funkar nästan. Jag gjorde det möjligt att starta klienten med eller utan gui. Utan gui:t funkar det men med så får jag socketException: socket closed när klienten ska läsa eller skriva till servern.
klient
gui
felmeddelande i nästa post
Felen uppstår alltså inte när jag kör utan gui:t
tack
klient
Kod:
package se.xxxxxx;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class ChatClient implements Runnable {
private static boolean DEBUGENABLED = false;
private static String host;
private static int port;
private Socket socket = null;
private DataOutputStream out = null;
private DataInputStream in = null;
private static boolean guiEnabled = true;
private ChatClientGUI gui;
private static String USAGE = "Usage: java ChatClient host port (optional flags)";
// flag strings
private static final String NOGUI = "nogui";
private static final String DEBUG = "debug";
private static final String HELP = "Available flags:\nnogui\ndebug\n";
// TODO add more flags here
public ChatClient(String host, int port) {
try {
socket = new Socket(host, port);
out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());
// separate thread for receiving messages
new Thread(this).start();
if (!guiEnabled) {
Scanner scanner = new Scanner(System.in);
// non gui chat loop
// TODO change the non terminating loop
while (true) {
// read from stdin
System.out.println(">> ");
sendMessage(scanner.nextLine());
}
} else {
gui = new ChatClientGUI(this);
// TODO change size with flags
}
} catch (UnknownHostException e) {
System.err.println("Bad host");
if (DEBUGENABLED)
e.printStackTrace();
System.exit(1);
} catch (IOException e) {
System.err.println("Error during connection.");
if (DEBUGENABLED)
e.printStackTrace();
System.exit(1);
} finally {
close();
}
}
public void sendMessage(String msg) {
try {
out.writeUTF(msg);
} catch (IOException e) {
System.err.println("Message could not be sent.");
if (DEBUGENABLED)
e.printStackTrace();
}
}
public void run() {
try {
while (true) {
String msg = in.readUTF();
printMessage(msg);
}
} catch (IOException e) {
System.err.println("Message could not be read.");
if (DEBUGENABLED)
e.printStackTrace();
}
}
private void printMessage(String msg) {
// TODO
// this method prints to stdout or to gui
System.out.println(msg);
}
private void close() {
try {
out.close();
in.close();
} catch (IOException e) {
System.err.println("Error closing streams. Exiting.");
if (DEBUGENABLED)
e.printStackTrace();
System.exit(1);
}
}
public static void main(String[] args) {
handleArgs(args);
new ChatClient(host, port);
}
private static void handleArgs(String[] args) {
if (args.length < 2) {
System.err.println(USAGE);
System.exit(1);
} else {
try {
host = args[0];
port = Integer.parseInt(args[1]);
handleFlags(args);
} catch (NumberFormatException e) {
System.err.println("Port must be an integer. Exiting.");
System.exit(1);
}
}
}
private static void handleFlags(String[] args) {
if (args.length == 2) {
return;
} else {
for (int i = 2; i < args.length; i++) {
String flag = args[i];
switch (flag) {
case NOGUI:
guiEnabled = false;
System.out.println("Starting without GUI.");
break;
case DEBUG:
DEBUGENABLED = true;
System.out.println("Debugging mode enabled.");
break;
default:
// invalid flag, ignoring
break;
}
}
}
}
}
gui
Kod:
package se.xxxxxx;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ChatClientGUI extends JFrame {
private static final String TITLE = "Chatclient v.0.1";
private ChatClient client;
private JPanel textAreaPanel;
private JPanel textInputPanel;
private JTextArea textArea;
private JTextField textInput;
private JButton sendButton;
private JButton uploadButton;
public ChatClientGUI(ChatClient client) {
this(client, 640, 480);
}
public ChatClientGUI(ChatClient client, int width, int height) {
this.client = client;
initUI(width, height);
}
private void initUI(int width, int height) {
setSize(new Dimension(width, height));
setTitle(TITLE);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
textAreaPanel = new JPanel();
textInputPanel = new JPanel();
textInputPanel.setLayout(new FlowLayout());
textArea = new JTextArea(20, 100);
textInput = new JTextField(40);
textInput.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
client.sendMessage(e.getActionCommand());
textInput.setText("");
}
});
sendButton = new JButton("Send");
sendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
client.sendMessage(textInput.getText());
textInput.setText("");
}
});
uploadButton = new JButton("Upload");
textAreaPanel.add(textArea);
textInputPanel.add(textInput);
textInputPanel.add(sendButton);
textInputPanel.add(uploadButton);
add(textAreaPanel, BorderLayout.NORTH);
add(textInputPanel, BorderLayout.SOUTH);
setLocationRelativeTo(null);
pack();
setVisible(true);
}
public void appendText(String msg) {
}
public void clearTextField() {
textInput.setText("");
}
// for visual testing only
public static void main(String[] args) {
new ChatClientGUI(null);
}
}
felmeddelande i nästa post
Felen uppstår alltså inte när jag kör utan gui:t
tack