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