java 네트워크 프로그래밍 중 하나인 socket C/S 통신

일대일 Socket C/S 통신
TCP는 신뢰할 수 있는 연결 기반 네트워크 프로토콜입니다.두 호스트가 대화를 하려고 할 때 모두 Socket을 만들어야 한다. 그 중 한 쪽은 서버로 Socket을 열고 네트워크에서 온 연결 요청을 정탐해야 한다. 다른 한 쪽은 고객으로서 네트워크에 있는 서버에 요청을 보내고 Socket을 통해 서버와 메시지를 전달해야 한다. 연결을 하려면 호스트의 IP 주소와 포트 번호를 지정하면 된다.
TCP 프로토콜 통신의 서비스 측 실현
서비스 프로그램은 서버의 어떤 포트에서 작동하며, 서비스가 시작되면, 이 포트에서 고객 프로그램이 보내는 요청을 기다리고 있습니다.서버의 소켓은 서버 소켓 클래스(ServerSocket)로 만들어집니다.서버가 포트 8000에서 작동한다고 가정하면 다음 명령은 다음과 같습니다.
SeverSocket sever = new SeverSocket(8000);
포트 8000을 감시하는 서비스자 sever를 만들었습니다.명령
Socket soc = sever.accept();
고객이 이 포트에 연결될 때까지 서비스자가 영원히 기다릴 수 있도록 합니다. 고객이 정확한 요청을 보내면 이 포트accept()에 연결하는 방법은 Socket 대상을 되돌려줍니다. 연결이 되어 있고 Socket의 대형 soc로 입력/출력 흐름을 얻을 수 있습니다. 다음과 같습니다.
DataInputStream in = new DataInputStream(soc.getInputStream());
PrintStream out = new PrintStream(soc.getOutputStream());
여기에 데이터 입력 흐름 클래스의 실례 in과 출력 흐름 클래스의 실례out을 만들었습니다. 서비스자는 고객으로부터 입력 정보를 검색하고 고객 프로그램에 정보를 보내는 데 사용됩니다. 마찬가지로 클라이언트에서도 두 가지 실례를 만들어서 서비스 프로그램과 양방향 통신을 해야 합니다.서비스자가 입력 흐름에 보내는 사용 정보는 모두 고객의 입력 정보가 되고 고객 프로그램의 출력은 모두 서비스자의 입력 흐름에 들어간다.
호스트의 IP 주소를 가져오고 클라이언트의 주소 정보를 서비스 사용자 창에 표시합니다.
clientIP = soc.getInetAddress();
System.out.println(“Client’s IP address: ”+clientIP);
println () 은 흐름 클래스를 출력하는 방법입니다. 다음 단계에서 고객에게 인사를 드리겠습니다.
out.println(“Wlcome!...”);
원격 로그인으로 포트 8000을 통해 이 서비스 사용자에게 연결하면 고객 단말기 화면에서 상기 정보를 받을 수 있습니다.
이 간단한 서비스에서 매번 한 줄의 고객의 입력만 읽고 이 줄을 표시하여 서비스자가 고객의 입력을 받아들였다는 것을 나타낸다.
readLine () 은 데이터 입력 흐름 클래스 중 하나로 서비스자나 고객이 상대방으로부터 입력 흐름 정보를 읽는 데 사용됩니다.
String str = in.readLine();
While(!str.equals(“quit”)
{
System.out.println(“Client said:” +str());
str=in.readLine();
}
상기 코드를 끊임없이 순환하여 고객이'quit'또는str를null로 입력할 때까지;마지막으로 종료하기 전에 Socket 입력을 닫습니다.
System.out.println(“Client want to leave”);
finally{
in.close();
out.close();
soc.close();
server.close();
}
이것이 바로 간단한 응답 서비스자의 업무 과정이다.HTTP Web Services와 같은 각 서비스 사용자는 다음 순환을 계속 수행합니다.
(1) 고객에게 입력을 통해 명령을 얻는다.
(2) 특정한 방법으로 이 정보를 얻는다.
(3) 수출 흐름을 통해 고객에게 정보를 전달한다. 
TCP 프로토콜 통신의 고객 방식 구현
클라이언트가 먼저 고정된 호스트를 가리키는 고정 포트를 만드는 Socket, 상기 서비스자 프로그램이 본 컴퓨터의 "localhost"에 가입하면 다음 명령은 다음과 같다.
Socket soc = new Socket(“localhost”,8000);
/*
* 네이티브 IP 주소를 가져오는 세 가지 방법:
* 1,Socket soc = new Socket(InetAddress.getByName("localhost"),8000); * 2,Socket soc = new Socket(InetAddress.getByName("127.0.0.1"),8000);기본 회로 주소
* 3,Socket soc = new Socket(InetAddress.getByName(null),8000);
*/
고객과 서비스자의 연결을 구축하고 양쪽이 통신하는 통로가 바로 구축된다.서비스자가 이 연결 요청을 받아들일 때 Socket 실례 soc가 만들어집니다. 마찬가지로 이 Socket 실례에서 입력과 출력 흐름을 가져옵니다.
in = new DataInputStream(sever.getInputStream());
out = new PrintStream(sever.getOutputStream());
입력/출력 흐름이 구축되면 고객은 먼저 클라이언트 기기에서 "Welcome!"를 읽습니다.정보, 창에 표시:
strin = in.readLine();
System.out.println(“Sever said:”+strin);
이 두 줄의 명령이 실행되면 창에 서비스자의 환영 정보와 클라이언트 시스템이 출력한 정보를 표시해야 한다.
고객이 서비스 담당자에게 보내고자 하는 데이터 흐름은 키보드에서 얻을 수 있습니다.
sysin = new DataInputStream(System.in);
strout = sysin.readLine();
키보드 입력이 "quit"가 아닐 때, 키보드가 입력한 데이터를 출력 흐름에 기록하고 전송한 다음 키보드 뒤에서 데이터를 계속 입력하십시오.
out.println(strout);
strout = sysin.readLine();
키보드가 "quit"를 입력할 때까지 위의 두 줄 명령을 반복해서 서비스자에게 전송한 다음 입력/출력 흐름과 Socket을 닫습니다.
out.println(strout);
in.close();
out.close();
sysin.close();
server.close();
이 고객은 동일한 호스트의 응답 서비스자와 통신하여 먼저 서비스 프로그램을 진행하고 고객 프로그램을 실행합니다. 실행 결과는 다음과 같습니다.
서비스 프로세스 창에 다음을 표시합니다.
Client’s IP address:127.0.0.1
Client said:Hello!
Client want to leave.
고객 프로세스 창에 표시:
Connecting to the Server...
Sever said:Welcome!...
Hello!
quit
그 중 뒤의 세 줄은 고객의 키보드 입력이다.네트워크에 있는 두 대의 서로 다른 컴퓨터 간에 통신을 하려면 Socket () 에서 전달하는 매개 변수인'localhost'를 상응하는 호스트 이름이나 IP로 바꾸면 된다.
소스 코드:
import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Sever {
	static public void main(String args[])
	throws IOException
	{
		ServerSocket sersoc = null;
		Socket soc = null;
		DataInputStream  in = null;
		PrintStream out = null;
		InetAddress clientIp = null;
		String str = null;
		try {
			sersoc = new ServerSocket(8000);
			soc = sersoc.accept();
			in = new DataInputStream(soc.getInputStream());
			out = new PrintStream(soc.getOutputStream());
			clientIp = soc.getInetAddress();
			System.out.println("Client's IP address: "+clientIp);
			out.println("Welcome!...");
			str = in.readLine();
			while(!str.equals("quit"))
			{
				System.out.println("Client said: "+str);
				str = in.readLine();
			}
			System.out.println("Client want to leave.");
		} catch (Exception e) {
			System.out.println("Error: "+e);
		}
		finally
		{
			in.close();
			out.close();
			soc.close();
			sersoc.close();
			System.exit(0);
		}
	}
}
import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;

public class Client {
	static public void main(String args[])
	throws IOException
	{
		Socket soc = null;
		DataInputStream in = null;
		PrintStream out = null;
		DataInputStream sysin = null;
		String strin = null;
		String  strout = null;
		
		try {
			soc = new Socket(args[0],8000);
			System.out.println("Connecting to the Server...");
			in = new DataInputStream(soc.getInputStream());
			out = new PrintStream(soc.getOutputStream());
			strin = in.readLine();
			System.out.println("Sever said: "+strin);
			sysin = new DataInputStream(System.in);
			strout = sysin.readLine();
			while (!strout.equals("quit")) {
				out.println(strout);
				strout = sysin.readLine();
				}
			out.println(strout);
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("Error: "+e);
		}
		finally
		{
			in.close();
			out.close();
			sysin.close();
			soc.close();
			System.exit(0);
		}
	}
}

API 설명: 인터페이스 클래스 번들(java.net.Socket)
1)Socket(String host,int port)throws UnknownHostException,IOException
플러그 인터페이스 (즉, Socket 실체 대상) 를 만들고 특정 호스트의 특정 포트에 연결합니다.
매개 변수:host 호스트 이름
포트 번호
2)Socket(String host,int port,boolean stream)
Socket 솔리드 객체라는 인터페이스를 구성하여 특정 호스트의 특정 포트에 연결합니다.이 인터페이스가 플러그인 인터페이스인지 데이터 보고 (datagram) 플러그인 인터페이스인지는 마지막 매개 변수stream에 의해 결정됩니다.
매개 변수:host 호스트 이름
포트 번호
stream은 생성된 플러그 인터페이스가 플러그 인터페이스인지 데이터 플러그 인터페이스인지 결정하는 데 사용됩니다. (datagram socket)
3)Socket(InetAddress address,int port)
Socket 솔리드 객체라는 인터페이스를 구성하여 특정 호스트의 특정 주소에 연결합니다.매개 변수:address 특정 주소
포트 포트
4)Socket(InetAddress address,int port,boolean stream)
플러그 인터페이스 (즉 Socket 실체 대상) 를 구성하여 특정 포트의 특정 주소에 연결합니다.이 인터페이스가 플러그 인터페이스인지 데이터 보고서(datagram) 플러그 인터페이스인지는 마지막 매개 변수stream이 결정합니다.
매개 변수:host 호스트 이름
포트 번호
stream은 생성된 플러그 인터페이스가 플러그 인터페이스인지 데이터 플러그 인터페이스인지 결정하는 데 사용됩니다. (datagram socket)
5)InetAddress getInetAddress()
이 인터페이스 (socket) 가 연결된 주소를 되돌려줍니다.
6)int getPort()
이 인터페이스 (socket) 가 연결된 원격 포트를 되돌려줍니다.
7)synchronized void close()throws IOException
플러그 인터페이스를 닫다.
8)InputStream getInputStream()throws IOException
세트 인터페이스에서 데이터를 읽는 입력 흐름을 얻습니다.
참고: DataInputStream은 InputStream의 하위 클래스입니다.
9)OutputStream getOutputStream() throws IOException
플러그 인터페이스로 읽는 입력 흐름을 얻습니다.
참고: PrintStream은 OutputStream의 하위 클래스입니다. 
API 설명: 서비스 서브셋 인터페이스 클래스(java.net.ServerSocket)
1)ServerSocket(int port)throws IOException
지정한 포트에 ServerSocket 실체 대상을 구성하는 서비스 인터페이스를 구성합니다.
매개 변수:port 포트 번호
2)ServerSocket(int port,int count)
ServerSocket 실체 대상을 구성하고 이 대상이 지정한 현지 포트와 연결되는 서비스 인터페이스를 구성합니다.그 밖에 그것의 수입에 대해 감청할 수 있다.사용자도 포트를 0으로 설정하여 이 대상을 익명 포트와 연결할 수 있습니다.
매개 변수:port 포트 번호
count에서 이 ServerSocket 개체와 포트 간의 연결을 감청하는 횟수입니다.
3)Socket accept()throws IOException
연결을 기다리십시오. 이 방법은 현재 라인을 막고 연결이 성공했음을 알 수 있습니다.이 방법은 인터페이스 클래스(Socket) 대상을 되돌려줍니다. 이 대상을 통해 프로그램은 연결된 고객과 통신합니다.
4)void close()throws IOException
플러그 인터페이스를 닫다.

좋은 웹페이지 즐겨찾기