자바 소켓프로그래밍 서버 포트 관련 질문입니다.
조회수 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");
}
}
}
}
}
서버를 구축하고 있는데, 서버를 오픈했다가 종료하면 포트를 이미 사용중이어서 같은포트로 연결을 할수가 없습니다. 서버 오픈전 포트를 사용중인지 체크하고 강제로 종료하는 코드를 짜야할것같은데, 도저히 어디서부터 손을 대야할지 모르겠습니다ㅠ 고수님들께서 좀 도와주십시오ㅠ여기에 코드를 입력하세요
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
댓글 입력