서버 -> 클라이언트
package kr.co.kihd.echo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
public class EchoServerTest {
public static void main(String[] args) {
int port = 7070;
ServerSocket serverSocket = null;
Socket socket = null;
//서버소켓 생성
try {
serverSocket = new ServerSocket(port);
System.out.println("접속 대기중");
socket = serverSocket.accept();
System.out.println(socket.getLocalPort() + "포트와 클라이언트"
+socket.getInetAddress() + "과 접속이 되었습니다.");
OutputStream out = socket.getOutputStream();//클라이언트와 통신하기 위한 스트림을 생성
PrintWriter pout = new PrintWriter(out, true); //flush()기능 자동으로 제공
pout.println("하이!!");
InputStream ins = socket.getInputStream();
InputStreamReader inR = new InputStreamReader(ins);
BufferedReader bffR = new BufferedReader(inR);
String clientMsg = "";
while( (clientMsg = bffR.readLine()) != null) {
if(clientMsg.startsWith("안녕") || clientMsg.startsWith("하이")) {
pout.println(socket.getInetAddress() + "님 반갑습니다.");
}
else if(clientMsg.startsWith("오늘은 몇일")) {
Date today = new Date();
pout.println(today.toString());
}
}
out.close(); pout.close(); socket.close(); serverSocket.close(); //반드시 넣어줌
} catch (IOException e) {
e.printStackTrace();
}
}
}
package kr.co.kihd.echo;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class EchoClientTest {
public static void main(String[] args) throws Exception {
String ip = "192.168.100.145";
int port = 7070;
//소켓 생성
Socket socket = new Socket(ip, port);
System.out.println("서버와 접속이 되었습니다.");
//서버로부터 데이터를 입력받는 스트림
InputStream ins = socket.getInputStream(); //주스트림
InputStreamReader isr = new InputStreamReader(ins); //보조스트림
BufferedReader bff = new BufferedReader(isr); //버퍼 3개 연결
OutputStream ous = socket.getOutputStream();
PrintWriter pout = new PrintWriter(ous, true);
//키보드로부터 데이터를 입력받는 스트림
InputStreamReader inR = new InputStreamReader(System.in);
BufferedReader pout2 = new BufferedReader(inR);
String serverMsg = "", sendMsg = "";
serverMsg = bff.readLine(); //서버에서 읽음.
System.out.println("서버메시지 >" + serverMsg); //서버에서 불러온 메시지
while((sendMsg=pout2.readLine()) != null) {
pout.println(sendMsg);
serverMsg = bff.readLine();
System.out.println("서버메시지 >" + serverMsg);
}
bff.close(); socket.close(); isr.close(); ins.close();
}
}
서버와 접속이 되었습니다.
서버메시지 >하이!!
오늘은 몇일
서버메시지 >Thu Dec 03 09:44:19 KST 2020
1 대 1로 대화하는 서버 클라이언트
package kr.co.kihd.chatting;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ChattingServer implements Runnable{
Socket sk;
public ChattingServer() {
try {
ServerSocket ssk = new ServerSocket(6060);
//클라이언트와 통신하는 소켓 생성됨.
sk = ssk.accept();
System.out.println("클라이언트와 연결이 되었습니다.");
//클라이언트에게 데이터를 보내기위한 스트림 생성
//표준입력인 키보드와 연결
InputStreamReader inR = new InputStreamReader(System.in);
BufferedReader buR = new BufferedReader(inR);
//클라이언트에게 메세지를 보내기위한 스트림 생성
//자동 flush처리
PrintWriter pout = new PrintWriter(sk.getOutputStream(),true);
Thread thread = new Thread(this); //자기자신을 스레드로 만듬.
thread.start();
String msg = "";
while( (msg = buR.readLine())!= null) {
pout.println(msg);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}//생성자
public static void main(String[] args) {
new ChattingServer();
}
//받는 메시지 처리는 스레드로 함
@Override
public void run() {
//클라이언트 메시지를 받아서 콘솔에 출력하는 기술
InputStream ins;
try {
ins = sk.getInputStream();
InputStreamReader ir = new InputStreamReader(ins);
BufferedReader buR = new BufferedReader(ir);
String clientMsg ="";
while(true) {
clientMsg = buR.readLine();
System.out.println("Client > " + clientMsg);
}//while
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package kr.co.kihd.chatting;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class ChattingClient implements Runnable {
String ip = "192.168.100.145";
int port = 6060;
Socket sk;
public ChattingClient() {
try {
sk = new Socket(ip, port);
System.out.println("채팅서버와 연결되었습니다.");
//서버로 보낼 메세지를 키보드로 입력받는 스트림 생성
InputStreamReader inR = new InputStreamReader(System.in);
BufferedReader buR = new BufferedReader(inR);
//서버로 보낼메시지를 위한 스트림.
PrintWriter pout = new PrintWriter(sk.getOutputStream(), true);
Thread thread = new Thread(this);
thread.start();
String sendMsg = "";
while( (sendMsg = buR.readLine()) != null) {
pout.println(sendMsg);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}//생성자
public static void main(String[] args) {
new ChattingClient();
}
//받는 메시지 처리는 스레드로 함
@Override
public void run() {
InputStream ins;
try {
ins = sk.getInputStream();
BufferedReader buR = new BufferedReader(new InputStreamReader(ins));
String svrMsg = "";
while(true) {
svrMsg = buR.readLine();
System.out.println("Server > " + svrMsg);
//서로 상대방이 입력한 것을 콘솔창에 출력
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
클라이언트와 연결이 되었습니다.
안녕하세요
Client >
Client > 네안녕하세요
1 대 다수로 대화하는 서버 클라이언트 GUI
package kr.co.kihd.multichatting;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class ChatServer {
private ServerSocket ss;
//후입선출 자료구조에 add를 해놓기 위해서
private ArrayList<ChatHandler> list;
public ChatServer() throws Exception {
try {
ss = new ServerSocket(9900);
System.out.println("클라이언트 연결 대기중....");
list = new ArrayList<ChatHandler>();
while(true) {
Socket socket = ss.accept();
//스레드 생성
ChatHandler handler = new ChatHandler(socket, list);
handler.start(); //통신이 가능하도록 스레드 시작.
list.add(handler); //클라이언트 추가 LIFO 구조
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}//생성자
public static void main(String[] args) throws Exception {
new ChatServer();
}
}
package kr.co.kihd.multichatting;
//멀티클라이언트 생성위해서. 소켓역할을 함.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
public class ChatHandler extends Thread{
private Socket socket;
private BufferedReader br;
private PrintWriter pw;
private ArrayList<ChatHandler> list;
//생성자 오버로딩
public ChatHandler(Socket socket, ArrayList<ChatHandler> list) throws Exception {
this.socket = socket;
this.list = list;
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
System.out.println("클라이언트 연결");
}
@Override
public void run() {
try {
String nickName = br.readLine();
broadcast(nickName + "님이 입장하셨습니다.");
//읽기 - 같은방에 있는 사람들에게 브로드케스팅.
String line = null;
while(true) {
line = br.readLine();
if(line == null || line.toLowerCase().equals("exit")) {
break;
}
broadcast("[" +nickName+ "]" + line );
}//while
//끝날때
pw.println("exit");
pw.flush();
list.remove(this);
broadcast(nickName + "님이 퇴장하였습니다.");
br.close(); pw.close(); socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void broadcast(String msg) {
for(ChatHandler handler : list) {
handler.pw.println(msg);
handler.pw.flush();
}
}
}
package kr.co.kihd.multichatting;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.ScrollPane;
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.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.plaf.basic.BasicArrowButton;
public class ChatClient extends JFrame implements Runnable, ActionListener{
private JTextField input;
private JTextArea output;
private JButton send;
private Socket socket;
private BufferedReader br;
private PrintWriter pw;
public ChatClient() {//화면 구성
input = new JTextField(15);
output = new JTextArea();
JScrollPane scroll = new JScrollPane(output); //항상 스크롤이 표시되도록.
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
output.setEditable(false); //수정이 되지 않게
send = new JButton("보내기");
//위치 설정
JPanel p = new JPanel(new BorderLayout());
p.add("Center", input);
p.add("East", send);
Container c = this.getContentPane();
c.add("Center", scroll);
c.add("South", p);
setBounds(500, 150, 500, 500);
setVisible(true);
//클로징 원하는것만 오버라이딩 Adapter
addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
pw.println("exit");
pw.flush();
}
});
}
//클라이언트 객체 생성후 바로 실행되는 코드
public void service() {
//서버IP
String serverIP =
JOptionPane.showInputDialog(this, "서버IP를 입력하세요", "192.168.100.145");
if(serverIP == null || serverIP.length() == 0) {
System.out.println("서버IP가 입력되지 않았습니다. 서버연결을 종료합니다.");
System.exit(0);
}
//닉네임
String nickName =
JOptionPane.showInputDialog(this, "닉네임을 입력하세요.", "닉네임", JOptionPane.INFORMATION_MESSAGE);
if(nickName == null || nickName.length() == 0) {
nickName = "guest";
}
//소켓생성
try {
socket = new Socket(serverIP, 9900);
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
//서버에 보내기
pw.println(nickName);
pw.flush();
} catch (UnknownHostException e) {
System.out.println("서버를 찾을수 없습니다.");
e.printStackTrace();
} catch (IOException e) {
System.out.println("서버와 연결에 실패하셨습니다.");
e.printStackTrace(); //스택에 담아있는 메서드를 출력 : 어디서 문제가 있는지 확인
}
//이벤트 -> input send 리스너 연결
send.addActionListener(this);
input.addActionListener(this);
//스레드 생성
Thread thread = new Thread(this);
thread.start(); //run호출
}
public static void main(String[] args) {
new ChatClient().service();
}
@Override
public void run() {
// 서버로부터 받는쪽
String line = null;
while(true) {
try {
line = br.readLine();
if(line == null || line.toLowerCase().equals("exit")) {
br.close(); pw.close(); socket.close();
System.exit(0);
}
} catch (IOException e) {
e.printStackTrace();
}
// line을 textarea에 append한다.
// 사용자로 부터 입력받은 내용을 JTextArea에 붙여준다.
output.append(line + "\n");
//글이 자동으로 맨아래로 스크롤링됨.
int pos = output.getText().length();
output.setCaretPosition(pos);
}//while
}
@Override
public void actionPerformed(ActionEvent e) {
//서버로 보내기
String line = input.getText();
pw.println(line);
pw.flush();
input.setText("");
}
}