byeong9935
246
2019-03-15 06:55:32
0
75

socket 질문입니다.


연결된 클라이언트가 종료되었을 경우, 서버는 문제없이 연결되어있는 클라이언트들에게만

브로드캐스트를 하며


서버가 내려갔을 경우에 클라이언트는 10초에 한번씩 서버에 재접속합니다.


그러면 서버 code입니다.


import java.io.BufferedWriter;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;


import objs.ClientInfo;


public class ClientThread extends Thread {


private ClientInfo clientInfo;

private DataInputStream  dis;

private DataOutputStream dos;

private BufferedWriter br;

ClientInfo cli = null;


public ClientThread(ClientInfo clientInfo) 

{

this.clientInfo = clientInfo;

this.dis = this.clientInfo.getDis();

this.dos = this.clientInfo.getDos();

}

@Override

public void run() {

packetReader();

}


// packetreader 에서 packet read

private void packetReader() {

byte[] header = new byte[ 1 ];

try {

while (true) {

this.dis.readFully(header);

System.out.println("Request No: " + header[0]);

switch (header[0]) {

case 1:

this.dos.writeByte(1);

this.dos.writeLong(System.currentTimeMillis());

this.dos.flush();

System.out.println("Response No: " + header[0]);

break;

case 2:

int clientCount = TCPServer.clients.size();

//ClientInfo cli = null;

for (int i = 0; i < clientCount; i++)

{

cli = TCPServer.clients.get(i);

long time = System.currentTimeMillis() / 1000 * 1000;

//System.out.println("clientCount: " + clientCount + ", i: " + i);

cli.getDos().writeByte(2);

cli.getDos().writeLong(time);

cli.getDos().flush();

System.out.println("Response No: " + header[0] + ", clientInfo : " + i);

if(cli.getSock().isClosed()) 

{

if(cli.getSock().isConnected())

{

System.out.println("Broadcast");

System.out.println("클라이언트가 연결되기 까지 대기합니다. 연결된 클라리언트의 수: ");

System.out.print(TCPServer.clients.size() - 1);

System.out.println("clientCount: " + clientCount + ", i: " + i);

//System.out.print();

}

//System.out.println("Broadcast");

//System.out.println("클라이언트가 연결되기 까지 대기합니다. 연결된 클라리언트의 수: ");

//System.out.print(clientCount--);

}

else if(cli.getSock().isConnected())

{

//cli.getDos().writeBytes("broadcast");

System.out.println("Broadcast");

System.out.println("클라이언트가 연결되기 까지 대기합니다. 연결된 클라리언트의 수: ");

System.out.print(TCPServer.clients.size() - i);

}

if(clientInfo.getSock().isClosed())

{

System.out.println("close server");

Thread.sleep(10000);

}

    cli.getSock().connect(cli.getHostAddress(), 10000); 

    

}

break;

default:

System.err.println("Invalid Packet!!!(" + (header[0] & 0xFF) + ")");

break;

}

}

} catch (Exception e) {

if (e.getMessage().contains("SocketException"))

{

System.err.println("클라이언트가 종료되었습니다.");

}

} finally {

if(clientInfo.getSock() == null) {

try {

clientInfo.getSock().close();


    cli.getSock().connect(cli.getHostAddress(), 10000); 

    

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("close");

}

}

}

/*

private void BroadCast()

{

if(cli.getSock().isClosed()) 

{

System.out.println("Broadcast");

System.out.println("클라이언트가 연결되기 까지 대기합니다. 연결된 클라리언트의 수: ");

System.out.print(TCPServer.clients.size() - 1);

}

}

*/

}



client code 입니다.


import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
import java.sql.Timestamp;

/*
 * 1. TCP 서버와 클라이언트를 만들것
 * 2. DataInputStream / DataOutputStream 을 이용하여 프로토콜 규약을 만든다.
 * 3. 서버는 클라이언트에서 요청이 왔을 경우 그 요청에 따른 결과를 클라이언트에게 전달한다.
 * 4. 서버는 다수의 클라이언트와 통신이 가능해야한다.
 * 
 * a. 클라이언트는 실행 매개 변수 첫번째 값을 이용하여 서버의 포트 번호를 입력 받는다.
 */

//TODO - 클라이언트를 만들 것
public class TCPClient {

public static void main(String[] args) {
System.out.println("TCPClient 시작");

if (args == null || args.length != 1) {
System.err.println("java -jar TCPClient.jar <SERVER_PORT>");
System.exit(0);
}

int svrPort = Integer.parseInt(args[0]);
Socket svr = null;
try {

svr = new Socket("localhost", svrPort);
// senderThread, ReceiverThread start로
Thread thread1 = new SendThread(svr);
Thread thread2 = new ReadThread(svr);
thread1.start();
thread2.start();

if (svr.isConnected()) {
System.out.println("서버(" + svrPort + ")에 연결되었습니다.");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// svr.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}



import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.sql.Timestamp;

// client에서 server로 receive
public class ReadThread extends Thread {

Socket socket = null;
DataOutputStream dos = null;
DataInputStream dis = null;

public ReadThread(Socket socket) {
this.socket = socket;
try {
this.dos = new DataOutputStream(socket.getOutputStream());
this.dis = new DataInputStream(socket.getInputStream());
} catch (Exception e) {
e.printStackTrace();
}
}

@Override
public void run() {
// TODO Auto-generated method stub

System.out.println("TCPClient 시작");

Socket svr = null;
BufferedReader br = null;

byte[] header = new byte[ 1 ];
long serverTime = 0;
try {
while (true) {
this.dis.readFully(header);
switch (header[ 0 ]) {
case 1:
case 2:
long svrTime = dis.readLong();
System.out.println("서버의 시간: " + new Timestamp(svrTime));
continue;
default:
System.out.println("존재하지 않는 규약입니다.");
continue;
}
}
} catch (Exception ioe) {
ioe.printStackTrace();
} finally {
try {
// socket.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

}


0
0
  • 답변 0

  • 로그인을 하시면 답변을 등록할 수 있습니다.