java 板


LINE

小弟我最近開始練習寫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
1F:推 superlubu:設 UTF-8 為 charset, 看 InputStreamReader 和 06/03 15:19
2F:→ superlubu:PrintWriter 的 API 06/03 15:20
3F:→ king19880326:我試試看@@ 感謝感謝OTZ 06/03 15:27
4F:推 PsMonkey:你不要挑戰作業文條款阿阿阿阿阿 06/03 16:33
5F:→ king19880326:這是我自己寫的..也不是作業啊... 06/03 17:12
6F:推 Nipple5566:跟我的期末proj. 很像 06/03 20:19
7F:推 sunSimon:`朝聖 05/16 02:23







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP