Trường hợp khó hiểu trong java-socket chat đơn giản

Em đang cảm thấy rất khó hiểu. Ảnh dưới lúc e cho System.out vào thì nó chạy, còn bỏ đi thì thì nó ko chạy, ai giải thích jup e với.
Đây là code cl của e:

package chat_s;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInput;
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.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class cilient extends panel {
	static Scanner sc = new Scanner(System.in);
	static cilient p = new cilient();
	static String s = "";
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		Socket socket;
		textarea = new JTextArea();
		textarea.setBounds(0, 0, 300, 500);
		scpane = new JScrollPane(textarea);
		scpane.setBounds(10, 10, 300, 500);
		p.add(scpane);
		button = new JButton("send");
		button.setBounds(50, 510, 70, 30);
		p.add(button);
		textf = new JTextField();
		textf.setBounds(150, 510, 150, 30);
		p.add(textf);
		button.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				s = textf.getText();
			}
		});
		p.setVisible(true);
		try {
			socket = new Socket("192.168.0.106", 7777);
			DataOutputStream da = new DataOutputStream(socket.getOutputStream());
			System.out.println("dat ten user:");
			String s = sc.nextLine();
			da.writeUTF(s);
			da.writeUTF("room1");
			new read(socket).start();
			new write(socket).start();
		} catch (UnknownHostException e) {
			System.out.println("host da dong");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("loi ket noi");
			e.printStackTrace();
		}

	}
}
class read extends Thread {
	Socket socket;
	public read(Socket socket) {
		this.socket = socket;
	}
	@Override
	public void run() {
		try {
			DataInputStream datainput = new DataInputStream(socket.getInputStream());
			while (true) {
				cilient.p.addtext(datainput.readUTF());

			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}
class write extends Thread {
	Socket socket;
	public write(Socket socket) {
		this.socket = socket;
	}
	@Override
	public void run() {

		try {
			DataOutputStream dataoutput = new DataOutputStream(socket.getOutputStream());
			while (true) {
				System.out.println(cilient.s.equals("")); // dòng này
				if (cilient.s.equals("")) {} else {
					cilient.p.addtext(cilient.s);
					dataoutput.writeUTF(cilient.s);
					cilient.s = "";
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}



Mình thấy ở hình 3, Console đang chờ nhập tên kìa!

4 Likes


nó vẫn thế ạ, lúc nãy e chụp vội

Đúng là khó hiểu, nhưng còn panel.javasever.java. Trong 2 tập tin đó có liên quan gì đó chứ nhỉ.

4 Likes

Đây là code:

panel.java:

package chat_s;

import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class panel extends JFrame {
	static JScrollPane scpane;
	static JButton button;
	static JTextArea textarea;
	static JTextField textf ;
	public panel() {
	setSize(400, 600);
	setLocation(300, 200);
	setLayout(null);
	setTitle("chat");
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		panel p = new panel();
		
		textarea = new JTextArea();
		textarea.setBounds(0, 0, 300, 500);
		scpane = new JScrollPane(textarea);
		scpane.setBounds(10, 10, 300, 500);
		p.add(scpane);
		button = new JButton("send");
		button.setBounds(50,510 , 70, 30);
		p.add(button);
		textf = new JTextField();
		textf.setBounds(150, 510, 150, 30);
		p.add(textf);
		p.setVisible(true);

	}
	public static void addtext(String str)
	{
		textarea.append(str+"\n");
	}

}

sever.java:

package chat_s;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class server {
	static ArrayList<room> roomlist = new ArrayList<room>();
	
	
	public static void main(String[] args) {
		 String user;
		 String room;
		 room r = null;
		try {
			ServerSocket serversocket = new ServerSocket(7777);
			System.out.println("khoi tao may chu thanh cong!");
			while(true)
			{
				Socket socket = serversocket.accept();
				DataInputStream  dt = new DataInputStream(socket.getInputStream());
				user = dt.readUTF();
				room = dt.readUTF();
				int k=checknameroom(room);
				if(k==roomlist.size())
				{
					r = new room(room);
					r.adduser(user, socket);
					
					roomlist.add(r);
					new tchat(roomlist.size()-1,socket,user).start();
				}else
					{
						update(k,user,socket);
						new tchat(k, socket, user).start();
					}

			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	private static int checknameroom(String name) {
		if(roomlist.size()>0)
		for(int i=0;i<roomlist.size();i++)
		{
			if(roomlist.get(i).name.equals(name))
			{
				return i;
			}
		}
		return roomlist.size();

	}
	private static void update(int k, String nameuser,Socket socket) {

					roomlist.get(k).adduser(nameuser,socket);
		
	}

}

tchat.java:

package chat_s;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Date;

public class tchat extends Thread {
	
	int index;
	Socket socket;String text;
	String user1;
	public tchat(int index,Socket socket , String user ) {
		this.user1 =user;
		this.socket = socket;
		this.index =index;
	}
	@Override
	public void run() {
		try {
			DataInputStream datainput = new DataInputStream(socket.getInputStream());
			
			while(true)
			{
				text=datainput.readUTF();
				System.out.println(text);

				for(user a : server.roomlist.get(index).user)
				{
					System.out.println(a.nameuser);
					if(a.nameuser==user1)
					{
					}else {
					
					DataOutputStream da= new DataOutputStream(a.socket.getOutputStream());
					da.writeUTF(user1+":"+text);
					}
				}
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					
				}
			}
			
		} catch (IOException e) {
			
		}
		

	}


}

Anh và mọi người xem hộ e với, chứ thật sự em nhìn mãi chả ra được cái gì.

Thực sự mình nghĩ không ra lý do. Giữa PrintStream (System.out ) và DataOutPutStream đều kế thừa từ FilterOutputStream.

Nhưng hãy thử dùng DataOutPutStream.flush() xem. Sau mỗi lần bạn writeUTF().

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?