package netdemo.chat;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.net.*;
import java.util.Scanner;
public class ChatClient implements Runnable {
private int id;
private Socket socket;
public static final String HOST = "127.0.0.1"; //表示要连接的服务器地址
public static final int PORT = 12345; //服务器监听的端口号
public void connect() {
try {
socket = new Socket(HOST, PORT);
new Thread(this).start();
} catch (Exception e) {
e.printStackTrace();
}
}
public void receiveMessage() {
if(socket == null || socket.isClosed()) {
return;
}
try {
InputStream is = socket.getInputStream();
if(is.available() > 0) {
ObjectInputStream ois = new ObjectInputStream(is);
Object obj = ois.readObject();
if(obj instanceof Message) {
Message message = (Message)obj;
this.handleMessage(message);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void handleMessage(Message message) {
switch(message.getType()) {
case Message.MESSAGE_TYPE_WELCOME:
System.out.println("收到服务器欢迎消息:" + message.getContent());
System.out.println("服务器给我的编号是:" + message.getReceiverId());
id = message.getReceiverId();
break;
case Message.MESSAGE_TYPE_ONLINE:
System.out.println("客户端" + message.getContent() + "上线了.");
break;
case Message.MESSAGE_TYPE_CHAT_TO_CLEINT:
System.out.println("接收以由服务器转发过来的消息: 发送人:" + message.getSenderId()
+ ", 消息内容:" + message.getContent());
break;
}
}
public void sendMessage() {
try {
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream()));
Scanner scanner = new Scanner(System.in);
while(true) {
String line = scanner.nextLine();
System.out.print("read from console: " + line);
if("exit".equals(line)) {
break;
}
if(line.indexOf(":") <= 0) {
continue;
}
String[] strs = line.split(":");
int receiverId = Integer.parseInt(strs[0]);
String content = strs[1];
Message message = new Message();
message.setContent(content);
message.setReceiverId(receiverId);
message.setSenderId(id);
if(receiverId == -1) {
message.setType(Message.MESSAGE_TYPE_CHAT_TO_SERVER);
} else {
message.setType(Message.MESSAGE_TYPE_CHAT_TO_CLEINT);
}
try {
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(message);
oos.flush();
System.out.println("把消息通过服务器转发到客户端:" + receiverId);
} catch (IOException e) {
e.printStackTrace();
}
}
close();
} catch (IOException e) {
}
}
public void close() {
if(socket != null && ! socket.isClosed()) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
ChatClient client = new ChatClient();
client.connect();
client.sendMessage();
}
public void run() {
while(true) {
try {
receiveMessage();
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}