程序的错误就在注释的下面,当打开程序随便创建一个连接的时候,若目的主机没有运行该程序,那么这个程序就死掉了
我觉得很奇怪,如果是一个简单的Client程序的话,连接不到Server至少还会扔出异常啊,为什么我注释后面的那句话却不会呢?我表示无法理解。import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;@SuppressWarnings("serial")
public class Talk extends JFrame
{
private ServerSocket server;
private Socket[] sockets;
private static final int MAX_LINK = 10;

public Talk() throws IOException 
{
server = new ServerSocket(1680);
sockets = new Socket[MAX_LINK];
new ListenThread().start();

JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Menu");
menuBar.add(menu);
JMenuItem newItem = new JMenuItem("New Connection");
JMenuItem exitItem = new JMenuItem("Exit");
menu.add(newItem);
menu.addSeparator();
menu.add(exitItem);

setJMenuBar(menuBar);

newItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
final String ip = JOptionPane.showInputDialog(Talk.this, "Please input a IP address: ");
if (ip == null || ip.equals(""))
return; EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
//当连接不上目的主机时,就停在这句话上了
Socket socket = new Socket(ip, 1680);
JFrame frame = new TalkFrame(socket);
frame.setVisible(true);
}
catch (IOException e)
{
e.printStackTrace();
}
}
});
}
});
exitItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
System.exit(0);
}
});
}

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
JFrame frame = new Talk();
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
catch (IOException e)
{
e.printStackTrace();
}
}
});
}

private class ListenThread extends Thread
{
public void run()
{
while (true)
{
for (int i = 0; i < MAX_LINK; i++)
{
try
{
sockets[i] = server.accept();
JFrame frame = new TalkFrame(sockets[i]);
frame.setVisible(true);

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

private class TalkFrame extends JFrame
{
private JTextArea record = new JTextArea(10, 30);
private JTextField message = new JTextField(20);
private JButton button = new JButton("Send");
private PipedWriter pipeOut;
private PipedReader pipeIn;

public TalkFrame(Socket socket) throws IOException
{
pipeOut = new PipedWriter();
pipeIn = new PipedReader(pipeOut);
String ip = socket.getInetAddress().getHostAddress();
setTitle("Talk with " + ip);
setLayout(new BorderLayout());

add(new JLabel("Talk Record: "), BorderLayout.NORTH);
add(new JScrollPane(record), BorderLayout.CENTER);
record.setEditable(false);

JPanel panel = new JPanel();
panel.add(new JLabel("Message: "));
panel.add(message);
panel.add(button);
add(panel, BorderLayout.SOUTH);

button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
PrintWriter out = new PrintWriter(pipeOut);
out.println(message.getText());
record.append("I: " + message.getText() + "\n");
message.setText("");
}
});
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent event)
{
setVisible(false);
record.setText("");
}
});
new WriteThread(pipeIn, new PrintWriter(socket.getOutputStream())).start();
new ReadThread(this, ip, record, new BufferedReader(new InputStreamReader(socket.getInputStream()))).start();
setSize(400, 300);
setLocationByPlatform(true);
setVisible(true);
}
} private class WriteThread extends Thread
{
private PrintWriter out;
private BufferedReader in;

public WriteThread(PipedReader pipeIn, PrintWriter out)
{
this.out = out;
this.in = new BufferedReader(pipeIn);
}

public void run()
{
while (true)
{
try
{
while (true)
{
String s = in.readLine();
out.println(s);
out.flush();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}

private class ReadThread extends Thread
{
private BufferedReader in;
private JTextArea record;
private String ip;
private JFrame frame;

public ReadThread(JFrame frame, String ip, JTextArea record, BufferedReader in)
{
this.frame = frame;
this.ip = ip;
this.in = in;
this.record = record;
}

public void run()
{
while (true)
{
try
{
record.append(ip + ": " + in.readLine() + "\n");
frame.setVisible(true);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}

解决方案 »

  1.   

    连接不上肯定是会抛出异常的,可能是你没捕获上,你只捕获了IOException,具体看API文档。长时间连接不上的话也会抛出超时异常;或者你 设置一下连接超时socket=new Socket();
    socket.connect(new InetSocketAddress(serverIP,serverPort), 10000);
      

  2.   

    我这运行没错,我用eclipse运行的
    当目标主机连接不到时,eclipse控制台上报错:
    java.net.ConnectException: Connection timed out: connect
    当目标主机名错误时,eclipse控制台上报错:
    java.net.UnknownHostException: sss
    要等一段时间java才能检测出这些错误