여기서 HumanList라고 잇다?
거기에서 사용자들을 띄우고 싶은데 잘안되네.. 도와주세여ㅛ 굽신굽신..
-----------------------------서버------------------------------------
package ex;
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
public class GUIChatServer extends Frame implements ActionListener {
Button btnExit;
Button bt_connect;
TextArea ta;
Vector vChatList;
ServerSocket ss;
Socket sockClient;
TextField txt_port;
int port;
CardLayout cl; // 카드 레이아웃 선언
Boolean start=false;
String name[]; //이름을 저장하는 배열.
int size;
public GUIChatServer() {
setTitle("GUI 채팅 서버 ver 1.0");
Font win_font = new Font("", Font.BOLD, 12); // 글씨 스타일 진하게
setFont(win_font);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose(); // 자원 반납후 프레임 닫기
}// windowClosing
});// X 클릭시 종료
cl = new CardLayout();
setLayout(cl);
name= new String[10];
Panel port_= new Panel();
port_.setBackground(Color.DARK_GRAY);// 밝은 회색으로 설정
port_.setLayout(new BorderLayout());
bt_connect = new Button("서버 시작"); // 서버 접속 버튼 생성
bt_connect.addActionListener(this);
txt_port = new TextField("1000", 15);
Panel port_set = new Panel();
port_set.add(new Label("Port Number : "));
port_set.add(txt_port);
port_set.add(bt_connect);
vChatList = new Vector();
Panel ing = new Panel();
btnExit = new Button("서버 종료");
btnExit.addActionListener(this);
ta = new TextArea();
ing.add(ta, BorderLayout.CENTER);
ing.add(btnExit, BorderLayout.SOUTH);
setBounds(300, 300, 500, 450);
add(port_set, "포트 설정");
add(ing, "서버 동작");
cl.show(this, "포트 설정");
setVisible(true);// 보이기
chatStart(); // 채팅 메소드 시작
}// 생성자
public void chatStart() { // 채팅 시작
try {
while(true){
if(start==true)
break;
}
port=Integer.parseInt(txt_port.getText());
ss = new ServerSocket(port);// 포트번호
while (true) { // 무한 반복
sockClient = ss.accept(); // 클라이언트 올 때마다 소켓 생성
ta.append(sockClient.getInetAddress().getHostAddress()+ "님이 접속하셨습니다.\\n");
ChatHandle threadChat = new ChatHandle();// 한명씩 처리
vChatList.add(threadChat);// 리스트에 담는다.
threadChat.start(); // ChatHandle 쓰레드 시작
}// while
} catch (Exception e) {
e.printStackTrace();
}// catch
}// ServerStart
public void actionPerformed(ActionEvent e) {
try{
Object obj=e.getSource();
if(obj==btnExit){
dispose(); // 윈도우 자원 반납후 닫기
}
else if(obj==bt_connect){ //서버접속키를 눌럿을때.
cl.show(this, "서버 동작");
start=true;
}
}
catch(Exception ex){
ex.printStackTrace();
}
// 서버 종료 버튼 클릭시
}// actionPerformed
public static void main(String[] args) {
new GUIChatServer();
}// main
// 클라이언트 채팅을 처리하는 Thread 를 상속받은 내부 클래스
class ChatHandle extends Thread {
BufferedReader br = null; // 입력 담당
PrintWriter pw = null; // 출력 담당
public ChatHandle() {
try {
InputStream is = sockClient.getInputStream();// 입력
br = new BufferedReader(new InputStreamReader(is));
OutputStream os = sockClient.getOutputStream();// 출력
pw = new PrintWriter(new OutputStreamWriter(os));
} catch (IOException e) {
e.printStackTrace();
}// catch
}// 내부 클래스의 기본 생성자
public void sendAllClient(String msg) {// 모두에게 채팅 내용 전송
try {
int size = vChatList.size();// 채팅 사용자의 수를 얻는다.
for (int i = 0; i < size; i++) {
// 반복문을 돌면서 한 사람씩 채팅 내용을 보낸다.
ChatHandle chr = (ChatHandle) vChatList.elementAt(i);
chr.pw.println(msg); // 사용자 한 사람의 채팅 내용 전송
chr.pw.flush(); // 버퍼의 내용을 즉시 전송하라.
}// for
} catch (Exception e) {
e.printStackTrace();
}// catch
}// send_All
public void run()
{
try
{
Boolean id_ch=false;
while (!id_ch)
{
size = vChatList.size();// 채팅 사용자의 수를 얻는다.
name[size-1]= br.readLine(); //서버로부터 아이디를 입력받는다.
id_ch=true;
if(size==1)
{
pw.println("0");//첫 사람은 아이디 중복 체크가 필요없으니까 0을 보내준다.
pw.flush();
sendAllClient(name[size-1] + " 님께서 새로 입장했습니다");
}
for (int i = 0; i < size-1; i++)
{
if (name[size-1].equals(name[i]))
{ //만약 이전 사용자와 아이디가 같다면 1을 보낸다.
id_ch=false;
pw.println("1");
pw.flush();
}
}
// 사용자 닉네임 얻기
if((id_ch==true)&&size!=1)
{
pw.println("0"); //이전사용자와 아이디가 같지 않다면 0을 보내낟.
pw.flush();
sendAllClient(name[size-1] + " 님께서 새로 입장했습니다");
}
}
String id=br.readLine();
while (true)
{ // 무한 반복
String msg = br.readLine();// 채팅 내용 받기
String str = sockClient.getInetAddress().getHostName();
ta.append(id+" : "+ msg + "\\n"); // 채팅 내용 ta 에 보기
if (msg.equals("@@Exit"))
{// 사용자가 @@Exit를 입력하면
break; // 반복문 종료(채팅 끝)
}
else
{
sendAllClient(id + " : " + msg);// 모두에게 채팅내용 전송
}// else
}// while
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
vChatList.remove(this);// 사용자 한 명 지우기
try
{
br.close();
pw.close();
sockClient.close();
}
catch (Exception e)
{
}// catch
}// finally
}// run
}// 내부 클래스 ChatHandle 의 끝
}// end
------------------------------클라이언트-------------------------------------
package ex;
import java.awt.*;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.*;
public class GUIChatClient extends JFrame implements Runnable,ActionListener{
JPanel cardPane, connectPane, chatPane;
JLabel msg;
JButton btn_connect, btn_send, btn_exit,btn_list;
JTextField txt_server_ip, txt_port, txt_input;
TextArea txt_list;
CardLayout card;
String name=null;
String ip;
int port;
HumanList hl=new HumanList();
Socket s; //채팅용 소켓
BufferedReader br; //입력
PrintWriter pw; //출력
String str; //채팅 내용을 담을 변수
String data; //임시변수
boolean id_check=false;
public GUIChatClient()
{
ConnectPane();
ChatPane();
setTitle("Chatting Client(ver 1.0)");
//card-----------------------------
cardPane = new JPanel();
card = new CardLayout();
cardPane.setLayout(card);
cardPane.add(connectPane,"접속창");
cardPane.add(chatPane,"채팅창");
card.show(cardPane, "접속창");
//----------------------------------
add(cardPane);
setSize(400,300);
setVisible(true);
setResizable(false);
addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
}
public void ConnectPane()
{
connectPane = new JPanel();
JPanel pn=new JPanel();
JPanel pn1 = new JPanel();
JPanel pn2 = new JPanel();
msg = new JLabel("IP와 PORT를 입력하시오");
msg.setFont(new Font("굴림체", Font.BOLD, 15));
msg.setForeground(Color.magenta);
JLabel lb1 = new JLabel("서버 I P : ");
txt_server_ip = new JTextField("", 15);
pn1.add(lb1);
pn1.add(txt_server_ip);
JLabel lb2 = new JLabel("포트 : ");
txt_port = new JTextField("",15);
pn2.add(lb2);
pn2.add(txt_port);
pn.add(pn1);
pn.add(pn2);
pn.add(msg);
btn_connect = new JButton("Connection");
connectPane.setBorder(BorderFactory.createTitledBorder("다중채팅화면"));
connectPane.setLayout(new BorderLayout());
connectPane.add(pn,"Center");
connectPane.add(btn_connect,"South");
btn_connect.addActionListener(this);
}
public void ChatPane()
{
chatPane = new JPanel();
JPanel pn3 = new JPanel();
txt_list = new TextArea("", 1, 1, txt_list.SCROLLBARS_BOTH);
txt_input = new JTextField("",20);
btn_send = new JButton("전송");
btn_exit = new JButton("종료");
btn_list = new JButton("사용자");
pn3.setBorder(BorderFactory.createTitledBorder("☆대화하기☆"));
chatPane.setBorder(BorderFactory.createTitledBorder("♣채팅내용♣"));
pn3.add(txt_input); pn3.add(btn_send); pn3.add(btn_list); pn3.add(btn_exit);
chatPane.setLayout(new BorderLayout());
chatPane.add(txt_list, "Center");
chatPane.add(pn3, "South");
txt_input.addActionListener(this);
btn_list.addActionListener(this);
btn_exit.addActionListener(this);
btn_send.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
Object obj = e.getSource();
if(obj == btn_connect)
{
setSize(470,300);
ip=txt_server_ip.getText();
port=Integer.parseInt(txt_port.getText());
try
{
s = new Socket(ip,port);
}
catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}//서버IP, 서버_포트
Thread ct = new Thread(this);//친구 차(쓰레드)에 같이 탄다.
ct.start(); //쓰레드 시작
card.show(cardPane, "채팅창");
}
if(obj==btn_send || obj == txt_input)
{
str=txt_input.getText();//tf에서 채팅 내용을 읽어온다.
pw.println(str);
pw.flush();
txt_input.setText("");//tf를(입력 준비 상태인)빈칸으로 셋팅한다.
}
if(obj==btn_list)
{
hl.setVisible(true);
}
if(obj==btn_exit)
{
System.exit(0);
}
}
public void run()
{
try
{
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
pw = new PrintWriter(s.getOutputStream(), true);//true는 즉시전송
while(!id_check)
{
String key;
name = JOptionPane.showInputDialog("아이디를 입력하세요(중복되지 않는 아이디);"); //아이디 입력받는 함수.
pw.println(name);
pw.flush();
key=br.readLine();
if(key.equals("0"))
{
pw.println(name);
pw.flush();
break;
}
else
{
JOptionPane.showMessageDialog(null, "대화명 중복!");
}
}
txt_input.requestFocus();
while((data = br.readLine())!= null)
{
txt_list.append(data + "\\n");//\\n은 줄바꿈
}//while
}
catch (IOException e)
{
System.out.println("생성자에서 예외 발생 : " + e);
}//ca
catch (Exception e)
{
System.out.println("소켓에서 채팅 내용읽는 중 에러발생");
}//catch
}//run
public static void main(String[] args)
{
new GUIChatClient();
}
}
------------------------사용자목록을 넣고싶은 클래스 JList가 있는--------------
package ex;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.*;
public class HumanList extends JFrame
{
JList lm=new JList();
JButton bt = new JButton("확인");
public HumanList()
{
setTitle("왜안되..");
setBounds(400,300,150,300);
setLayout(null);
lm.setBounds(0,0,150,230);
bt.setBounds(37,240,70,30);
add(lm);
add(bt);
setResizable(false);
}
}
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.