Chat server-client

em có viết 1 chương trình demo chat client và server, nhưng không hoạt động được , đã thử trên màn hình console kết nối được nhưng khi gắn giao diện thì không ạ, m.n giúp em với

chatserver

import java.awt.Color;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InvocationEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.xml.ws.spi.Invoker;

public class ChatServer extends JFrame {
	static ServerSocket serversocket;
	static Socket socket;
	static DataInputStream datain;
	static DataOutputStream dataout;
	
	
	static JPanel pnmain;
	static TextField testfield;
	static JTextArea testarer;
	static JButton btsend;
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				new ChatServer().setVisible(true);
				
			}
		});
		
		String str="";
		try {
			serversocket=new ServerSocket(1111);
			socket=serversocket.accept();
			datain=new DataInputStream(socket.getInputStream());
			dataout=new DataOutputStream(socket.getOutputStream());
			
			while(str.equals("q")) {
				str=datain.readUTF();
				
				testarer.setText(testarer.getText().trim()+"\n"+str);
				testarer.append(str);
				
			}
			
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		
	}
	
		
	
	
	public  ChatServer() {
		super("chatserver");

		JPanel pnmain=new JPanel();
		pnmain.setBackground(Color.black);
		pnmain.setLayout(null);
		
		TextField testfield=new TextField();
		testfield.setBounds(30, 350, 250, 30);
		
		JTextArea testarer=new JTextArea();
		testarer.setForeground(Color.white);
		testarer.setBounds(30, 30, 320, 300);
		
		JButton btsend=new JButton(">>");
		btsend.setBounds(300, 350, 50, 30);
		
		pnmain.add(testarer);
		pnmain.add(testfield);
		pnmain.add(btsend);
		
		this.add(pnmain);
		this.setSize(400, 500);
		
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		btsend.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				
				try {
					
					String str2="";
					str2=testfield.getText().trim();
					dataout.writeUTF(str2);
					dataout.flush();
				} catch (Exception e2) {
					// TODO: handle exception
				}
				
			}
		});

		
	}

}

chatclient:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;

public class ChatClient extends JFrame {
	
	static JPanel pnmain;
	static TextField testfield;
	static JTextArea testarer;
	static JButton btsend;
	
	static Socket socket;
	static DataInputStream datain;
	static DataOutputStream dataout;
	
	
	public static void main(String[] args)  {
		// TODO Auto-generated method stub
		
		SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				new ChatClient().setVisible(true);
				
			}
		});
		
		String str="";
		try {
			socket=new Socket("127.0.0.1",1111);
			datain=new DataInputStream(socket.getInputStream());
			dataout=new DataOutputStream(socket.getOutputStream());
			
			while(str.equals("exit")) {
				str=datain.readUTF();
				testarer.setText(testarer.getText().trim()+"\n"+str);
				testarer.append(str);
				}
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		
		
		
	}
	public  ChatClient()  {
		super("chatclient");
		JPanel pnmain=new JPanel();
		pnmain.setBackground(Color.black);
		pnmain.setLayout(null);
		
		TextField testfield=new TextField();
		testfield.setBounds(30, 350, 250, 30);
		
		JTextArea testarer=new JTextArea();
		testarer.setForeground(Color.white);
		testarer.setBounds(30, 30, 320, 300);
		
		JButton btsend=new JButton(">>");
		btsend.setBounds(300, 350, 50, 30);
		
		pnmain.add(testarer);
		pnmain.add(testfield);
		pnmain.add(btsend);
		
		this.add(pnmain);
		this.setSize(400, 500);
		
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		btsend.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				
				try {
					
					String str2="";
					str2=testfield.getText().trim();
					dataout.writeUTF(str2);
					dataout.flush();
					
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				
			}
		});

		
	}
	

}

Thứ nhất: Bạn đã làm mất hướng đối tượng trong Java.
Thứ hai: Bạn cũng làm mất hướng đối tượng trong Java.
Thứ ba: Bạn vẫn làm mất hướng đối tượng trong Java.

  • Sao lại để các trường của 1 lớp tất cả đều là tĩnh static, chắc là dễ gọi trong main().
  • Bạn nói đã từng làm ở Console, chạy tốt. Nhưng hãy làm sao để chạy cả trên Console và Giao diện đều được.

Bạn đang gom nhiều đối tượng riêng biệt vào chung 1 chỗ. Viết riêng ra để dễ dàng triển khai ở mọi ngữ cảnh.
Gợi ý:

  • Viết riêng một lớp kết nối, chứa các phương thức để nhận các tham số như: địa chỉ IP, số cổng, văn bản cần gửi/nhận,…
  • Một lớp khác chính là giao diện người dùng để thao tác trực quan. Lớp này sẽ gọi đến các phương thức của đối tượng lớp kết nối nêu trên.
  • Theo mình, nó có liên quan đến luồng (Thread) nữa. Bạn nên tìm hiểu về nó, để tránh chương trình bị treo. :smiling_imp:
1 Like

Tôi không biết là bạn học java lâu chưa nhưng tôi khuyên bạn không nên viết tất cả mọi thứ vào trong main như vậy mà lên tách nhỏ nó ra thành các hàm hay các class riêng biệt:

  • Thứ nhất nó sẽ giúp bạn tìm và sửa lỗi dễ hơn
  • Thứ hai thuận lợi cho việc bảo trì và nâng cấp sau này
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?