본문 바로가기

자바 DB 연동/네트워크

TCP 채팅 프로그램 - 서버 / 클라이언트(1:1 and 1:多)

서버


import java.awt.BorderLayout;

import java.awt.Component;

import java.awt.Frame;

import java.awt.TextArea;

import java.awt.TextField;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;


public class ChatServer extends Frame implements ActionListener, Runnable { // 이벤트를 처리하기 위한 액션뭐시기, 보내기 받기를 동시에 하기 위한 러너블 쓰레드 

private static final long serialVersionUID = 1L;

private TextArea ta=new TextArea();

private TextField tf=new TextField();

private int port=8000; //포트번호 -> 해당프로세스를 찾아가는 길

private ServerSocket ss;

private Socket sc;

public ChatServer(){

add(ta,BorderLayout.CENTER);

add(tf,BorderLayout.SOUTH);

tf.addActionListener(this);

addWindowListener(new WindowAdapter() {

@Override

public void windowClosing(WindowEvent arg0) {

System.exit(0);

}

});

setTitle("채팅 서버...");

setSize(400,500);

setVisible(true);

}

//네트워크 핵심 메소드

public void serverStart(){

try{

//서버소켓을 생성한다.  1.

ss=new ServerSocket(port);

ta.setText("서버 시작....\n");

//클라이언트가 접속해서 들어오기를 기다린다. 2      //클라이언트가 접속할때까지 접속이 멈춰있다가 클라이언트 접속시 깨어난다.

sc=ss.accept();

//클라이언트가 접속하면 스레드를 실행한다.

Thread th=new Thread(this);

th.start(); // => run메소드로 넘어간다

}catch(Exception e){

System.out.println(e.toString());

}

}


public static void main(String[] args) {

ChatServer cs=new ChatServer();

cs.serverStart();

}


@Override

public void run() {

String ip=null;

String str;

try{

// 접속한 클라이언트가 없으면

if(sc==null)

return;

// 접속한 클라이언트의 IP주소 얻기

ip=sc.getInetAddress().getHostAddress();

ta.append(ip+ " 에서 서버에 접속함..\n");

//클라이언트가 보낸정보를 읽어 들이는 입력 스트림

BufferedReader br=new BufferedReader

(new InputStreamReader(sc.getInputStream()));

//클라이언트의 정보를 읽어 들인다.

while((str=br.readLine())!=null){

ta.append(str+"\n");

}

}catch(Exception e){

//클라이언트가 접속을 해제 한 경우

ta.append(ip+" 가 접속을 해제하였습니다.");

sc=null;

}

}


@Override

public void actionPerformed(ActionEvent e) {

Component comp=(Component)e.getSource();

if(comp instanceof TextField){

String s=tf.getText().trim();

if(s.length()==0)

return;

try{

//클라이언트와 접속이 안되면

if(sc==null)

return;

//서버가 채팅문자열을 클라이언트에게 보낸다

//데이터를 전솔할 때는 출력 스트림을 이용한다.

PrintWriter pw=new PrintWriter(sc.getOutputStream(), true);

pw.println("서버] "+s); //ln을 해야 정보가 넘어간다.

ta.append("보냄]"+s+"\n");

tf.setText("");

tf.requestFocus();

}catch(Exception e2){

ta.append("클라이언트가 접속을 해제함");

}

}

}

}


==============================================================================================================================================


1:1 클라이언트


import java.awt.BorderLayout;

import java.awt.Component;

import java.awt.Frame;

import java.awt.TextArea;

import java.awt.TextField;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;


public class ChatClient extends Frame implements ActionListener, Runnable{

private static final long serialVersionUID = 1L;


private TextArea ta=new TextArea();

private TextField tf=new TextField();

private int port=8000;

private String addr="1.232.2.136"; // 서버의 아이피주소

private String name="Name";

private Socket sc;

public ChatClient(){

add(ta,BorderLayout.CENTER);

add(tf,BorderLayout.SOUTH);

tf.addActionListener(this);

addWindowListener(new WindowAdapter() {

@Override

public void windowClosing(WindowEvent arg0) {

System.exit(0);

}

});

setTitle("채팅 클라이언트...");

setSize(400,500);

setVisible(true);

}

public static void main(String[] args) {

new ChatClient().connect();


}

//클라이언트 핵심 메소드

public void connect() {

// 서버에 접속한다.

try{

sc=new Socket(addr,port); // 아이피와 포트를 적어준다

ta.setText("서버에 연결함...\n");

Thread th=new Thread(this);

th.start();

}catch(Exception e){

sc=null;

ta.setText(" 서버 연결중 오류 발생..\n");

}

}


@Override

public void run() {

String str;

try{

if(sc==null)

return;

BufferedReader br=new BufferedReader

(new InputStreamReader(sc.getInputStream()));

while((str=br.readLine())!=null){

ta.append(str+"\n");

}

}catch(Exception e){

ta.append("서버가 연결을 해제함...\n");

sc=null;

}

}


@Override

public void actionPerformed(ActionEvent e) {

Component comp=(Component)e.getSource();

if(comp instanceof TextField){

String s=tf.getText().trim();

if(s.length()==0)

return;

try{

// 서버에 연결되지 않은 경우

if(sc==null)

return;

//서버에 데이터 전송하기

PrintWriter pw=new PrintWriter(sc.getOutputStream(), true);

pw.println(name+"]"+s);

ta.append("보냄]"+s+"\n");

tf.setText("");

tf.requestFocus();

}catch(Exception e2){

ta.append("서버가 접속을 해제함");

}

}

}

}



==============================================================================================================================================


 1:다 채팅(서버)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;

// 1:다 채팅(서버)
public class ChatMultiServer {
// 클라이언트 소켓 객체를 저장하기 위한 객체
private Vector<Socket> client=new Vector<Socket>();
// 내부 스레드 클래스
class Worker extends Thread {
private Socket sc=null;
public Worker(Socket sc) {
this.sc=sc;
}
public void run() {
String ip=null;
String str;
try {
// 접속한 클라이언트를 백터에 저장한다.
client.add(sc);
// 접속 클라이언트의 ip
ip=sc.getInetAddress().getHostAddress();
// 클라이언트의 정보를 읽어 들이기 위한 입력 스트림
BufferedReader br=new BufferedReader(
new InputStreamReader(sc.getInputStream()));
// 다른 클라이언트에게 접소 사실을 알림
str=ip+" 입장 !!!";
for(Socket s : client) {
if(sc==s)
continue;
PrintWriter pw=new PrintWriter(
s.getOutputStream(), true);
pw.println(str);
}
System.out.println(str);
// 클라이언트가 보낸 메시지 일기
while((str=br.readLine())!=null) {
// 다른 클라이언트에게 전송
for(Socket s: client) {
if(sc==s)
continue;
PrintWriter pw=new PrintWriter(
s.getOutputStream(), true);
pw.println(str);
}
}
} catch (Exception e) {
str=ip+" 퇴장...";
System.out.println(ip);
try {
// 다른 클라이언트에게 퇴장 사실 알림
for(Socket  s: client) {
if(s==sc)
continue;
PrintWriter pw=new PrintWriter(
s.getOutputStream(), true);
pw.println(str);
}
} catch (Exception e2) {
System.out.println(e2.toString());
}
client.remove(sc);
sc=null;
}
}
}
public void serverStart() {
ServerSocket ss=null;
try {
ss=new ServerSocket(8000);
System.out.println("서버 시작...");
while(true) {
// 클라이언트가 접속해서 들어오기를 대기함
Socket sc=ss.accept();
// 접속한 클라이언트를 처리하기 위한  스레드 객체
Worker th=new Worker(sc);
th.start();
}
} catch (Exception e) {
System.out.println(e.toString());
}
}
public static void main(String[] args) {
new ChatMultiServer().serverStart();
}
}

==============================================================================================================================================