Java-socket

(글 을 옮 겨 실 으 면 원작 자 는 고증 할 길이 없고 작가 의 사심 없 는 헌신 에 감사 한다)사실상 인터넷 프로 그래 밍 의 간단 한 이 해 는 두 컴퓨터 가 서로 데 이 터 를 통신 하 는 것 일 뿐이다.프로그래머 에 게 는프로 그래 밍 인 터 페 이 스 를 파악 하고 프로 그래 밍 모델 을 사용 하면 상대 적 으로 훨씬 간단 해 집 니 다.자바 SDK 는 상대 적 으로 간단 한 Api 를 제공 하여 이 작업 을 완성 합 니 다.socket 은 그 중의 하나 입 니 다.자바 에 게 이러한 Api 는 자바.net 이라는 가방 안에 존재 합 니 다.따라서 이 가방 을 가 져 오기 만 하면 네트워크 프로 그래 밍 을 준비 할 수 있 습 니 다.네트워크 프로 그래 밍 의 기본 모델 은 클 라 이언 트 가 서버 모드 로 가 는 것 입 니 다.형.쉽게 말 하면 두 프로 세 스 가 서로 통신 한 다음 에 그 중 하 나 는 고정된 위 치 를 제공 해 야 하고 다른 하 나 는 이 고정된 위 치 를 알 아야 한다.그리고 이들 의 관 계 를 구축 하고 데이터 의 통신 을 완성 하면 된다.여기 서 고정된 위 치 를 제공 하 는 것 을 서버 라 고 하 는데 관 계 를 구축 하 는 것 을 클 라 이언 트 라 고 한다.이 간단 한 모델 을 바탕 으로네트워크 프로 그래 밍 에 들 어 갈 수 있 습 니 다.자바 가 이 모델 에 대한 지원 은 여러 가지 api 가 있 습 니 다.여기 서 저 는 Socket 과 관련 된 프로 그래 밍 인 터 페 이 스 를 소개 하고 싶 습 니 다.자바 에 게 는 Socket 의 프로 그래 밍 인 터 페 이 스 를 간소화 하 였 습 니 다.우선 고정 적 인 위 치 를 제공 하 는 서비스 측 이 어떻게 만 들 었 는 지 토론 하 겠 습 니 다.자바 가 ServerSocket 을 제공 하여 이 를 지원 합 니 다.사실은 이러한 실력 을 만 들 었 을 때포트 자원 을 제공 하 는 것 처럼 다른 컴퓨터 가 접근 할 수 있 는 고정 위 치 를 만 들 었 습 니 다.
ServerSocket server=new ServerSocket(6789);

 
여기 서 주의해 야 할 것 은 포트 의 분배 가 유일 해 야 한 다 는 것 입 니 다.포트 는 모든 컴퓨터 의 유일한 서 비 스 를 표시 하기 위 한 것 이기 때 문 입 니 다.또한 포트 번 호 는 0~65535 사이 이 고 앞의 1024 개의 포트 는 Tcp/Ip 에 의 해 보존 포트 로 되 어 있 습 니 다.따라서 당신 이 할당 한 포트 는 1024 개 이후 에 만 있 을 수 있 습 니 다.자,우 리 는 고정 적 인 위치 가 있 습 니 다.지금 필요 한 것 은 하나의 연결선 입 니 다.이 연결선 은 고객 측 이 먼저 요구 합 니 다.따라서 자바 역시 하나의 Socket 대상 을 제공 하여 지원 합 니 다.고객 측 이 Socket 의 인 스 턴 스 대상 을 만 들 기만 하면 됩 니 다.
Socket client=new Socket(InetAddress.getLocalHost(),5678);

 
클 라 이언 트 는 서버 와 관련 된 IP 주 소 를 알 아야 합 니 다.자바 에 대해 서도 InetAddress 와 관련 된 인 스 턴 스 를 제공 합 니 다.이 대상 의 인 스 턴 스 는 정적 인 방법 으로 제공 해 야 합 니 다.정적 인 방법 은 주로 이 컴퓨터 의 IP 와 이름 이나 IP 를 통 해 InetAddress 를 직접 얻 는 방법 을 제공 합 니 다.자,위의 방법 은 기본적으로 하나의 연결선 을 만들어 두 컴퓨터 가 서로 교차 하도록 할 수 있 습 니 다.흐 르 고 있 습 니 다.그런데 데 이 터 는 어떻게 전송 되 나 요?사실 I/O 작업 은 항상 네트워크 프로 그래 밍 과 밀접 한 관 계 를 가진다.바 텀 네트워크 는 데 이 터 를 계속 하기 때문이다.원 격 호출 을 하지 않 는 한 문 제 를 처리 하 는 핵심 은 실행 되 고 있다.그렇지 않 으 면 데이터 의 상호작용 은 IO 작업 에 의존 하기 때문에 자바.io 라 는 가방 을 가 져 와 야 한다.자바 의 IO 작업 도 복잡 하지 않다.바이트 흐름 과 유 니 코드 에 대한 독자 와 작성 자 를 제공한다.그리고 데이터 읽 기와 쓰기 에 사용 할 버퍼 도 제공 합 니 다.
BufferedReader in=
new BufferedReader(new InputStreamReader(server.getInputStream())); 
PrintWriter out=new PrintWriter(server.getOutputStream()); 

위의 두 문장 은 버퍼 를 만 들 고 원본 바이트 흐름 을 유 니 코드 로 바 꾸 는 것 입 니 다.원본 바이트 흐름 은 Socket 의 두 가지 방법 에서 유래 합 니 다.getInputStream()과 getOutputStream()측.각각 입력 과 출력 을 얻 을 수 있 습 니 다.그러면 현재 기본 적 인 모델 과 기본 적 인 조작 도구 가 있 습 니 다.우 리 는 간단 한 Socket 루틴 을 만 들 수 있 습 니 다.서비스 측:
import java.io.*;
import java.net.*;

public class Myserver {
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(8800);//         
		Socket client = server.accept();
		BufferedReader in = new BufferedReader(new InputStreamReader(client
				.getInputStream()));
		PrintWriter out = new PrintWriter(client.getOutputStream());
		while (true) {
			String str = in.readLine();
			System.out.println(str);//        ,      
			out.println("has receive....");//         
			out.flush();
			if (str.equals("end"))
				break;
		}
		client.close();
	}
}

 이 프로그램의 주요 목적 은 서버 가 클 라 이언 트 가 기록 한 정 보 를 계속 받 는 것 입 니 다.클 라 이언 트 가"End"문자열 을 보 내 면 프로그램 을 종료 합 니 다.또한 서버 도"Receive"를 응답 합 니 다.클 라 이언 트 가 메 시 지 를 받 았 음 을 알려 줍 니 다.클 라 이언 트 코드:
import java.net.*;
import java.io.*;

public class Myclient {
	static Socket server;

	public static void main(String[] args) throws Exception {
		server = new Socket(InetAddress.getLocalHost(), 8800);//       ,  IP
		BufferedReader in = new BufferedReader(new InputStreamReader(server
				.getInputStream()));
		PrintWriter out = new PrintWriter(server.getOutputStream());
		BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));

		while (true) {
			String str = wt.readLine();
			out.println(str);//       
			out.flush();
			if (str.equals("end")) {
				break;
			}
			System.out.println(in.readLine());//       ,     
		}
		server.close();
	}
}

 
클 라 이언 트 코드 는 클 라 이언 트 키보드 의 입력 을 받 고 이 정 보 를 출력 한 다음 에'End'를 출력 하여 종료 표 지 를 하 는 것 입 니 다.이 프로그램 은 간단 한 두 컴퓨터 간 의 통신 일 뿐 입 니 다.여러 클 라 이언 트 가 동시에 서버 를 방문 한다 면?클 라 이언 트 를 다시 실행 해 보 세 요.결 과 는 이상 합 니 다.그러면 여러 클 라 이언 트 는 어떻게 실현 합 니까?사실 간단하게 분석 해 보면,이 를 통 해 알 수 있 듯 이 고객 과 서비스 통신 의 주요 채널 은 바로 Socket 자체 이다.서버 는 accept 방법 을 통 해 고객 과 통신 하 는 것 에 동의 하 는 것 이다.그러면 고객 이 Socket 을 구축 하 는 동시에 서버 도 이 연결선 을 사용 하여 선후 로 통신 할 것 이다.그러면 우리 가 여러 개의 연결선 만 존재 하면 된다.그러면 우리 의 프로그램 은 다음 과 같이 변 할 수 있다.서버:
import java.io.*; 
import java.net.*; 

public class MyServer { 
public static void main(String[] args) throws IOException{ 
ServerSocket server=new ServerSocket(5678); 
while(true){ 
Socket client=server.accept(); 
BufferedReader in=
new BufferedReader(new InputStreamReader(client.getInputStream())); 
PrintWriter out=new PrintWriter(client.getOutputStream()); 
while(true){ 
String str=in.readLine(); 
System.out.println(str); 
out.println("has receive...."); 
out.flush(); 
if(str.equals("end")) 
break; 
} 
client.close(); 
} 
} 
} 

여 기 는 단지 하나의 외부 While 순환 을 추가 한 것 입 니 다.이 순환 의 목적 은 한 고객 이 들 어 오 면 이 고객 이 서버 와 의 상호작용 을 완성 할 때 까지 Socket 을 분배 하 는 것 입 니 다.여 기 는 바로 고객 의'End'메 시 지 를 받 아들 이 는 것 입 니 다.그러면 지금 은 여러 고객 간 의 상호작용 을 실현 할 수 있 습 니 다.그러나 문제 가 또 생 겼 습 니 다.이렇게 하면 여러 고객 을 해 결 했 지만,그러나 줄 을 서서 실 행 했 습 니 다.즉,한 고객 과 서버 가 한 번 의 통신 을 마 친 후에 야 다음 고객 이 들 어 와 서 서버 와 상호작용 을 할 수 있 습 니 다.동시에 서 비 스 를 할 수 없습니다.그러면 어떻게 해 야 서로 교류 할 수 있 고 동시에 교류 할 수 있 습 니까?이것 은 병렬 실행 문제 임 이 분명 합 니 다.따라서 스 레 드 가 가장 좋 은 해결 방안 입 니 다.그러면 다음 문 제 는 스 레 드 를 어떻게 사용 하 느 냐 하 는 것 입 니 다.먼저 해 야 할 일 은 스 레 드 를 만 들 고 네트워크 와 연결 할 수 있 도록 하 는 것 입 니 다.그 다음 에 스 레 드 를 만 들 거나 Thread 를 직접 계승 하거나 Runnable 인 터 페 이 스 를 실현 하 는 것 입 니 다.Socket 과 의 관 계 를 맺 으 려 면 인용 만 전달 하면 됩 니 다.스 레 드 를 실행 하려 면 run 방법 을 다시 써 야 합 니 다.run 방법 이 한 일 은 방금 단일 스 레 드 버 전 main 이 한 일 입 니 다.그래서 우리 프로그램 은 이렇게 되 었 습 니 다.
import java.net.*; 
import java.io.*; 

public class MultiUser extends Thread{ 
private Socket client; 

public MultiUser(Socket c){ 
this.client=c; 
} 

public void run(){ 
try{ 
BufferedReader in=
new BufferedReader(new InputStreamReader(client.getInputStream())); 
PrintWriter out=new PrintWriter(client.getOutputStream()); 
//Mutil User but can't parallel 
while(true){ 
String str=in.readLine(); 
System.out.println(str); 
out.println("has receive...."); 
out.flush(); 
if(str.equals("end")) 
break; 
} 
client.close(); 
}catch(IOException ex){ 
}finally{ 

} 
} 

public static void main(String[] args)throws IOException{ 
ServerSocket server=new ServerSocket(5678); 
while(true){ 
//transfer location change Single User or Multi User 
MultiUser mu=new MultiUser(server.accept()); 
mu.start(); 
} 
} 
} 

제 클래스 는 Thread 클래스 에서 직접 계승 되 었 습 니 다.또한 구조 함수 전달 인용 을 통 해 클 라 이언 트 Socket 과 관 계 를 맺 었 습 니 다.그러면 모든 스 레 드 가 있 습 니 다.하나의 통신 파이프 도 있 습 니 다.마찬가지 로 우 리 는 run 방법 을 작성 할 수 있 습 니 다.이전의 작업 을 스 레 드 에 맡 겨 완성 할 수 있 습 니 다.이렇게 많은 고객 이 병행 하 는 Socket 이 만 들 어 졌 습 니 다.
 
 
===============총괄========================
1.Eclipse 환경 에서 단일 컴퓨터 에서 자바 Socket 프로그램 을 디 버 깅 할 수 있 습 니 다.
2.디 버 깅 할 때 먼저 서버 엔 드 프로그램 MyServer.자바 를 실행 한 다음 에 클 라 이언 트 프로그램 MyClient.자바 프로그램 을 실행 합 니 다.
3.프로그램의 5678 은 포트 번호 입 니 다.포트 가 점용 되면"Unrecognized Windows Sockets error:0:JVM"이 나타 납 니 다.이상해결 방법 은 포트 번 호 를 수정 하 는 것 이다.주의해 야 할 것 은 포트 번 호 를 수정 하려 면 서버 단말기 클 라 이언 트 프로그램의 포트 번 호 를 일치 하 게 수정 해 야 한 다 는 것 이다.

좋은 웹페이지 즐겨찾기