자바 소켓프로그래밍 서버 포트 관련 질문입니다.

조회수 2153회
package DHSserver;

import info.ClientInfo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays;

public class Server {

    public DatagramSocket servSocket;
    private DatagramSocket receiveSocket;
    private int recvPort = 8003; //8002 -> 8003
    private int port = 9210; // 8000 -> 9211
    private DatagramPacket recvPacket;
    private DatagramPacket recvPacket2;
    String myAddr;
    byte[] recvBuffer = new byte[128];
    byte[] sendBuffer = new byte[128];
    byte[] pingTestBuffer = new byte[128];
    boolean isConnect = false;
    int count = 0;

    InetAddress clntAddr = null;
    private int clntPort;
    private DatagramPacket sendIdPacket;
    private DatagramPacket sendIdPacket2;
    ClientInfo clientInfo;


    public Server(ClientInfo clientInfo) throws SocketException{
        //servSocket = new DatagramSocket(recvPort);
        servSocket = new DatagramSocket();
        servSocket.setReuseAddress(true);
        servSocket.setBroadcast(true);
        servSocket = new DatagramSocket(new InetSocketAddress(recvPort));


        myAddr = clientInfo.myAddr;
        recvBuffer = new byte[128];
        recvPacket = new DatagramPacket(recvBuffer, recvBuffer.length);
        receiveSocket = new DatagramSocket(port);

        System.out.println("서버 생성자 실행");
    }

    public void ServerOn(){
        System.out.println("서버 온");

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    while (!isConnect) {
                        if (count == 0) {
                            receiveSocket.receive(recvPacket);
                            clntAddr = recvPacket.getAddress();
                            clntPort = recvPacket.getPort();
                            System.out.println("클라이언트 IP = " + clntAddr );
                            System.out.println("클라이언트 PORT = " + clntPort);

                            String recvString = new String(recvPacket.getData(), 0, recvPacket.getLength());
                            sendBuffer = IntToByte(2); // ID값 지정
                            sendIdPacket = new DatagramPacket(sendBuffer, sendBuffer.length, clntAddr, clntPort);
                            receiveSocket.send(sendIdPacket);

                            isConnect = true;
                        }

                        else if (count == 1) {
                            //Log.d("juho", "ServerUserUDP - serverSocket while 2");
                            port = port + 10;
                            recvPacket2 = new DatagramPacket(recvBuffer, recvBuffer.length);

//                            receiveSocket2 = new DatagramSocket(port);
//                            receiveSocket2.receive(recvPacket2);
                            receiveSocket.receive(recvPacket2);
                            clntAddr = recvPacket2.getAddress();
                            clntPort = recvPacket2.getPort();

                            String recvString = new String(recvPacket2.getData(), 0, recvPacket2.getLength());
                            //recvPacket2 = new DatagramPacket(recvPacket2.getData(), recvPacket2.getData().length, clntAddr, clntPort);
                            recvPacket2.setData(recvBuffer);
                            sendBuffer = IntToByte(4);
//                            recvPacket2 = new DatagramPacket(recvPacket2.getData(), recvPacket2.getData().length, clntAddr, clntPort);
                            sendIdPacket2 = new DatagramPacket(sendBuffer, sendBuffer.length, clntAddr, clntPort);
//                            Log.d("jyj", "-------------"+recvPacket2.getData());
//                            receiveSocket2.send(recvPacket2);
                            receiveSocket.send(sendIdPacket2);



                            isConnect = true;
                        }
                    }

                    //다중 연결을 위해 값 변경
                    if (count != 1) {
                        isConnect = false;
                    } else {
                        isConnect = true;
                    }

                } catch (SocketException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();

        while (clntAddr == null) {
            //Log.d("juho", "와일문 대기중");
            try {
                Thread.sleep(2000);  //3초에서 2초로 수정함
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        byte[] tempBuffer = new byte[9];
        if (count == 0) {
            //Log.d("jyj","패킷 값"+ recvPacket.getData());
            System.arraycopy(recvPacket.getData(), 9, tempBuffer, 0, 9);
            //InetAddress clntUserAddr = InetAddress.getByName(new String(tempBuffer));
            //Log.d("jyj", "실행확인1");
        } else {
            System.arraycopy(recvPacket2.getData(), 9, tempBuffer, 0, 9);
            //InetAddress clntUserAddr = InetAddress.getByName(new String(tempBuffer));
            //Log.d("jyj", "실행확인2");
        }

        //    Log.d("juho", "ServerUserUDP - be received client addr = " + clntUserAddr.getHostAddress());

        tempBuffer = new byte[4];
        if (count == 0) {
            System.arraycopy(recvPacket.getData(), 18, tempBuffer, 0, 4);
            //int clntUserPort = ByteToInt(tempBuffer);
        } else {
            System.arraycopy(recvPacket2.getData(), 18, tempBuffer, 0, 4);
            //int clntUserPort = ByteToInt(tempBuffer);
        }
        //    Log.d("juho", "ServerUserUDP - be received client port = " + clntUserPort);


        if (count == 0) {
            clientInfo = new ClientInfo(clntAddr, clntPort);
        } else {
            clientInfo.addrArray.add(clntAddr);
            clientInfo.portArray.add(clntPort);
        }

        count++;
        clntAddr = null;
        //return clientInfo;
    }

    // int -> byte 변환하는 함수
    private static byte[] IntToByte(final int integer){
        ByteBuffer buff = ByteBuffer.allocate(Integer.SIZE / 8);
        buff.putInt(integer);
        buff.order(ByteOrder.BIG_ENDIAN);

        return buff.array();

    }

    private static int byteToInt(byte[] bytes) {
        final int size = Integer.SIZE / 8;
        ByteBuffer buff = ByteBuffer.allocate(size);
        final byte[] newBytes = new byte[size];
        for(int i = 0; i< size; i++) {
            if (i + bytes.length < size) {
            newBytes[i] = (byte) 0x00;
            } else {
                newBytes[i] = bytes[i + bytes.length - size];
            }
        }
        buff = ByteBuffer.wrap(newBytes);
        buff.order(ByteOrder.BIG_ENDIAN);
        return buff.getInt();

    }





        public void waitClientData(int num){
            while (true) {
                // receive
                byte[] sendBuffer = new byte[128];  //jun test

                if (num == 0) {
                    DatagramPacket receivePacket = new DatagramPacket(recvBuffer, recvBuffer.length);
//                  Log.d("juho", "ServerUserUDP - Receive Wait in Server..");
                    try {
                        System.out.println("waiting ClientData1");
                        receiveSocket.receive(receivePacket);
                        System.out.println("Receive Complete ClientData.."+ receivePacket.getAddress() + ", " + receivePacket.getPort());
                    } catch (IOException e) {
                        e.printStackTrace();
                       System.out.println("오류");
                    }

//                  Log.d("jyj", "받아온 패킷값 확인 : " + Arrays.toString(receivePacket.getData()));
                    System.out.println("데이터 값 확인  : " + Arrays.toString(receivePacket.getData()));

//                  Log.d("juho", "ServerUserUDP - Addr = " + receivePacket.getAddress() + ", port = " + receivePacket.getPort());
                    clntPort = receivePacket.getPort();
                    byte[] byteMode = new byte[4];
                    byte[] byteData = new byte[12];
                    byte[] getDataT;
                    byte[] setUser = new byte[4]; //jun test
                    int userid; //juntest
                    getDataT = receivePacket.getData();
                    for (int i = 0; i < 4; i++) {
                        byteMode[i] = getDataT[i];
                        sendBuffer[i] = getDataT[i];
                    }
                    for (int i = 4; i < 16; i++) {  //원래 i 16까지
                        byteData[i - 4] = getDataT[i];
                        sendBuffer[i] = getDataT[i];
//                      Log.d("jyj","byteData값 확인"+(i-4)+"번째"+ byteData[i-4]);
                    }

                    for (int i = 12; i < 16; i++) {
                        setUser[i - 12] = getDataT[i];
                    }
                    userid = byteToInt(setUser);
                    System.out.println("유저 ID값 확인" + userid);

//                  setUser = IntToByte(3);
//                  for(int i = 12; i<16; i++)
//                  {
//                      byteData[]
//                      sendBuffer[i] = setUser[i-12];
//                  }

                    // 이 파일에서 보내는 Message는 SurFaceTest에 보내짐
                    // SurFaceTest에서는 onTouchMessage로 보냄


//                  Message msg = new Message();
//                  Log.d("juho", "Mode From Server = " + ByteToInt(byteMode));
//                  msg.what = ByteToInt(byteMode); // TouchMove
//
//                  msg.obj = byteData;
//                  Top_handler.sendMessage(msg);
                    System.out.println("ClientInfo 사이즈 : " + clientInfo.addrArray.size());
                    if (clientInfo.addrArray.size() == 2) {
                        if (userid == 2) {
                            recvPacket = new DatagramPacket(sendBuffer, sendBuffer.length, clientInfo.addrArray.get(1), clientInfo.portArray.get(1));
                            //Log.d("jyj", "다른 클라이언트에게 보내기 server -> client2 : " + clientInfo.addrArray.get(1) + ", " + clientInfo.portArray.get(1));
                        } else if (userid == 4) {
                            recvPacket = new DatagramPacket(sendBuffer, sendBuffer.length, clientInfo.addrArray.get(0), clientInfo.portArray.get(0));
                            //Log.d("jyj", "다른 클라이언트에게 보내기 server -> client1" + clientInfo.addrArray.get(0) + ", " + clientInfo.portArray.get(0));
                        }
                        try {
//                      receiveSocket2.send(recvPacket);
                            System.out.println("보내기 1 작동");
                            receiveSocket.send(recvPacket);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
//                      Log.d("juho", "SendMessage to Surface");
                else {
                    DatagramPacket waitPacket2 = new DatagramPacket(recvBuffer, recvBuffer.length);
                    //Log.d("juho", "ServerUserUDP - Receive Wait in Server..");
                    try {
                        System.out.println("waiting ClientData2");
//                          Log.d("juho", "ServerUserUDP - waiting ClientData..");

//                      receiveSocket2.receive(waitPacket2);
                        receiveSocket.receive(waitPacket2);

//                          Log.d("juho", "ServerUserUDP - Receive Complete ClientData.."+ receivePacket.getAddress() + ", " + receivePacket.getPort());
//                          Log.d("juho", "ServerUserUDP - " );
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
//                  Log.d("jyj", "서버 리시브 패킷 데이터값1 : " + waitPacket2.getData());
//                  Log.d("juho", "ServerUserUDP - Addr = " + waitPacket2.getAddress() + ", port = " + waitPacket2.getPort());
                    clntPort = waitPacket2.getPort();
                    byte[] byteMode2 = new byte[4];
                    byte[] byteData2 = new byte[12];
                    byte[] getDataT2;
                    byte[] setUser2 = new byte[4]; //jun test
                    int userid2; //juntest
                    getDataT2 = waitPacket2.getData();
                    for (int i = 0; i < 4; i++) {
                        byteMode2[i] = getDataT2[i];
                        sendBuffer[i] = getDataT2[i];
                    }
                    for (int i = 4; i < 16; i++) {
                        byteData2[i - 4] = getDataT2[i];
                        sendBuffer[i] = getDataT2[i];
                    }

                    for (int i = 12; i < 16; i++) {
                        setUser2[i - 12] = getDataT2[i];
                    }
                    userid2 = byteToInt(setUser2);
                    System.out.println("유저 ID값 확인" + userid2);

                    // 이 파일에서 보내는 Message는 SurFaceTest에 보내짐
                    // SurFaceTest에서는 onTouchMessage로 보냄
//                  Message msg = new Message();
//                  Log.d("juho", "Mode From Server = " + ByteToInt(byteMode2));
//                  msg.what = ByteToInt(byteMode2); // TouchMove
//
//                  msg.obj = byteData2;
//                  Top_handler.sendMessage(msg);

                    if (clientInfo.addrArray.size() == 2) {
                        if (userid2 == 2) {
                            recvPacket2 = new DatagramPacket(sendBuffer, sendBuffer.length, clientInfo.addrArray.get(1), clientInfo.portArray.get(1));

//                          Log.d("jyj", "다른 클라이언트에게 보내기2 server -> client2" + clientInfo.addrArray.get(1) + ", " + clientInfo.portArray.get(1));
                        } else if (userid2 == 4) {
                            recvPacket2 = new DatagramPacket(sendBuffer, sendBuffer.length, clientInfo.addrArray.get(0), clientInfo.portArray.get(0));
//                          Log.d("jyj", "다른 클라이언트에게 보내기2 server -> client1" + clientInfo.addrArray.get(0) + ", " + clientInfo.portArray.get(0));
                        }
                        try {
                            System.out.println("보내기 2 작동");
                            receiveSocket.send(recvPacket2);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
//                      Log.d("juho", "SendMessage to Surface");
                    }
                }
            }
        }
}

서버를 구축하고 있는데, 서버를 오픈했다가 종료하면 포트를 이미 사용중이어서 같은포트로 연결을 할수가 없습니다. 서버 오픈전 포트를 사용중인지 체크하고 강제로 종료하는 코드를 짜야할것같은데, 도저히 어디서부터 손을 대야할지 모르겠습니다ㅠ 고수님들께서 좀 도와주십시오ㅠ여기에 코드를 입력하세요

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)