Loading [MathJax]/extensions/MathZoom.js

2014年8月6日水曜日

Javaで作るシンプルなテキストチャット

WebSocketを実装しようとしたけど、双方向なプロトコルをいきなり作るのは大変そうだったので大昔に研修で見たことがあるようなテキストチャットをまず作ってみた。意外とクライアントがインプットとアウトプットでスレッドを分けないといけなかったので大変だった。ただクライアントだけが接続が切れた場合に例外が発生したりするので、タイミングによる制御が大切になってきそう。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
public class ChatClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket();
socket.connect(new InetSocketAddress("localhost", 5000));
new Thread(new InputThread(socket)).start();
new Thread(new OutputThread(socket)).start();
}
}
class InputThread extends Thread {
Socket socket;
public InputThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
while (socket.isConnected()) {
InputStreamReader cin = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(cin);
String buf = br.readLine();
printWriter.println(buf);
printWriter.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class OutputThread extends Thread {
Socket socket;
public OutputThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
while (socket.isConnected()) {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message;
while ((message = br.readLine()) != null) {
System.out.println(message);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
view raw ChatClient.java hosted with ❤ by GitHub
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.Set;
public class ChatServer {
private static Set<Socket> socketSet = new HashSet<Socket>();
private static ServerSocket serverSocket;
public static Set<Socket> getSocketSet() {
return socketSet;
}
public static void main(String[] args) throws IOException {
serverSocket = new ServerSocket(5000);
while (!serverSocket.isClosed()) {
Socket socket = serverSocket.accept();
socketSet.add(socket);
new Thread(new ServerThread(socket)).start();
}
}
}
class ServerThread extends Thread {
Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
while (socket.isConnected()) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message = br.readLine();
System.out.println(Thread.currentThread().getId() + " " + message);
synchronized (this) {
for (Socket socket : ChatServer.getSocketSet()) {
if (!this.socket.equals(socket)) {
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
printWriter.println(message);
printWriter.flush();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
view raw ChatServer.java hosted with ❤ by GitHub

0 件のコメント: