이 기사의 예제는 소켓을 사용하여 Java의 프로세스를 공유하여 참조를위한 다운로더 및 관련 코드를 만듭니다. 특정 내용은 다음과 같습니다
1. 첫째, 정보를 처리하고 클라이언트 (컴퓨터)로 파일을 전송하기 위해 서버를 설정하십시오.
내 컴퓨터를 사용하여 Wi -Fi를 켜고 전화에 연결하여 스카 킷을 사용하여 전송했습니다.
실제 상황에 따라 Serverip을 변경해야합니다. 포트는 또한 5 ~ 65535로 변경 될 수 있습니다. 더 큰 것을 선택하십시오.
import java.io.bufferedInputStream; import java.io.bufferedoutputStream; import java.io.bufferedReader; import java.io.bufferedReader; import java.io.bufferedWriter; import java.io.file; import java.io.fileInputStreamReader; java.io.printwriter; import java.net.serversocket; import java.net.socket;/** * Android 클라이언트 및 PC 서버 테스트 : 클라이언트 정보를 수신하고 클라이언트로 다시 보냅니다 * * @author ameyume */public class server emplements runnivention public string serverip = " // 9888 포트 공개 정적 최종 최종 int serverport = 9888을 정의합니다. // 파일을 정의하여 개인 파일 = null; public static void main (String [] args) {// 전송 스레드를 수행하기 위해 스레드를 호출하는 메소드를 만듭니다. goodtopserverthread.start (); } public void run () {try {system.out.println ( "s : 연결 ... 9888"); // Socket ServerSocket 생성 ServerSocket = New ServerSocket (ServerPort); while (true) {// 클라이언트 요청을 받기를 기다립니다. 소켓 클라이언트 = serversocket.accept (); System.out.println ( "S : 수신 ... 9888"); 시도 {// 클라이언트 정보 수락 버퍼드 리더 in = new BufferedReader (new inputStreamReader (client.getInputStream ()); System.out.println ( "S : 클라이언트 정보 받기"); // 클라이언트 정보 읽기 문자열 str = in.Readline (); 문자열 str1 = str.substring (0,2); 문자열 str2 = str.substring (2); System.out.println (str); // 클라이언트의 요청에 따라 해당 파일을 찾아 파일 크기 값을 if (str.equals ( "file_size"))로 전달합니다. {// 전송하려는 파일을 정의합니다 (여기서 e 디스크 아래에 파일을 썼음) 파일 = 새 파일 ( "e : // 파일"); // 입력 스트림 fileInputStream fis = new FileInputStream (파일); // 출력 스트림 bufferedInputStream bis = new bufferedInputStream (FIS); // 전송할 파일 크기를 계산 int sum = bis.available (); // int 유형의 파일 크기를 문자열로 변환 string s = string.valueof (sum); System.out.println (s); // 파일 크기 정보를 보내기 위해 출력 스트림을 작성하여 printwriter out = new PrintWriter (new bufferedWriter (new outputStreamWriter (client.getOutputStream ()), true); // 파일 크기 정보를 전송합니다 .println (s); // 스트림을 닫습니다 .Flush (); bis.close (); } else if (str1.equals ( "ok")) {int a = integer.parseint (str2); // 클라이언트가 파일 크기 값을 수신 한 후 클라이언트가 보낸 "OK"에 따라 파일을 전달합니다. bufferedOutputStream bos = new BufferedOutputStream (client.getOutputStream ()); System.out.println ( "S : 시작 전송"); // if (true) {// 입력 스트림 fileInputStream fis = new FileInputStream (파일); // fis.skip (a) 전에 전송 된 바이트를 건너 뜁니다. // 버퍼 입력 스트림 bufferedInputStream bis = 새로운 bufferedInputStream (FIS); int t = -1; while ((t = bis.read ())> = 0) {bos.write (t); } 문자열 s = "전송"; // 스트림을 닫습니다 bos.flush (); bis.close (); bos.close (); // serversocket.close (); System.out.println ( "S : 수신 : ' + s +"' "); }} else {System.out .println ( "클라이언트의 수신기가 아닙니다!"); }} catch (예외 e) {system.out.println ( "s : error 1"); e.printstacktrace (); } 마침내 {client.close (); System.out.println ( "S : Done."); }}} catch (예외 e) {System.out.println ( "S : 오류 2"); e.printstacktrace (); }}} 2. 다른 클라이언트를 만들면 MainActivity를 사용합니다. Java는 Android에서 작성했습니다 (휴대 전화에서 실행).
package com.xhy.zz; import android.app.activity; import android.content.intent; import android.os.bundle; import Android.os.handler; import android.os.message; import android.view.view; import android.view.view.view.view.onclicklistener; import and classecttitic; import.widget.button; widget. {// 핸들러 정의 공개 정적 처리기 MyHandler; // 의도의 의도 의도 의도 정의; // 개인 텍스트 제어를 가져옵니다. Text_name; Private TextView Text_Percent; 개인 버튼 BTN_START; 개인 버튼 BTN_STOP; // 파일 디스플레이 프라이버시 텍스트 뷰 text_sel_file; @override protected void oncreate (Bundle SavedInstancestate) {// todo 자동 생성 메소드 스터브 Super.oncreate (SavedInstancestate); setContentView (R.Layout.Activity_Main); text_name = (textView) findViewById (r.id.text_name); text_percent = (textView) findViewById (r.id.text_percent); btn_start = (버튼) findViewById (r.id.btn_start); btn_stop = (버튼) findViewById (r.id.btn_stop); // 버튼 1의 정보를 반환하고 진행 상황 표시 myHandler = new handler () {@Override public void handlemessage (message msg) {super.handleMessage (msg); if (msg.hat == 0x0001) {번들 데이터 = msg.getData (); 문자열 str = data.getString ( "value"); text_percent.settext (str); }}}}; // HelloService 의도 삽입 = 새로운 의도 (this, downservice.class); // 시작 버튼 설정 클릭 이벤트 btn_start.setonClickListener (new onclickListener () {@override public void onclick (view v) {// STARKERVICE (intent);}}); // 중지 버튼을 클릭하면 event btn_stop.setonClickListener (new onclickListener () {@override public void onclick (view v) {// 서비스 stopservice (intent);}}); } / ****반환 값이 반환되면 콜백 메소드가 자동으로 호출됩니다. // 요청 코드가 0이고 반환 된 결과 코드가 1 인 경우 // 요청 된 활동은 여러 결과 코드를 반환 할 수 있습니다. 문자열 str = data.getString ( "파일"); // 데이터 표시 text_sel_file.settext (str); }}} 3. Activity_Main.xml 파일
<? xml version = "1.0"encoding = "utf-8"?> <linearlayout xmlns : android = "http://schemas.android.com/apk/res/android"android : layout_width = "match_parent"andlay : layout_height = "mays_parent"및 layout_height _height : Android : "vertical"> <linearlayout android : layout_width = "wrap_content"android : layout_height = "wrap_content : layout_margintop ="20dp "Android : Orientation ="Horizontal "> <textView Android : id ="+id/text _ and text " Android : layout_height = "wrap_content"Android : layout_gravity = "center_vertical"Android : 텍스트 = "1" /> <TextView Android : id = "@+id /text_percent"Android : layout_width = "50dp"android : layout_height = "wrap_content"Android : "wrap_content"Android : "50dp" Android : layout_marginleft = "20dp"Android : text = "0%"/> <linearlayout android : layout_width = "wrap_content"Android : layout_height = "wrap_content"Android : layout_marginleft = "20dp"Android : "vuttical"> id button and id Android : layout_width = "wrap_content"Android : layout_height = "wrap_content"Android : 텍스트 = "시작" /> <버튼 안드로이드 : id = "@+id /btn_stop"android : layout_width = "wrap_content"android : layout_height = "wrap_content"and text = "wrap_content". </linearLayout> </linearLayout> </linearLayout> </linearLayout>
4. DowndownService는 스레드가 백그라운드에서 다운로드를 실행할 수 있도록하는 데 사용됩니다.
package com.xhy.zz; import java.io.bufferedInputStream; import java.io.bufferedReader; import java.io.bufferedReader; import java.io.bufferedWriter; import java.io.file; import java.io.fileoutputstream; import java.io.inputstreamreder; java.io.outputStreamwriter; import java.io.printwriter; import java.net.inetaddress; import java.net.socket; import java.net.unknownhostexception; import android.app.service; import Android.content.context; import and and androng.content.intent; import.content.content.content android.os.bundle; import android.os.environment; import android.os.ibinder; import android.os.message; import android.util.log; public class downservice 확장 {private static final string tag = "socket_android"; // 기본 설정 메커니즘의 파일 이름 공개 정적 최종 문자열 preverence_name = "downservice"; // preferece 메커니즘의 작동 모드 public static int mode = context.mode_private; // 스레드 프리즈 스레드 WorkThread; // filename private string 정의 filename = "file"; // 포트 번호 개인 int 포트 = 9888; 개인 부울 isstop = false; / ****구현 해야하는 메소드*/ @Override public ibinder onbind (의도 의도) {return null; } @override public void oncreate () {super.oncreate (); } @Override public int onstartCommand (의도 의도, int 플래그, int startId) {log.v ( "tcp", filename); // 전송 메소드 생성 실행 가능 배경 작업 = new Runnable () {@override public void run () {// settitle ( "테스트 소켓 연결"); 소켓 소켓 = null; Socket Socket1 = NULL; 시도 { / * * 서버의 IP 주소를 지정하십시오.이 주소는 LAN 주소입니다. 인터넷을 서핑하기 위해 Wi-Fi를 사용하는 경우 PC의 Wi-Fi IP 주소입니다. * IPConfig에서 보았던 IP 주소는 다음과 같습니다. 이더넷 어댑터 무선 네트워크 연결 : * 연결 별 DNS 접미사. : IP 주소. . . *. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 서버의 IP와 포트를 사용하여 소켓 객체를 만들고 서버에 요청을 보내 파일 크기 값 socket1 = new Socket (ServerAddr, Port); 문자열 메시지 = "--- test_socket_android ---"; log.d ( "tcp", "c : 보내기 : ' + message +"' "); //이 객체를 통해 정보를 서버로 보내기 = 새 printWriter (new bufferedWriter (new outputStreamWriter (socket1.getoutPutStream ()), true); // 사용자가 입력 한 컨텐츠를 서버 out.println ( "file_size")로 보냅니다. out.flush (); // 서버 수신 정보 BufferedReader in = new BufferedReader (new inputStreamReader (socket1.getInputStream ()); // 파일 크기를 가져옵니다. string st1 = in.Readline (); log.d ( "tcp", str1); // 파일 크기를 int-type int sum = integer.parseint (str1)로 변환합니다. log.d ( "tcp", str1); // 입력 스트림을 닫습니다 .Close (); sharedpreferences sharedpreferences = getsharedpreferences (preference_name, mode); sharedpreferences.editor editor = sharedpreferences .edit (); // 전송 된 바이트를 가져 오십시오 int pre = sharedpreferences.getint ( "downservice", 0); int _pre = pre; // 서버로 보내기 위해 문자열로 변환 string s = string.valueof (_pre); // 서버의 IP와 포트를 사용하여 소켓 객체를 설정하고 서버에 다시 요청을 보내 파일 콘텐츠 소켓을 얻습니다. // 문자 요청을 서버로 보내 파일 printwriter out1 = new printwriter (new bufferedWriter (new outputStreamWriter (socket.getOutputStream ()), true); out1.println ( "ok"+s); Out1.flush (); out.close (); // 입력 스트림 정의 BufferedInputStream bis = new bufferedInputStream (socket.getInputStream ()); 문자열 파일 1 = 파일 이름; 문자열 파일; // 전화기에 sdcard가 삽입되어 있는지 확인하고 파일을 메모리 카드에 삽입 if (환경 .getexternalstoragestate (). Equals (환경 .media_mounted)) {file sdcard = 환경 .getexternalstoragedirectory (); // SD 카드 정의 파일 파일 = sdcard.getCanonicalFile () + "/" + file1; // 파일을 정의합니다. 출력 스트림 파일 OutputStream fos = 새 FileOutputStream (file, true); {int t = -1; int 다운로드 = pre; // 전송 당 바이트 수를 정의합니다. 바이트 [] buff = new Byte [8192]; log.i ( "sum", sum + ""); // 서버 파일을 휴대 전화 SD 카드에 쓰기 시작합니다. } fos.write (buff, 0, t); 다운로드 += t; // 전송 진행 상황 편집기 저장 .putInt ( "DownService", 다운로드); editor.commit (); // 전송이 완료되면 (다운로드 == SUM) {editor.putInt ( "downService", 0) 인 경우 저장된 정보를 재설정합니다. editor.commit (); } // 파일 전송의 진행을 가져옵니다. float wb = ((다운로드 * 100) / (float) sum); int wi = (int) wb; System.out.println (다운로드); 문자열 str = string.valueof (wi) + "%"; // 파일 전송 진행 상황을 BaseActivity로 전송하여 사용자 메시지 MSG = new Message ()에 표시합니다. // 메시지 생성 // 메시지 생성 메시지 msg.hat = 0x0001; // 메시지 유형 설정 // 번들 생성 데이터 번들 데이터 번들 데이터 = new Bundle (); data.putString ( "value", str); msg.setdata (데이터); // 핸들러를 사용하여 메시지 mainActivity.myHandler.SendMessage (msg); } // 입력 및 출력 스트림 bis.close ()를 닫습니다. fos.flush (); fos.close (); } catch (예외 e) {bis.close (); fos.flush (); fos.close (); }} log.d (태그, "서버에서 : '수신" + "'"); } catch (unknownHostException e) {log.e (tag, "192.168.155.1은 Uncle Server!"); } catch (예외 e) {e.printstacktrace (); } 마침내 {try {socket.close (); } catch (예외 e) {e.printstacktrace (); }}}}}}; Workthread = 새 스레드 (배경 공사); // IsAlive 메소드는 (! workthread.isalive ()) {// 새 스레드 workThread.start (); log.v ( "servicelife", "스레드가 작동하기 시작"); } else {log.v ( "Workthread", "Thread는 호출"); } return start_sticky; } @override public void ondestroy () {super.ondestroy (); // 인터럽트를 사용하여 스레드를 인터럽트합니다 isstop = true; log.v ( "servicelife", "ondestroy 방법은"); }} 5. 마지막으로 androidmanifest.xml 등록을 잊지 마십시오
<use-permission android : "android.permission.internet"/> <use-permission Android : name = "android.permont.mount_unmount_filesystems"> </use-permission> <use-permission android : name = "android.write.write_external_storage"> <service> <nowservice>
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.