[問題] 想請問有關chat room的訊息傳遞問題@@

看板java作者 (OK的啦~我都可以接受)時間17年前 (2008/06/03 14:58), 編輯推噓4(403)
留言7則, 5人參與, 最新討論串1/1
小弟我最近開始練習寫chat room程式 基本的傳訊息, 收訊息都沒有什麼大問題 可是問題來了, 我寫的程式只能夠支援英文和數字的傳送 如果傳送中文, 就會變成??這種亂碼 以下是我用來讀寫socket的code 在伺服器端的程式碼是: import java.io.*; import java.net.*; import java.util.*; public class myChatServer{ public static void main(String[] s){ new myChatServer().go(Integer.parseInt(s[0])); } ArrayList clientOutputStreams; /* this is use to QUIT the server */ class Controller implements Runnable{ BufferedReader reader; public void run(){ reader = new BufferedReader(new InputStreamReader(System.in)); while(true){ System.out.print("Please input youe command : "); try{ if(reader.readLine().equals("QUIT")) System.exit(0); }catch(Exception ex){ ; } } } } class ClientHandler implements Runnable{ BufferedReader reader; Socket sock; public ClientHandler(Socket clientSocket){ try{ sock = clientSocket; // read message form every client reader = new BufferedReader(new InputStreamReader(sock.getInputStream())); }catch(Exception ex){ ex.printStackTrace(); } } public void run(){ String message; try{ while((message = reader.readLine()) != null){ tellEveryone(message); } }catch(Exception ex){ ex.printStackTrace(); } } } // end of inclass public void go(int port){ Thread control = new Thread(new Controller()); control.start(); clientOutputStreams = new ArrayList(); try{ // create the server socket ServerSocket serverSock = new ServerSocket(port); while(true){ // will bock until new client connect Socket clientSocket = serverSock.accept(); // get the new client InputStream PrintWriter writer = new PrintWriter(clientSocket.getOutputStream()); writer.println("Welcome to join this chat room!!"); writer.println("Have a good time :)"); clientOutputStreams.add(writer); // each client we create a thread to handle Thread t = new Thread(new ClientHandler(clientSocket)); t.start(); } }catch(Exception ex){ ex.printStackTrace(); } } public void tellEveryone(String message){ Iterator it = clientOutputStreams.iterator(); while(it.hasNext()){ try{ // send out the message PrintWriter writer = (PrintWriter)it.next(); writer.println(message); writer.flush(); }catch(Exception ex){ ex.printStackTrace(); } } } } 這是client的程式碼: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.net.*; public class myChatClient{ protected JFrame frame; protected JTextField nickName; protected JTextField serverAddr; protected JTextField serverPort; protected JButton button; protected JTextArea message; protected JTextArea typeIn; protected Socket socket = new Socket(); protected BufferedReader reader; protected PrintWriter writer; public static void main(String[] s){ // create the myChatClient Object myChatClient client = new myChatClient(); // client begin to run client.go(); } public void go(){ setupGUI(); setupEventListener(); } protected void setupEventListener(){ button.addActionListener(new buttonListener()); } /* we use button to connect and send message */ class buttonListener implements ActionListener{ public void actionPerformed(ActionEvent event){ if(socket.isConnected()){ String message = nickName.getText() + " > " + typeIn.getText(); try{ writer.println(message); writer.flush(); }catch(Exception ex){ ex.printStackTrace(); } typeIn.setText(""); typeIn.requestFocus(); }else{ connect(); /* cread a thread which use to receive message from server */ Thread readerThread = new Thread(new IncomingReader()); readerThread.start(); ((JButton)event.getSource()).setLabel("Send"); typeIn.setEditable(true); try{ writer.println(nickName.getText() + " has join this chat room"); writer.flush(); }catch(Exception ex){ ex.printStackTrace(); } } //set the thread to receive message from server } } protected void connect(){ try{ // create the socket which connect to server socket = new Socket(serverAddr.getText(), Integer.parseInt(serverPort.getText())); reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); writer = new PrintWriter(socket.getOutputStream()); }catch(IOException ex){ ex.printStackTrace(); } } /* here is just GUI */ protected void setupGUI(){ frame = new JFrame("myChat"); frame.setSize(600, 440); frame.setResizable(false); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel1 = new JPanel(); panel1.add(new JLabel("Nickname")); panel1.add(nickName = new JTextField(5)); panel1.add(new JLabel("Chat Room")); panel1.add(serverAddr = new JTextField(10)); panel1.add(new JLabel("Port Number")); panel1.add(serverPort = new JTextField(5)); frame.getContentPane().add(BorderLayout.NORTH, panel1); JPanel panel2 = new JPanel(); panel2.setBorder(BorderFactory.createTitledBorder("Message")); message = new JTextArea(14, 47); message.setLineWrap(true); message.setWrapStyleWord(true); message.setEditable(false); JScrollPane JScrollPane1 = new JScrollPane(message); JScrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); JScrollPane1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); panel2.add(JScrollPane1); frame.getContentPane().add(BorderLayout.CENTER, panel2); JPanel panel3 = new JPanel(); panel3.setLayout(new BoxLayout(panel3, BoxLayout.X_AXIS)); panel3.setBorder(BorderFactory.createTitledBorder("Your TypeIn")); typeIn = new JTextArea(5, 45); typeIn.setLineWrap(true); typeIn.setEditable(false); panel3.add(new JScrollPane(typeIn)); button = new JButton("Connect"); panel3.add(button); frame.getContentPane().add(BorderLayout.SOUTH, panel3); frame.setVisible(true); } class IncomingReader implements Runnable{ /* we append the received message in the TextArea */ public void run(){ try{ String newMessage; while((newMessage = reader.readLine()) != null){ message.append(newMessage + "\n"); } }catch(Exception ex){ ex.printStackTrace(); } } } } 謝謝各位大大指教<(__)> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.243.43

06/03 15:19, , 1F
設 UTF-8 為 charset, 看 InputStreamReader 和
06/03 15:19, 1F

06/03 15:20, , 2F
PrintWriter 的 API
06/03 15:20, 2F

06/03 15:27, , 3F
我試試看@@ 感謝感謝OTZ
06/03 15:27, 3F

06/03 16:33, , 4F
你不要挑戰作業文條款阿阿阿阿阿
06/03 16:33, 4F

06/03 17:12, , 5F
這是我自己寫的..也不是作業啊...
06/03 17:12, 5F

06/03 20:19, , 6F
跟我的期末proj. 很像
06/03 20:19, 6F

05/16 02:23, , 7F
`朝聖
05/16 02:23, 7F
文章代碼(AID): #18HEkNjW (java)