Server
-dto 생성 : 전달 할 내용인 number, name, play 기본정렬;
-vector로 소켓을 담아 클라이언트들 ip를 저장
-play번호가 1일때 2로 바꾸거, 2일때 1로바꿔 sendMsg메서드로 메세지보내기
Client
-dto 생성 : 받고 전달할 변수들 기본정렬;
- JFrame 상속받은 id클래스에서
Main
package main;
public class mainClass {
public static void main(String[] args) {
ServerSocket server = null;
Socket socket =null;
//클라이언트와 연결된 소켓들을 배열처럼 저장할 벡터객체 생성
Vector<Socket> vec = new Vector<Socket>();
try{
server= new ServerSocket(9000);
while(true){
System.out.println("접속대기중..");
socket = server.accept();
//클라이언트와 연결된 소켓을 벡터에 담기
vec.add(socket);
//스레드 구동
new EchoThread(socket, vec).start();
}
}catch(IOException ie){
System.out.println(ie.getMessage());
}
}
}
EchoThread
package thread;
//클라이언트로 부터 전송된 문자열을 받아서 다른 클라이언트에게 문자열을
//보내주는 스레드
public class EchoThread extends Thread{
Socket socket;
Vector<Socket> vec;
public EchoThread(Socket socket, Vector<Socket> vec){
this.socket = socket;
this.vec = vec;
}
public void run(){
NetworkSerialize ns = null;
try{
while(true){
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
try{
ns = (NetworkSerialize) ois.readObject();
System.out.println("네트워크 전송된 객체는 " +ns.toString());
}catch(ClassNotFoundException e){}
//상대가 접속을 끊으면 break;
if(ns==null){
//벡터에서 없애기
vec.remove(socket);
break;
}
//연결된 소켓들을 통해서 다른 클라이언트에게 보내주기
if(ns.getPlay() == 1) ns.setPlay(2);
else ns.setPlay(1);
sendMsg(ns);
}
} catch(IOException ie){
System.out.println(ie.getMessage());
}
}
//전송받은 문자열 다른 클라이언트들에게 보내주는 메서드
public void sendMsg(NetworkSerialize ns){
int num = 0;
try{
for(Socket socket:vec){
//for를 돌되 현재의 socket이 데이터를 보낸 클라이언트인 경우를 제외하고
//나머지 socket들에게만 데이터를 보낸다.
// if(socket != this.socket){
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
num++;
ns.setNumber(num);
oos.writeObject(ns);
oos.flush();
//단,여기서 얻어온 소켓들은 남의것들이기 때문에 여기서 닫으면 안된다.
// }
}
}catch(IOException ie){
System.out.println(ie.getMessage());
}
}
}
NetworkSerialize
package dto;
public class NetworkSerialize implements Serializable {
private int number;
private String name;
private int play;
public NetworkSerialize() {
}
public NetworkSerialize(int number, String name, int play) {
super();
this.number = number;
this.name = name;
this.play = play;
}
@Override
public String toString() {
return "NetworkSerialize [number=" + number + ", name=" + name + ", play=" + play + "]";
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPlay() {
return play;
}
public void setPlay(int play) {
this.play = play;
}
}
main
package main;
public class mainClass {
public static void main(String[] args) {
Socket socket=null;
ClientFrame cf;
try{
socket=new Socket("168.192.7.40",9000);
System.out.println("연결성공!");
cf = new ClientFrame(socket);
new ReadThread(socket, cf).start();
}catch(IOException ie){
System.out.println(ie.getMessage());
}
}
}
ReadThread
package thread;
public //서버가 보내온 문자열을 전송받는 스레드
class ReadThread extends Thread{
Socket socket;
ClientFrame cf;
public ReadThread(Socket socket, ClientFrame cf) {
this.cf = cf;
this.socket=socket;
}
public void run() {
NetworkSerialize ns = null;
try{
//서버로부터 전송된 문자열 읽어오기 위한 스트림객체 생성
while(true){
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
//소켓으로부터 문자열 읽어옴
try{
ns = (NetworkSerialize)ois.readObject();
SingletonClass sc = SingletonClass.getInstance();
sc.ns = ns;
cf.txtA.append("---------" + ns.toString()+"\n");
}catch(ClassNotFoundException e){}
if(ns==null){
System.out.println("접속이 끊겼음");
break;
}
}
}catch (UnknownHostException e)
{
}catch(IOException ie){
System.out.println(ie.getMessage());
}
}
}
NetworkSerialize
package dto;
import java.io.Serializable;
public class NetworkSerialize implements Serializable {
private int number;
private String name;
private int play;
public NetworkSerialize() {
}
public NetworkSerialize(int number, String name, int play) {
super();
this.number = number;
this.name = name;
this.play = play;
}
@Override
public String toString() {
return "NetworkSerialize [number=" + number + ", name=" + name + ", play=" + play + "]";
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPlay() {
return play;
}
public void setPlay(int play) {
this.play = play;
}
}
SingletonClass
package view;
import dto.NetworkSerialize;
public class SingletonClass {
private static SingletonClass singleton = new SingletonClass();
public NetworkSerialize ns;
//아래와같이 생성자가 private로 두어서 메인에서 생성할 수 없게 합니다.
private SingletonClass(){
ns = new NetworkSerialize(1, "id", 1);
}
//클래스 메소드로 딱 하나 만든 클래스변수를 반환하게 합니다.
public static SingletonClass getInstance(){
return singleton;
}
}
IdClass
package view;
public class IdClass extends JFrame implements ActionListener{
static JTextField tf = new JTextField(8);
JButton btn = new JButton("입력");
WriteThread wt;
ClientFrame cf;
public IdClass(){}
public IdClass(WriteThread wt, ClientFrame cf) {
super("아이디");
this.wt = wt;
this.cf = cf;
setLayout(new FlowLayout());
add(new JLabel("아이디"));
add(tf);
add(btn);
btn.addActionListener(this);
setBounds(300, 300, 250, 100);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
wt.sendMsg();
cf.isFirst = false;
cf.setVisible(true);
this.dispose();
}
static public String getId(){
return tf.getText();
}
}
'JAVA > 기초 프로그래밍' 카테고리의 다른 글
ID입력받아 채팅창에서 채팅하기 (0) | 2020.06.16 |
---|---|
쓰레드 기본개념 (0) | 2020.06.15 |
쓰레드//어레이리스트//채팅 (0) | 2020.06.15 |
쓰레드// Object (0) | 2020.06.15 |
쓰레드 예) (0) | 2020.06.15 |