java network programming
package JavaStudy;
/**
* @file name : TcpIpMultichatServer.java
* @date : 2013. 9. 29.
* @discription : 채팅프로그램 - 서버
*
*/
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
/**
* @author Cremazer(cremazer@gmail.com)
*/
public class TcpIpMultichatServer {
HashMap clients;
TcpIpMultichatServer() {
clients = new HashMap();
Collections.synchronizedMap(clients);
}
public void start() {
ServerSocket serverSocket = null;
Socket socket = null;
try {
serverSocket = new ServerSocket(7777);
System.out.println("서버가 시작되었습니다.");
while (true) {
socket = serverSocket.accept();
System.out.println("[" + socket.getInetAddress() + ":"
+ socket.getPort() + "]" + "에서 접속하였습니다.");
ServerReceiver thread = new ServerReceiver(socket);
thread.start();
}
} catch (Exception e) {
e.printStackTrace();
}
} // start()
void sendToAll(String msg) {
Iterator it = clients.keySet().iterator();
while (it.hasNext()) {
try {
DataOutputStream out = (DataOutputStream) clients
.get(it.next());
out.writeUTF(msg);
} catch (IOException e) {
}
} // while
} // sendToAll
public static void main(String args[]) {
new TcpIpMultichatServer().start();
}
class ServerReceiver extends Thread {
Socket socket;
DataInputStream in;
DataOutputStream out;
ServerReceiver(Socket socket) {
this.socket = socket;
try {
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
}
}
public void run() {
String name = "";
try {
name = in.readUTF();
sendToAll("#" + name + "님이 들어오셨습니다.");
clients.put(name, out);
System.out.println("현재 서버접속자 수는 "
+ clients.size() + "입니다.");
while (in != null) {
sendToAll(in.readUTF());
}
} catch (IOException e) {
// ignore
} finally {
sendToAll("#" + name + "님이 나가셨습니다.");
clients.remove(name);
System.out.println("[" + socket.getInetAddress() + ":"
+ socket.getPort() + "]"
+ "에서 접속을 종료하였습니다.");
System.out.println("현재 서버접속자 수는 "
+ clients.size() + "입니다.");
} // try
} // run
} // ReceiverThread
}
package JavaStudy;
/**
* @file name : TcpIpMultichatClient.java
* @date : 2013. 9. 29.
* @discription : 채팅 프로그램 - 클라이언트
*
*/
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ConnectException;
import java.net.Socket;
import java.util.Scanner;
/**
* @author Cremazer(cremazer@gmail.com)
*/
public class TcpIpMultichatClient {
public static void main(String args[]) {
if (args.length != 1) {
System.out.println("USAGE: java TcpIpMultichatClient 대화명");
System.exit(0);
}
try {
String serverIp = "127.0.0.1";
// 소켓을 생성하여 연결을 요청한다.
Socket socket = new Socket(serverIp, 7777);
System.out.println("서버에 연결되었습니다.");
Thread sender = new Thread(new ClientSender(socket, args[0]));
Thread receiver = new Thread(new ClientReceiver(socket));
sender.start();
receiver.start();
} catch (ConnectException ce) {
ce.printStackTrace();
} catch (Exception e) {
}
} // main
static class ClientSender extends Thread {
Socket socket;
DataOutputStream out;
String name;
ClientSender(Socket socket, String name) {
this.socket = socket;
try {
out = new DataOutputStream(socket.getOutputStream());
this.name = name;
} catch (Exception e) {
}
}
public void run() {
Scanner scanner = new Scanner(System.in);
try {
if (out != null) {
out.writeUTF(name);
}
while (out != null) {
out.writeUTF("[" + name + "]" + scanner.nextLine());
}
} catch (IOException e) {
}
} // run()
}
static class ClientReceiver extends Thread {
Socket socket;
DataInputStream in;
ClientReceiver(Socket socket) {
this.socket = socket;
try {
in = new DataInputStream(socket.getInputStream());
} catch (IOException e) {
}
}
public void run() {
while (in != null) {
try {
System.out.println(in.readUTF());
} catch (IOException e) {
}
}
} // run
}
}