Socket 에 대한 분석 및 쌍방 인 스 턴 트 메 신 저 자바 구현 방법
우선 Socket 의 통신 과정 전 체 를 소개 하 겠 습 니 다.
먼저 서버 에서 SocketServer 를 만 듭 니 다.SocketServer 를 만 들 려 면 포트 번 호 를 지정 해 야 합 니 다.다음 과 같 습 니 다.
ServerSocket serverSocket=new ServerSocket(8888);
이렇게 해서 포트 번호 8888 인 ServerSocket 을 간단하게 열 었 습 니 다.그 다음 에 우 리 는 클 라 이언 트 로부터 연결 요청 을 받 아야 합 니 다.즉,그림 속 Other Socket 입 니 다.우 리 는 Socker Server 의 accept 방법 으로 연결 을 만 들 수 있 습 니 다.그리고 이 방법 은 Socket 으로 돌아 가 Other Socker 와 통신 할 수 있 습 니 다.쉽게 말 하면 우 리 는 Socker Server 를 이용 하여 Socket 을 얻 은 다음 에 이 Socket 을 이용 하여 다른 사람과 통신 하 는 것 입 니 다.
그 다음 에 우 리 는 Socket 의 입 출력 흐름 을 얻 고 정 보 를 보 내 고 받 는 것 을 실현 합 니 다.이로써 우 리 는 두 측 이 Socket 통신 을 하 는 기본 적 인 방향 을 알 게 되 었 습 니 다.
다음은 ServerSocket 과 Socket 에 관 한 중요 한 방법 들 을 살 펴 보 겠 습 니 다.
ServerSocket
우선 Server Socket 의 구조 방법 을 살 펴 보 겠 습 니 다.모두 4 가지 가 있 습 니 다.
1.인삼 이 없 는 구조 방법:
ServerSocket(),바 인 딩 포트 번호 가 없 는 ServerSocket 인 스 턴 스 를 되 돌려 줍 니 다.
2.매개 변 수 를 포함 하 는 구조 방법:
ServerSocket(int port),주어진 포트 번 호 를 연결 한 ServerSocket 인 스 턴 스 를 되 돌려 줍 니 다.
3.두 개의 매개 변 수 를 포함 하 는 구조 방법:
ServerSocket(int port,int backlog)은 주어진 포트 번 호 를 연결 한 ServerSocket 인 스 턴 스 를 되 돌려 주 고 동기 화 대기 열(syns quue)의 크기 를 설정 합 니 다.
4.세 개의 매개 변 수 를 포함 하 는 구조 방법:
ServerSocket(int port,int backlog,InetAddress binddr)은 주어진 포트 번 호 를 연결 하 는 ServerSocket 인 스 턴 스 를 되 돌려 주 고 동기 화 대기 열(syns quue)의 크기 와 주어진 IP 주 소 를 연결 합 니 다.
주로 그것 의 몇 가지 방법 을 본다.
accept()
이 방법 은 연결 을 감청 하고 연결 되면 Socket 을 되 돌려 통신 에 사용 합 니 다.주의해 야 할 것 은 이 방법 은 차단 방법 입 니 다.연결 프로그램 이 없 으 면 계속 실행 되 지 않 습 니 다.
close()
Socket 을 닫 습 니 다.accept 가 막 히 고 있 으 면 Socket Exception 의 이상 을 던 집 니 다.
ServerSocket 에 대해 서 는 더 이상 군말 하지 않 겠 습 니 다.Socket 을 살 펴 보 겠 습 니 다.
Socket
구조 방법 은 여전히 여러 가지 가 존재 하 는데,여 기 는 비교적 전형 적 인 것 만 을 제시 할 뿐이다.
Socket(String host,int port),첫 번 째 매개 변 수 는 호스트 의 IP 주 소 를 문자열 로 입력 하고 두 번 째 매개 변 수 는 포트 번호 입 니 다.
getInputStream(), getOutputStream()
Socket 의 입 출력 흐름 을 가 져 옵 니 다.우 리 는 BufferReader 와 PrintWriter 를 이용 하여 이 두 흐름 을 조작 할 수 있 습 니 다.다음 과 같 습 니 다.
BufferReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(
new OutputStreamWriter(socket.getOutputStream()));
다음은 서로 통신 하 는 자바 구현 을 간단하게 작성 합 니 다.우선 서버
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* Created by Mezereon on 2017/3/1.
*/
public class TCPServer {
private Socket socket;
private ServerSocket serverSocket;
private BufferedReader reader;
private PrintWriter writer;
private Scanner scanner = new Scanner(System.in);
//
public void run() throws IOException {
startTheSocket();
}
public void startTheSocket() throws IOException {
serverSocket=new ServerSocket(18080); // 18080
acceptTheSocket();// Socket,reader,writer
openTheNewThreadToGetMessageFromClient();
while(true) {
getYourMessage();//
}
}
// Socket,reader,writer
private void acceptTheSocket() throws IOException {
socket=serverSocket.accept();// , Socket
System.out.println("Some one connect me ,it is "+socket.getLocalSocketAddress());//
System.out.println("It's port is "+socket.getPort());//
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//
writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));//
}
//
private void getYourMessage() throws IOException {
String yourMessage = scanner.nextLine();
checkYourMessage(yourMessage);//
writer.println(yourMessage);//
writer.flush();//flush , flush
}
//
private void checkYourMessage(String yourMessage) throws IOException {
//
if (yourMessage.equals("exit")) {
socket.close();
writer.close();
reader.close();
System.exit(0);
}
}
//
private void openTheNewThreadToGetMessageFromClient() throws IOException {
//
new Thread(new Runnable() {
@Override
public void run() {
getTheMessageFromClient();
}
}).start();
}
//
private void getTheMessageFromClient() {
while(true) {
String messageFromClient = null;
try {
messageFromClient = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
printTheMessage(messageFromClient);//
}
}
//
private void printTheMessage(String messageFromClient) {
if(messageFromClient!=null)
System.out.println("He say:"+messageFromClient);
}
}
그리고 클 라 이언 트 를 작성 하기 시작 합 니 다:
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/**
* Created by Mezereon on 2017/2/27.
*/
public class TCPClient {
private Socket socket;
private BufferedReader reader ;
private PrintWriter writer;
private Scanner scanner = new Scanner(System.in);
// Socket
public void run() throws IOException{
startTheSocket();
}
//
private void startTheSocket() throws IOException{
toConnectTheServer();// Socket
openTheThreadToReceiveInfoFromServer();//
// ,
while(true) {
String yourMessage = scanner.nextLine();
//
if(yourMessage!=null) {
writer.println(yourMessage);
writer.flush();// flush
}
//
if (yourMessage.equals("exit")) {
disConnect();
System.exit(0);
}
}
}
// Socket 18080 reader writer
private void toConnectTheServer() throws IOException {
socket=new Socket("127.0.0.1",18080);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
}
private void openTheThreadToReceiveInfoFromServer() throws IOException {
new Thread(new Runnable() {
@Override
public void run() {
try {
printMessage();//
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
//
private void printMessage() throws IOException {
while (true) {
String messageFromServer = null;
try {
messageFromServer = reader.readLine();//
System.out.println("He say:" + messageFromServer);//
} catch (IOException e) {
e.printStackTrace();
} catch (NullPointerException e) {
}
if(messageFromServer.equals("exit")){
disConnect();//
System.exit(0);
}
}
}
//
private void disConnect() throws IOException {
socket.close();
reader.close();
writer.close();
}
}
이로써 Socket 통신 에 대한 간단 한 소개 와 자바 를 이용 한 간단 한 통신 의 실현 은 끝 났 습 니 다~이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.