
-개발환경-
IDE : Eclipse IDE for Java Developers Version: 2020-03 (4.15.0) language : java 8 DB GUI : SQLyog Community - MySQL GUI v12.2.1 ( 64 bit ) MySQL : MySQL Server 5.5 |
-Server-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
package networkTest3;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import com.koreait.interfaceTest.interfaceTest;
public class Server3 extends JFrame implements ActionListener,Runnable{
//JAVA UI
JTextArea textArea;
JPanel panel;
JTextField textField;
JButton button;
//Network
ServerSocket serverSocket;
Socket socket;
PrintWriter printWriter;
Scanner scanner;
String message="";
public Server3() {
setTitle("채팅창");
setBounds(80, 50, 400, 500);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
if(printWriter!=null) {
printWriter.write("나갈게요\n");
printWriter.write("bye\n");
printWriter.flush();
if(serverSocket!=null)try {serverSocket.close();} catch (IOException e1) {e1.printStackTrace();}
if(socket!=null)try {socket.close();} catch (IOException e1) {e1.printStackTrace();}
if(printWriter!=null)try {printWriter.close();} catch (Exception e1) {e1.printStackTrace();}
if(scanner!=null)try {scanner.close();} catch (Exception e1) {e1.printStackTrace();}
System.exit(0);
}
}
});
//Center
textArea=new JTextArea();
textArea.setBackground(Color.orange);
textArea.setEditable(false);//편집 불가능
//bottom
panel=new JPanel(new BorderLayout());
button=new JButton("입력");
textField=new JTextField();
//actionlistener
button.addActionListener(this);
textField.addActionListener(this);
//subRegister
panel.add(textField,BorderLayout.CENTER);
panel.add(button,BorderLayout.EAST);
//size
panel.setPreferredSize(new Dimension(400, 40));
//Register
add(textArea,BorderLayout.CENTER);
add(panel,BorderLayout.SOUTH);
setVisible(true);
}
public static void main(String[] args) {
Server3 server = new Server3();
try {
server.serverSocket=new ServerSocket(10004);
server.message= "192.168.0.12 서버의 10004 번 포트로 서버 시작\n";
server.message+="클라이언트가 접속하기를 기다립니다.\n";
server.textArea.setText(server.message);
server.textField.setEnabled(false);
server.button.setEnabled(false);
server.socket=server.serverSocket.accept();
server.message= server.socket+ "접속 성공\n"+ server.message;
server.textArea.setText(server.message);
server.textField.setEnabled(true);
server.button.setEnabled(true);
server.textField.requestFocus();
server.printWriter =new PrintWriter(server.socket.getOutputStream());
server.scanner= new Scanner(server.socket.getInputStream());
new Thread(server).start();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void actionPerformed(ActionEvent e) {
String msg=textField.getText().trim();
if(msg.length()>0) {
message= message + "server >> " + msg+ "\n";
textArea.setText(message);
if(printWriter!=null) {
printWriter.write(msg+"\n");
printWriter.flush();
}
}
textField.setText("");
textField.requestFocus();
}
@Override
public void run() {
while(socket!=null) {
String msg="";
try {
msg=scanner.nextLine().trim();
} catch (Exception e) {
break;
}
if(msg.length()>0) {
message= message+ "Client >> " +msg +"\n";
textArea.setText(message);
if(msg.toLowerCase().equals("bye"))
break;
try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}
}
}
textField.setEnabled(false);
button.setEnabled(false);
if(serverSocket!=null)try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}
if(socket!=null)try {socket.close();} catch (IOException e) {e.printStackTrace();}
if(printWriter!=null)try {printWriter.close();} catch (Exception e) {e.printStackTrace();}
if(scanner!=null)try {scanner.close();} catch (Exception e) {e.printStackTrace();}
}
}
|
cs |
-Description-
Server3 생성자에는 UI 구성
72 : 채팅입력후 enter 누르면 actionlistener가 실행되도록 textField에도 actionlistener를 걸어줌
91 : 포트번호를 10004번 포트로한 ServerSocket 객체생성 (포트번호는 만번때 이후로는 자유로히 사용가능)
96~97 : 클라이언트와 연결전에 입력칸(textfield)와 버튼(button) 비활성화
99 : 클라이언트 연결 대기
103~104 : 입력칸(textfield)와 버튼(button) 활성화
105 : 초점을 textfield로 설정
107~108 : 서버-클라이언트간 I/O를 위한 출력,입력 객체 생성
110 : 클라이언트로부터의 메세지를 주기적으로 받아들이는 Thread 실행
124 : 클라이언트로 메세지 전달 ( 메세지의 끝부분 에는 "\n"이 들어가야함 )
125 : 전달버퍼가 꽉차기 전에도 전달가능하게함
137 : 들어온 메세지를 읽어들임
141~147 : 들어온 메세지를 가공해서 textArea에 출력
151~154 : 통신객체들을 close() 해준다
-Client-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
package networkTest3;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Client3 extends JFrame implements ActionListener,Runnable{
//JAVA UI
JTextArea textArea;
JPanel panel;
JTextField textField;
JButton button;
//Network
Socket socket;
PrintWriter printWriter;
Scanner scanner;
String message="";
public Client3() {
setTitle("채팅창");
setBounds(500, 50, 400, 500);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
if(printWriter!=null) {
printWriter.write("나갈게요\n");
printWriter.write("bye\n");
printWriter.flush();
if(socket!=null)try {socket.close();} catch (IOException e1) {e1.printStackTrace();}
if(printWriter!=null)try {printWriter.close();} catch (Exception e1) {e1.printStackTrace();}
if(scanner!=null)try {scanner.close();} catch (Exception e1) {e1.printStackTrace();}
System.exit(0);
}
}
});
//Center
textArea=new JTextArea();
textArea.setBackground(Color.orange);
textArea.setEditable(false);//편집 불가능
//bottom
panel=new JPanel(new BorderLayout());
button=new JButton("입력");
textField=new JTextField();
//actionlistener
button.addActionListener(this);
textField.addActionListener(this);
//subRegister
panel.add(textField,BorderLayout.CENTER);
panel.add(button,BorderLayout.EAST);
//size
panel.setPreferredSize(new Dimension(400, 40));
//Register
add(textArea,BorderLayout.CENTER);
add(panel,BorderLayout.SOUTH);
setVisible(true);
}
public static void main(String[] args) {
Client3 client = new Client3();
try {
client.socket=new Socket("192.168.0.12", 10004);
client.message= "192.168.0.12 서버의 10004 번 포트로 서버 접속\n";
client.message+="서버로 접속 성공\n";
client.textArea.setText(client.message);
client.textField.setEnabled(true);
client.button.setEnabled(true);
client.textField.requestFocus();
client.printWriter =new PrintWriter(client.socket.getOutputStream());
client.scanner= new Scanner(client.socket.getInputStream());
new Thread(client).start();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void actionPerformed(ActionEvent e) {
String msg=textField.getText().trim();
if(msg.length()>0) {
message= message + "Client >> " + msg+ "\n";
textArea.setText(message);
if(printWriter!=null) {
printWriter.write(msg+"\n");
printWriter.flush();
}
}
textField.setText("");
textField.requestFocus();
}
@Override
public void run() {
while(socket!=null) {
String msg="";
try {
msg=scanner.nextLine().trim();
} catch (Exception e) {
break;
}
if(msg.length()>0) {
message= message+ "Server >> " +msg +"\n";
textArea.setText(message);
if(msg.toLowerCase().equals("bye"))
break;
try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}
}
}
textField.setEnabled(false);
button.setEnabled(false);
if(socket!=null)try {socket.close();} catch (IOException e) {e.printStackTrace();}
if(printWriter!=null)try {printWriter.close();} catch (Exception e) {e.printStackTrace();}
if(scanner!=null)try {scanner.close();} catch (Exception e) {e.printStackTrace();}
}
}
|
cs |
-Description
85 : client.socket=new Socket("192.168.0.12", 10004) 인자로 IP주소, 포트번호를 전달
-요약-
네트워크 통신을 위하여
Socket , PrintWriter(전달하는 입장) , Scanner (받는입장) 객체변수 생성,
함수로는 socket.getOutputStream() , socket.getInputStream() 을 사용하여
PrintWriter 객체생성, Scanner 객체 생성이 필요함을 배웠다.
네트워크 통신종료후에는 해당 객체들의 close() 명령이 필요하다.
-마침글-
네트워크 통신을 이용한 채팅프로그램을 제작해 보았다.
'21년이전 > 국비-JAVA+SQL' 카테고리의 다른 글
Memo 기능구현 (0) | 2021.02.23 |
---|