Java 为什么客户端在成功连接到服务器后会冻结?
我正在尝试使用Java 为什么客户端在成功连接到服务器后会冻结?,java,networking,server,client,Java,Networking,Server,Client,我正在尝试使用Socket和ServerSocket在java中创建聊天室,客户端和服务器都通过IP地址成功连接。但一旦我连接并尝试在文本字段中键入内容,整个聊天室就会冻结,我必须退出应用程序才能停止。你知道发生这种情况的原因吗 这是服务器 public class Server { public static void main(String[] args) throws IOException { System.out.println("The server is running"
Socket
和ServerSocket
在java
中创建聊天室,客户端和服务器都通过IP地址成功连接。但一旦我连接并尝试在文本字段中键入内容,整个聊天室就会冻结,我必须退出应用程序才能停止。你知道发生这种情况的原因吗
这是服务器
public class Server {
public static void main(String[] args) throws IOException {
System.out.println("The server is running");
int clientNumber = 1;
ServerSocket listener = new ServerSocket(9092);
try{
while(true){
new Chat(listener.accept(), clientNumber++).start();
}
}finally{
listener.close();
}
}
private static class Chat extends Thread{
private Socket socket;
private int clientNumber;
public Chat(Socket socket, int clientNumber) {
this.socket = socket;
this.clientNumber = clientNumber;
System.out.println("You have connected as " + clientNumber +".");
}
public void run(){
try{
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("You can chat with any other people who have connected");
out.println("To leave just enter a single slash");
out.println(clientNumber + " people have connected.");
while(true){
String input = in.readLine();
if(input == null || input.equals("/")){
break;
}
out.println("Client #" + clientNumber +":" + input);
}
}catch (IOException e) {
System.out.println("Error handling client# " + clientNumber + ": " + e);
} finally {
try {
socket.close();
} catch (IOException e) {
System.out.println("Couldn't close socket");
}
System.out.println("Client #" + clientNumber + " has ended the connection");
}
}
}
}
这是客户
public class Client implements KeyListener {
private BufferedReader in;
private PrintWriter out;
private JFrame frame = new JFrame("Chat Room");
private JTextField dataField = new JTextField(100);
private JTextArea messageArea = new JTextArea(10, 100);
public Client(){
messageArea.setEditable(false);
frame.getContentPane().add(dataField, "South");
frame.getContentPane().add(messageArea, "Center");
dataField.addKeyListener(this);
}
public void connectToServer() throws Exception{
String serverAddress = JOptionPane.showInputDialog(frame,
"Enter IP Address of the Server:",
"Welcome to the Capitalization Program",
JOptionPane.QUESTION_MESSAGE);
Socket socket = new Socket(serverAddress, 9092);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream());
for(int i =0; i<3; i++){
messageArea.append(in.readLine() +"\n");
}
}
public static void main(String[] args) throws Exception {
Client client = new Client();
client.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
client.frame.pack();
client.frame.setVisible(true);
client.connectToServer();
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
int c = e.getKeyCode();
if(c == KeyEvent.VK_ENTER) {
out.println(dataField.getText());
String response;
try{
response = in.readLine();
if(response == null || response.equals("")){
System.exit(0);
}
} catch (IOException ex){
response = "Error: " + ex;
}
messageArea.append(response + "\n");
dataField.setText("");
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
public类客户机实现KeyListener{
中的私有缓冲区读取器;
私人打印输出;
私人JFrame=新JFrame(“聊天室”);
私有JTextField数据字段=新JTextField(100);
私有JTextArea messageArea=新的JTextArea(10100);
公共客户机(){
messageArea.setEditable(false);
frame.getContentPane().add(数据字段,“南”);
frame.getContentPane().add(messageArea,“Center”);
addKeyListener(这个);
}
public void connectToServer()引发异常{
字符串serverAddress=JOptionPane.showInputDialog(框架,
“输入服务器的IP地址:”,
“欢迎参加资本化计划”,
JOptionPane.QUESTION_消息);
套接字=新的套接字(服务器地址,9092);
in=新的BufferedReader(新的InputStreamReader(socket.getInputStream());
out=新的PrintWriter(socket.getOutputStream());
对于(int i=0;i表示根本原因;用于解决方案;以及更好地管理文本字段输入(因为keylister
确实是一个糟糕的选择)@MadProgrammer我最初使用ActionListener作为文本字段,但存在相同的问题,因此我尝试使用KeyListener,出现了相同的问题。因为这不是KeyListener
或ActionListener
的错误-事实是您正在阻止事件调度线程-阅读链接的教程,他们会我会解释的更多