본문 바로가기
[ Web ]/JAVA_JSP_TOMCAT_Eclipse

java 소켓 채팅 소스

by 관이119 2012. 9. 13.

 http://blog.naver.com/nobelbox/110020489631

http://blog.naver.com/nobelbox/110020489631

 

===== Server 부문 ========================================================

package socket;

import java.io.*;
import java.net.*;
import java.util.*;

public class SimpleChatServer {
ServerSocket srvsocket = null;
Socket consocket = null;
int port = 5555;

// 접속한 클라이언트 목록을 저장한다.
Vector vClients = new Vector();

/*새로운 클라이언트 접속을 기다려 서비스 스레드를 발생한다.*/
public void doJob() {
try {
// 소켓서버를 만든다.
srvsocket = new ServerSocket( port );
System.out.println("SimpleChatServer 호스트 " + srvsocket.getInetAddress()
+ " 포트 : " + port + "에 바인드 되었습니다." );

while( true ) {
// 클라이언트의 접속을 기다린다.
consocket = srvsocket.accept();

// 새로운 채팅 서비스 쓰레드를 만들고 실행한다.
ChatService service = new ChatService(consocket, this);
service.start();
}
} catch(IOException ioe) {
System.out.println("SimpleChatServer.java IOException");
} finally {
System.out.println("서버를 종료합니다.");
try {
if( srvsocket != null )
srvsocket.close();
} catch(Exception ex2) { }
}
}

/**
* 접속한 모든 클라이언트에 메시지를 보낸다
* @param msg
*/
public synchronized void broadcast(String msg) {
for(int i=0; i<vClients.size(); i++) {
ChatService client = ((ChatService) vClients.elementAt(i));
client.sendMessage(msg);
}
}

/**
* 접속 리스트에 클라이언트를 더한다.
* @param cs
*/
public synchronized void addClient(ChatService cs) {
vClients.add(cs);
System.out.println("새로운 클라이언트 접속, 현재 총 " + vClients.size() + "개 클라이언트");
}

/**
* 접속 리스트에서 클라이언트를 제거한다.
* @param cs
*/
public synchronized void removeClient(ChatService cs) {
vClients.remove(cs);
System.out.println("클라이언트 종료, 현재 총 " + vClients.size() + "개 클라이언트");
}

public static void main(String[] args) {
SimpleChatServer server = new SimpleChatServer();
server.doJob();
}

}

package socket;

import java.io.*;
import java.net.*;
import java.util.*;

class ChatService extends Thread {
Socket xSocket = null;
SimpleChatServer xServer = null;

/*입출력 스트림*/
PrintWriter out = null;
BufferedReader in = null;

public ChatService(Socket sock, SimpleChatServer srv) {
super();
xSocket = sock;
xServer = srv;
}

/*출력 스트림에 메시지를 보낸다.*/
public synchronized void sendMessage(String msg) {
if(out != null) out.println(msg);
}

public void run() {
String line;

try {
/*입출력 스트림을 만든다.*/
out = new PrintWriter(xSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(xSocket.getInputStream()));

/*접속 리스트에 클라이언트를 추가한다.*/
xServer.addClient(this);

/*클라이언트가 보내준 메시지를 다른 모든 클라이언트에 보낸다.*/
while( (line = in.readLine()) != null ) {
xServer.broadcast(line);
}
} catch (IOException ioe) {
System.out.println("ChatService.java IOException");
} finally {
try {
/*접속 리스트레엇 클라이언트를 제거한다.*/
xServer.removeClient(this);

/*모든 스트림과 소켓을 닫는다*/
if( out != null ) out.close();
if( in != null ) in.close();
if( xSocket != null ) xSocket.close();
} catch(Exception e) { System.out.println(e); }
}
}
}

===== Client 부문 ========================================================

package socket;

import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class SimpleChatClient extends Frame implements Runnable {
/* 소켓과 포트버호*/
Socket xSocket = null;
int port = 5555;

String strUserName = "아무게" ;

/*대화내용 출력창과 입력창*/
TextArea xOutputArea = new TextArea();
TextField xInputField = new TextField();

/*입출력 스트림*/
PrintWriter streamOut = null;
BufferedReader streamIn = null;

/*서버로부터의 입력 스트림을 처리할 스레드*/
Thread xThreadInput = null;
boolean qStop = false;

public SimpleChatClient(String title) {
super(title);

/*화면구성*/
setLayout(new BorderLayout());

xOutputArea.setEditable(false);
add(xOutputArea, BorderLayout.CENTER);
add(xInputField, BorderLayout.SOUTH);

/*사용자가 내용을 입력했을 경우 출력 스트림을 통해 출력한다.*/
xInputField.addActionListener (
new ActionListener() {
public void actionPerformed(ActionEvent ev) {
if(streamOut != null) {
sendMessage( "["+strUserName+"]"+xInputField.getText());
xInputField.setText("");
}
}
}
);

addWindowListener (
new WindowAdapter() {
public void windowClosing(WindowEvent ev) {
System.exit(0);
}
}
);

}

private void connect(String server, String user) {
// TODO 자동 생성된 메소드 스텁
try
{
/*소켓과 스레드를 만든다.*/
strUserName = user;
xSocket = new Socket(server, port);
streamOut = new PrintWriter(xSocket.getOutputStream(), true);
streamIn = new BufferedReader(
new InputStreamReader(xSocket.getInputStream()));

sendMessage("#새로운 사용자 [" +strUserName + "] 이(가) 들어왔습니다.");

/*서버로부터의 입력을 처리할 스레드를 만들어 실행시킨다.*/
xThreadInput = new Thread(this);
xThreadInput.start();

} catch(Exception ex) {
System.out.println(ex);
}
}

private synchronized void sendMessage(String msg) {
streamOut.println(msg);
}

private synchronized void addMessage(String msg) {
xOutputArea.append(msg);
}

public void run() {
try {
while(qStop == false)
{
// 서버로부터 메시지를 읽어 화면에 출력한다.
addMessage(streamIn.readLine());
}
} catch(IOException e) {
e.printStackTrace();
}
}




/*메인함수*/
public static void main(String[] args) {
if(args.length < 2) {
System.out.println("Usage: java SimpleChatyClient (Server) (port)");
return;
}

SimpleChatClient client = new SimpleChatClient("SimpleChat");
client.pack();
client.setSize(400,300);
client.setVisible(true);

client.connect(args[0], args[1]);
}
}

댓글