TCP 커뮤니케이션에 대해 명확 해야하는 일부 사항 :
TCP 통신은 연결 지향적이며 먼저 서버를 시작한 다음 클라이언트를 시작해야합니다.
클라이언트와 서버 모두 소켓 객체를 생성해야합니다. 클라이언트는 서버 소켓 (IP+포트)을 지정해야하며 서버는 서비스 포트를 지정해야합니다.
Socket Client_Socket = New Socket ( "192.168.100.17", 8888); // 클라이언트 소켓 (소켓 클래스의 소켓은 연결된 소켓) 서버 소켓 Listen_Socket = New Serversocket (8888); // 서버 소켓, 현재로서는 청취 소켓입니다 (주소와 포트가 바인딩되었습니다 ())
서버는 수락 () 메소드를 사용하여 청취 소켓을 연결된 소켓으로 변환해야합니다. 이 청취 소켓은 여러 연결된 소켓을 생성 할 수 있으므로 연결 후 다른 클라이언트의 요청을들을 수도 있습니다. 따라서 여기에서 멀티 스레딩을 사용하여 동시 액세스를 구현해야합니다. 연결된 소켓을 얻은 후 클라이언트의 IP 주소, 요청이 전송되는 포트 등과 같은 많은 클라이언트 정보를 얻을 수 있습니다.
Socket Server_scoket = socket.accept (); socket server_scoket2 = socket.accept (); socket server_scoket3 = socket.accept ();
서버에서 동시 연결을 구현하려면 다음 코드를 대략 사용하십시오. 여기서 ThreadTask는 스레드 작업 객체입니다.
public static void main (String [] args)은 ioexception {serversocket listen_sock = new serversocket (8888); // 소켓을 들으려면 하나만 있으면됩니다. (true) 작업 외부에있는 동안 {// 연결이 설정 될 때마다 스레드가 열립니다. Socket Conn_Sock = Listen_Sock.Accept (); // 새 연결이 나오지 않으면 기본 스레드 가이 새 스레드 (new ThreadTask (Conn_Sock))을 차단합니다. 시작 (); }}클라이언트는 연결된 소켓을 기반으로 출력 스트림을 얻어야하며 서버는 소켓을 기반으로 입력 스트림을 얻어야합니다. 물론 연결된 소켓이 있으므로 모든 끝에서 입력 스트림과 출력 스트림을 얻을 수 있습니다.
outputStream send_stream = client_socket.getOutputStream (); // 클라이언트는 출력 스트림 inputStream recv_stream = server_socket.getInputStream ()을 얻습니다.
서버는 연결된 소켓을 적극적으로 닫아야하며 청취 소켓은 적절한 장소에서 닫아야합니다.
서버는 서버를 지속적으로 수신해야합니다.
간단한 클라이언트 :
import java.io.ioexception; import java.io.outputStream; import java.net.socket; public class tcpclient {public static void main (String [] args) {// 1. 클라이언트 소켓 C_SOCK = NULL; outputStream client_outStream = null; try {c_sock = 새 소켓 ( "192.168.0.124", 8888); // 2. 출력 스트림 get client_outstream = c_sock.getOutputStream (); // 3. 출력 데이터 client_outstream.write ( "안녕하세요, 나는오고 있습니다".getBytes ()); } catch (ioexception e) {e.printstacktrace (); } 마침내 {if (c_sock! = null) {try {c_sock.close (); } catch (ioexception e) {e.printstacktrace (); }}}}}}간단한 서버 측 :
import java.io.bufferedReader; import java.io.ioexception; import java.io.inputStream; import java.io.inputStreamReader; import java.net.serversocket; import java.net.socket; public static void main (string [] args) {// 1. try {listen_sock = new Serversocket (8888); } catch (ioexception i) {i.printstacktrace (); } socket server_sock = null; inputStream in_sock = null; while (true) {try {// 2. 클라이언트와의 연결을 설정하고 연결된 소켓을 생성하고 클라이언트 IP 주소를 얻습니다. 문자열 client_ip = server_sock.getInetAddress (). gethostAddress (); System.out.println ( "클라이언트 :" + client_ip + "Connected"); // 3. 연결된 소켓을 기반으로 입력 스트림을 얻고 클라이언트가 보낸 데이터 in_sock = server_sock.getInputStream (); bufferedReader bufr = new bufferedReader (new inputStreamReader (in_sock)); 문자열 라인 = null; while ((line = bufr.readline ())! = null) {system.out.println (line); } // 4. 연결된 소켓을 닫습니다 _sock.close (); } catch (ioexception e) {e.printstacktrace (); }}}}다음은 TCP 파일 업로드 기능입니다.
소켓 출력 스트림 외에도 클라이언트는 로컬 파일을 읽는 입력 스트림과 서버의 피드백 정보를 읽는 소켓 입력 스트림도 있습니다.
서버에는 소켓 입력 및 출력 스트림의 세 가지 스트림이 있습니다. 대상 파일을 업로드하기 위해 작성합니다.
클라이언트가 로컬 파일의 모든 데이터를 읽은 후에 소켓의 출력 스트림이 종료에 도달했음을 서버에 알리기 위해 소켓의 종료량 put ()을 사용해야합니다.
여러 사람에게 업로드 기능을 제공하려면 서버는 여러 스레드를 사용하여 동시 연결을 구현해야합니다.
고객:
import java.io.bufferedReader; import java.io.fileInputStream; import java.io.ioException; import java.io.inputStream; import java.io.inputStreamReader; import java.io.outputStream; public static void void (args) {args). 자동 생성 메소드 스터브 문자열 server_addr = "192.168.0.124"; int server_port = 8888; 소켓 send_sock = null; fileInputStream local_read = null; 시도 {// 1. 클라이언트 소켓 send_sock = new Socket (server_addr, server_port); // 2. 연결 파이프 라인의 출력 스트림을 가져옵니다. 출력 스트림 send_stream = send_sock.getoutPutStream (); // 3. 바이트 입력 스트림 로컬 파일 데이터를 읽고 소켓의 출력 스트림을 사용하여 local_read = new FileInputStream ( "d :/myjava/net/sql.docx"); 바이트 [] buf = 새로운 바이트 [1024]; int len = 0; while ((len = local_read.read (buf))! = -1) {send_stream.write (buf, 0, len); } // 4. 출력 스트림을 최종으로 표시합니다. send_sock.shutdownoutput (); // 5. 성공적인 업로드, 실패 업로드 등과 같은 서버에서 피드백 데이터를 수신합니다. inputStream recv_stream = send_sock.getInputStream (); BufferedReader ACK_RECV = New BufferedReader (new inputStreamReader (recv_stream)); 문자열 라인 = null; while ((line = ack_recv.readline ())! = null) {system.out.println (line); }} catch (ioexception i) {i.printstacktrace (); } 마침내 {if (send_sock! = null) {try {send_sock.close (); local_read.close (); } catch (ioexception i1) {i1.printstacktrace (); }} if (local_read! = null) {try {local_read.close (); } catch (ioexception i2) {i2.printstacktrace (); }}}}}}서버 측 :
import java.io.file; import java.io.fileoutputStream; import java.io.ioexception; import java.io.inputStream; import java.io.outputStream; import java.net.serversocket; import java.net.socket; public static void min (string) terrowes {arg whows remection {Argexemence = New Serversocket (8888); // 소켓을 들으려면 하나만 있으면됩니다. (true) {// 연결이 설정 될 때마다 스레드가 시작됩니다. Socket Conn_Sock = Listen_Sock.Accept (); // 새 연결이 나오지 않으면 메인 스레드가 여기에서 새로운 스레드 (new Uploader (conn_sock)). start (); }}} 클래스 업 로더는 runnable {private file dest_dir = 새 파일 ( "d :/temp"); // 디렉토리를 업로드 개인 소켓 CONN_SOCK = NULL; // 소켓을 연결 inputStream recv_stream = null; fileoutputStream dest_stream = null; 업 로더 (Socket Conn_Sock)는 IoException {this.conn_sock = conn_sock; } public void run () {try {if (! dest_dir.exists ()) {dest_dir.mkdirs (); } // 1. 파이프 라인 recv_stream = conn_sock.getInputStream ()을 연결하는 입력 스트림을 가져옵니다. // 클라이언트 IP String Client_ip = conn_sock.getInetAddress (). gethostAddress (); System.out.println (client_ip + "..... Connected"); // 2. 파일의 업로드 위치, 즉 출력 대상은 IP의 이름을 따서 명명되었습니다. 파일이 이미 존재하는 경우 "192.168.100.23 (1) .txt"file dest_file = new File (dest_dir, client_ip + ".docx")과 같은 브래킷 및 숫자가 포함 된 새 파일을 만듭니다. int count = 1; while (dest_file.exists ()) {dest_file = new File (dest_dir, client_ip + "(" + count + ")" + ".docx"); 카운트 ++; } // 3. 데이터를 읽고 대상 파일에 쓰기 Dest_stream = 새 FileOutputStream (dest_file); 바이트 [] buf = 새로운 바이트 [1024]; int len = 0; while ((len = recv_stream.read (buf))! = -1) {dest_stream.write (buf, 0, len); } // 4. 클라이언트 outputStream ack_send에 대한 피드백 정보 = conn_sock.getoutPutStream (); 바이트 [] text = "업로드 성공!". getBytes (); ack_send.write (텍스트); } catch (ioexception e1) {e1.printstacktrace (); } 마침내 {if (dest_stream! = null) {try {dest_stream.close (); } catch (ioexception i) {i.printstacktrace (); }} if (conn_sock! = null) {try {conn_sock.close (); } catch (ioexception i) {i.printstacktrace (); }}}}}}Java Network 프로그래밍의 TCP 통신 및 간단한 파일 업로드 기능의 위의 예는 내가 공유하는 모든 컨텐츠입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.