서버
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("서버가 접속을 해제함");
}
}
}
}
==============================================================================================================================================
==============================================================================================================================================
'자바 DB 연동 > 네트워크' 카테고리의 다른 글
네트워크를 이용한 파일전송 (0) | 2013.06.19 |
---|---|
UDP 채팅 프로그램 소스 ( 多 대 多 ) (0) | 2013.06.19 |
객체 직렬화 Serializable (0) | 2013.06.19 |
웹사이트의 소스보는 소스 (0) | 2013.06.19 |