>  기사  >  Java  >  Java에서 소켓 통신 중 고정 패킷을 처리하기 위한 예제 코드 공유

Java에서 소켓 통신 중 고정 패킷을 처리하기 위한 예제 코드 공유

零下一度
零下一度원래의
2017-05-27 09:59:223106검색

이 글은 주로 Java에서 소켓 통신 과정에서 Sticky Packet이 발생하는 상황을 소개합니다. 관심 있는 친구들은 참고할 수 있습니다.

지난 두 시간 동안 Java에서의 처리에 대해 배웠습니다. 소켓 통신 중 패킷이 고착되는 상황은 매우 중요하므로 오늘은 몇 가지 참고 사항을 추가하겠습니다.

끈끈한 패키지 처리 프로그램은 클라이언트의 메시지 수신 스레드입니다:

클라이언트:

import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.io.Reader; 
import java.net.Socket; 
import java.nio.CharBuffer; 
 
public class TestSocketClient { 
 
   
  public static void main(String[] args) { 
    // TODO Auto-generated method stub 
     
    new TestSocketClient().start(); 
  } 
  class SendThread extends Thread{ 
    private Socket socket; 
    public SendThread(Socket socket){ 
      this.socket=socket; 
    } 
    @Override 
    public void run(){ 
      while(true){ 
        try{ 
          Thread.sleep(1000);  
          String send="<SOAP-ENV:Envelope>"+System.currentTimeMillis()+"</SOAP-ENV:Envelope>"; 
          PrintWriter pw=new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); 
          pw.write(send); 
          pw.flush(); 
        }catch(Exception e){ 
          e.printStackTrace(); 
        } 
      } 
    } 
  } 
  class ReceiveThread extends Thread{ 
    private Socket socket; 
    private volatile byte[] bytes=new byte[0]; 
    public ReceiveThread(Socket socket){ 
      this.socket=socket; 
    } 
    public byte[] mergebyte(byte[] a,byte[] b,int begin,int end){ 
      byte[] add=new byte[a.length+end-begin]; 
      int i=0; 
      for(i=0;i<a.length;i++){ 
        add[i]=a[i]; 
      } 
      for(int k=begin;k<end;k++,i++){ 
        add[i]=b[k]; 
      } 
      return add; 
    } 
    @Override 
    public void run(){ 
      while(true){ 
        try{ 
          InputStream reader=socket.getInputStream(); 
          if(bytes.length<2){ 
            byte[] head=new byte[2-bytes.length]; 
            int couter=reader.read(head); 
            if(couter<0){ 
              continue; 
            } 
            bytes=mergebyte(bytes,head,0,couter); 
            if(couter<2){ 
              continue; 
            } 
          } 
          //下面这个值请注意,一定要取2长度的字节子数组作为报文长度,你懂得 
          byte[] temp=new byte[0]; 
          temp=mergebyte(temp,bytes,0,2); 
          String templength=new String(temp); 
          int bodylength=Integer.parseInt(templength);       
          if(bytes.length-2<bodylength){ 
            byte[] body=new byte[bodylength+2-bytes.length]; 
            int couter=reader.read(body); 
            if(couter<0){ 
              continue; 
            } 
            bytes=mergebyte(bytes,body,0,couter); 
            if(couter<body.length){ 
              continue; 
            } 
          } 
          byte[] body=new byte[0]; 
          body=mergebyte(body, bytes, 2, bytes.length); 
          System.out.println("client receive body:  "+new String(body)); 
          bytes=new byte[0]; 
        }catch(Exception e){ 
          e.printStackTrace(); 
        } 
      } 
    } 
  } 
  public void start(){ 
    try{ 
    Socket socket=new Socket("127.0.0.1",18889); 
    new SendThread(socket).start(); 
    new ReceiveThread(socket).start(); 
    }catch(Exception e){ 
      e.printStackTrace(); 
    } 
     
  } 
}

서버:

package com.meituan.service.bankgate.gateway; 
 
/** 
 * Created by cqx on 16/7/19. 
 */ 
import java.io.*; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.nio.CharBuffer; 
import java.util.Date; 
 
public class TESTAHAHHA { 
 
  private final static String SOAP_BEGIN = "<SOAP-ENV:Envelope"; 
  private final static String SOAP_END = "</SOAP-ENV:Envelope>"; 
  public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    TESTAHAHHA testserver=new TESTAHAHHA(); 
    testserver.start(); 
  } 
  public void start(){ 
    try{ 
      ServerSocket serversocket=new ServerSocket(18889); 
      while(true){ 
        Socket socket=serversocket.accept(); 
        new SocketThread(socket).start(); 
      } 
    }catch(Exception e){ 
      e.printStackTrace(); 
    } 
 
  } 
  class SocketThread extends Thread{ 
    private Socket socket; 
    private String temp; 
    public SocketThread(Socket socket){ 
      this.socket=socket; 
    } 
    public Socket getsocket(){ 
      return this.socket; 
    } 
    public void setsocjet(Socket socket){ 
      this.socket=socket; 
    } 
 
    @Override 
    public void run(){ 
      try{ 
        Reader reader=new InputStreamReader(socket.getInputStream()); 
        // Writer writer=new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8")); 
        OutputStream writer=socket.getOutputStream(); 
        CharBuffer charbuffer=CharBuffer.allocate(8192); 
        int readindex=-1; 
        while((readindex=reader.read(charbuffer))!=-1){ 
          charbuffer.flip(); 
          temp+=charbuffer.toString(); 
          if(temp.indexOf(SOAP_BEGIN)!=-1 && temp.indexOf(SOAP_END)!=-1){ 
            //System.out.println(new Date().toLocaleString()+"server:"+temp); 
            temp=""; 
            String str="receive the soap message hahahah"; 
            byte[] headbytes=str.getBytes(); 
            int length=headbytes.length; 
            String l=String.valueOf(length); 
            byte[] lengthbytes=l.getBytes(); 
            byte[] bytes=new byte[length+lengthbytes.length]; 
            int i=0; 
            for(i=0;i<lengthbytes.length;i++){ 
              bytes[i]=lengthbytes[i]; 
            } 
            for(int j=i,k=0;k<length;k++,j++){ 
              bytes[j]=headbytes[k]; 
            } 
            System.out.println("server send:"+new String(bytes)); 
            writer.write(bytes); 
            writer.flush(); 
          }else if(temp.indexOf(SOAP_BEGIN)!=-1){ 
            temp=temp.substring(temp.indexOf(SOAP_BEGIN)); 
          } 
          if(temp.length()>1024*16){ 
            break; 
          } 
        } 
      }catch(Exception e){ 
        e.printStackTrace(); 
      }finally{ 
        if(socket!=null){ 
          try{ 
            if(!socket.isClosed()){ 
              socket.close(); 
            } 
          }catch(Exception e){ 
            e.printStackTrace(); 
          } 
        } 
      } 
    } 
  } 
 
}

[관련 권장 사항 ]

1. 소켓을 통한 Java와 PHP 간의 통신 예제 튜토리얼 >3.

일반적인 소켓 오류 요약

4. >소켓과 http의 차이점 요약

위 내용은 Java에서 소켓 통신 중 고정 패킷을 처리하기 위한 예제 코드 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.