[問題] 想請問有關chat room的訊息傳遞問題@@
小弟我最近開始練習寫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
06/03 15:19, 1F
→
06/03 15:20, , 2F
06/03 15:20, 2F
→
06/03 15:27, , 3F
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
06/03 20:19, 6F
推
05/16 02:23, , 7F
05/16 02:23, 7F