java는 Socket 클래스를 사용하여 데이터를 수신하고 발송합니다.
본고에서 우리는 Socket 클래스를 사용하는 기본적인 절차와 방법을 토론할 것이다.일반 네트워크 클라이언트 프로그램은 서비스 프로그램에 연결할 때 다음과 같은 3단계 조작을 해야 한다.
클라이언트는 두 가지 방식으로 서버를 연결할 수 있는데, 하나는 IP를 통해 서버를 연결할 수 있고, 다른 하나는 도메인 이름을 통해 서버를 연결할 수 있다.
사실 이 두 가지 방식은 본질적으로 보면 하나의 방식이다.하부 클라이언트는 모두 IP를 통해 서버를 연결하지만 이 두 가지 방식은 어느 정도 차이가 있다. 만약에 IP 방식을 통해 서버 프로그램을 연결한다면 클라이언트는 IP에 따라 간단하게 연결할 뿐이다. 만약에 도메인 이름을 통해 서버를 연결한다면 클라이언트는 DNS를 통해 도메인 이름을 IP로 해석한 다음에 이 IP에 따라 연결해야 한다.
많은 프로그래밍 언어나 개발 도구(예를 들어 C/C++, Delphi)에서 도메인 이름을 사용하여 서버에 연결할 때 반드시 스스로 도메인 이름을 IP로 해석한 다음에 IP를 통해 연결해야 한다. 그러나 자바에서는 이미 도메인 이름 해석 기능을 Socket 클래스에 포함하고 있기 때문에 우리는 IP를 사용하는 것처럼 도메인 이름을 사용하면 된다.
Socket 클래스를 통해 서버 프로그램에 연결하는 가장 일반적인 방법은 Socket 클래스의 구조 함수를 통해 IP나 도메인 이름과 포트 번호를 매개 변수로 Socket 클래스에 전송하는 것이다.Socket류의 구조 함수는 많은 재부팅 형식이 있는데 이 절에서는 그 중에서 가장 자주 사용하는 형식인 public Socket(String host, int port)만 논의한다.이 구조 함수의 정의를 보면 IP나 도메인 이름과 포트 번호를 구조 함수에 직접 전달하면 된다.다음 코드는 서버 프로그램을 연결하는 예시입니다.
package mysocket;
import java.net.*;
public class MyConnection
{
public static void main(String[] args)
{
try
{
if (args.length > 0)
{
Socket socket = new Socket(args[0], 80);
System.out.println(args[0] + " !");
}
else
System.out.println(" IP !");
}
catch (Exception e)
{
System.err.println(" :" + e.getMessage());
}
}
}
위의 에서 명령행 매개 변수를 통해 IP나 도메인 이름을 프로그램에 전송한 다음 Socket socket = new Socket(args[0], 80)을 통해 명령행 매개 변수를 통해 지정한 IP 또는 도메인 이름의 80 포트에 연결합니다.Socket류의 구조 함수는 정의할 때throws를 사용하기 때문에, Socket류의 구조 함수를 호출할 때try...catch 문장으로 오류를 포착하거나main 함수에throws 문장으로 오류를 던져야 합니다.Socket 클래스 연결 서버를 사용하면 호스트에 어떤 포트가 열려 있는지 판단할 수 있습니다.다음 코드는 이 컴퓨터에 어떤 포트가 열려 있는지 스캔하는 프로그램입니다.
2. 데이터 전송 및 수신
Socket 클래스에서 가장 중요한 두 가지 방법은 get Input Stream과 get Output Stream이다.이 두 가지 방법은 각각 데이터를 읽고 쓰는 데 사용되는 InputStream과 OutputStream 대상을 얻는 데 쓰인다.여기서 InputStream은 서버 프로그램이 클라이언트에게 보내는 데이터를 읽고, OutputStream은 클라이언트가 서버 프로그램에 보내는 데이터입니다.
실제 네트워크 클라이언트 프로그램을 작성할 때 get Input Stream을 사용할지, get Output Stream을 사용할지, 그리고 누구를 먼저 사용할지는 구체적인 응용 프로그램에 의해 결정된다.우편출판사 사이트www.ptpress.com.cn에 연결된 80포트(일반적으로 HTTP 프로토콜에 사용되는 기본 포트)를 통해 문자열을 보내고 www.ptpress.com.cn에서 되돌아오는 정보를 읽습니다.
package mysocket;
import java.net.*;
import java.io.*;
public class MyConnection2
{
public static void main(String[] args) throws Exception
{
Socket socket = new Socket("www.ptpress.com.cn", 80);
//
OutputStream ops = socket.getOutputStream();
OutputStreamWriter opsw = new OutputStreamWriter(ops);
BufferedWriter bw = new BufferedWriter(opsw);
bw.write("hello world\r
\r
");
bw.flush();
//
InputStream ips = socket.getInputStream();
InputStreamReader ipsr = new InputStreamReader(ips);
BufferedReader br = new BufferedReader(ipsr);
String s = "";
while((s = br.readLine()) != null)
System.out.println(s);
socket.close();
}
}
위의 코드를 작성할 때 다음 두 가지를 주의해야 합니다.1. 데이터 전송의 효율을 높이기 위해 Socket 클래스는 매번 write 방법을 호출한 후에 데이터 전송을 하지 않고 전송할 데이터를 하나의 버퍼에 (기본값은 8192바이트) 쓴 다음flush 방법으로 이 버퍼에 있는 데이터를 함께 보내기 때문에 bw.flush();꼭 필요합니다.
2. 문자열을 보낼 때 Hello World 뒤에'\r\r'를 붙이는 이유는 HTTP 프로토콜 헤더가'\r\r'를 종료 표시로 하기 때문이다. (HTTP 프로토콜의 상세한 내용은 나중에 설명할 것이다) 따라서 문자열을 보낸 후에'\r\r'를 추가하면 서비스 측에서 HTTP 헤더가 끝났다고 생각하고 처리할 수 있다."\r\r"를 추가하지 않으면 서버 프로그램은 HTTP 헤더가 끝날 때까지 기다립니다. 즉, "\r\r"입니다.만약 이렇다면, 서버 프로그램은 클라이언트에게 응답 정보를 보내지 않을 것이며, Br.readLine () 은 연결 시간이 초과될 때까지 응답 정보면을 읽을 수 없기 때문에 막힙니다.
3. 네트워크 연결 해제
지금까지 우리는 Socket류의 기본적인 사용 방법에 대해 초보적인 이해를 했지만 Socket류가 데이터를 처리한 후에 가장 합리적인 마무리 방법은 Socket류의close 방법으로 네트워크 연결을 닫는 것이다.에서 close 방법을 사용했지만 네트워크 연결을 닫는 방법은close 방법만 있는 것이 아니라 자바가 어떤 상황에서 네트워크 연결을 닫을 수 있는지 보여 줍니다.
네트워크 연결을 종료할 수 있는 경우는 다음과 같은 4가지가 있습니다.
Socket 대상이 닫힌 후, 우리는 isClosed 방법을 통해 어떤 Socket 대상이 닫힌 상태인지 판단할 수 있습니다.그러나 isClosed 방법을 사용하여 되돌아오는 것은 Socket 대상의 현재 상태입니다. 즉, Socket 대상이 연결에 성공한 적이 있든 없든 닫힌 상태라면 isClosde는true로 되돌아옵니다.연결되지 않은 Socket 대상만 만들면 isClose도true로 돌아갑니다.다음 코드는false를 출력합니다.
Socket socket = new Socket();
System.out.println(socket.isClosed());
isClose 방법 외에 Socket 클래스는 Socket 대상의 연결 성공 여부를 판단하는 isConnected 방법이 있습니다.이 이름을 보면 독자들이 오해를 하게 될지도 모른다.사실 isConnected 방법이 판단하는 것은 Socket 대상의 현재 연결 상태가 아니라 Socket 대상이 연결에 성공한 적이 있는지입니다. 만약에 연결에 성공했다면 현재 isClose가true로 되돌아와도 isConnected는true로 되돌아옵니다.따라서 현재의 Socket 대상이 연결 상태인지 판단하려면 isClose와 isConnected 방법을 동시에 사용해야 한다. 즉, isClose가false로 돌아가고 isConnected가true로 돌아갈 때만 Socket 대상이 연결 상태에 있다.다음 코드는 위의 Socket 객체의 다양한 상태 생성 과정을 보여 줍니다.
package mysocket;
import java.net.*;
public class MyCloseConnection
{
public static void printState(Socket socket, String name)
{
System.out.println(name + ".isClosed():" + socket.isClosed());
System.out.println(name + ".isConnected():" + socket.isConnected());
if (socket.isClosed() == false && socket.isConnected() == true)
System.out.println(name + " !");
else
System.out.println(name + " !");
System.out.println();
}
public static void main(String[] args) throws Exception
{
Socket socket1 = null, socket2 = null;
socket1 = new Socket("www.ptpress.com.cn", 80);
printState(socket1, "socket1");
socket1.getOutputStream().close();
printState(socket1, "socket1");
socket2 = new Socket();
printState(socket2, "socket2");
socket2.close();
printState(socket2, "socket2");
}
}
위의 코드를 실행하면 다음과 같은 출력 결과가 나타납니다.socket1.isClosed():false
socket1.isConnected():true
socket1이 연결 상태입니다!
socket1.isClosed():true
socket1.isConnected():true
socket1이 비연결 상태입니다!
socket2.isClosed():false
socket2.isConnected():false
socket2는 비연결 상태입니다!
socket2.isClosed():true
socket2.isConnected():false
socket2는 비연결 상태입니다!
출력 결과에서 알 수 있듯이 socket1의 Output Stream이 닫힌 후에 socket1도 자동으로 닫힙니다.위의 코드에서 알 수 있듯이 서버에 연결되지 않은 Socket 대상 socket2에 대한 isClosed 방법은false이고 socket2의 isClosed 방법을true로 되돌리려면 socket2를 사용해야 한다.close 디스플레이에서 close 방법을 호출합니다.
대부분의 경우 Socket 클래스나 입력 출력 흐름의close 방법을 사용하여 네트워크 연결을 닫을 수 있지만, 때때로 우리는 Output Stream이나 Input Stream을 닫기를 원하지만, 입력 출력 흐름을 닫는 동시에 네트워크 연결을 닫지 않습니다.이것은 Socket 클래스의 다른 두 가지 방법을 사용해야 한다. 그것이 바로 shutdown Input과 shutdown Output이다. 이 두 가지 방법은 상응하는 입력, 출력 흐름만 닫고 네트워크 연결을 동시에 닫는 기능이 없다.isClosed, isConnected 방법과 마찬가지로 Socket 클래스도 Socket 대상의 입력, 출력 흐름이 닫혔는지 판단하는 두 가지 방법을 제공합니다. 이 두 가지 방법은 isInputShutdown () 과 isOutputShutdown () 입니다.다음 코드는 입력, 출력 흐름만 닫는 과정을 보여 줍니다.
package mysocket;
import java.net.*;
public class MyCloseConnection1
{
public static void printState(Socket socket)
{
System.out.println("isInputShutdown:" + socket.isInputShutdown());
System.out.println("isOutputShutdown:" + socket.isOutputShutdown());
System.out.println("isClosed:" + socket.isClosed());
System.out.println();
}
public static void main(String[] args) throws Exception
{
Socket socket = new Socket("www.ptpress.com.cn", 80);
printState(socket);
socket.shutdownInput();
printState(socket);
socket.shutdownOutput();
printState(socket);
}
}
위의 세대를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.isInputShutdown:false
isOutputShutdown:false
isClosed:false
isInputShutdown:true
isOutputShutdown:false
isClosed:false
isInputShutdown:true
isOutputShutdown:true
isClosed:false
출력 결과에서 알 수 있듯이 isClosed 방법은false로 되돌아오기 때문에 shutdown Input과shutdown Output는 Socket 대상의 상태에 영향을 주지 않는다는 것을 확신할 수 있습니다.
본고에서 기술한 것이 당신에게 도움이 되기를 바랍니다. 자바는 Socket 클래스를 사용하여 데이터 내용을 수신하고 발송하는 것을 여러분께 소개합니다.계속해서 저희 사이트에 관심을 가져주시기 바랍니다!자바를 배우고 싶으면 본 사이트에 계속 관심을 가져도 됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
React 구성 요소에서 소켓 이벤트 리스너가 여러 번 실행됩니다.기본적이지만 종종 간과되는 사이드 프로젝트를 하면서 배운 것이 있습니다. 이 프로젝트에는 단순히 두 가지 주요 부분이 포함되어 있습니다. 프런트 엔드: 반응 및 재료 UI 백엔드: Express, Typescript...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.