TCP通信について明確にする必要があるいくつかのポイント:
TCP通信は接続指向であり、最初にサーバーを起動してからクライアントを開始する必要があります。
クライアントとサーバーの両方がソケットオブジェクトを作成する必要があります。クライアントはサーバーソケット(IP+ポート)を指定する必要があり、サーバーはサービスポートを指定する必要があります。
Socket Client_Socket = new Socket( "192.168.100.17"、8888); //クライアントソケット(ソケットクラスのソケットは接続されたソケットです)Serversocket risten_socket = new Serversocket(8888); //サーバーソケット、この時点で、それはリスニングソケットです(アドレスとポートはバインドされています())
サーバーは、Accept()メソッドを使用して、リスニングソケットを接続されたソケットに変換する必要があります。このリスニングソケットは、複数の接続されたソケットを生成できるため、接続後に他のクライアントからのリクエストを聞くこともできます。したがって、ここでマルチスレッドを使用して、同時アクセスを実装する必要があります。接続されたソケットを取得した後、クライアントのIPアドレス、リクエストが送信されるポートなど、多くのクライアント情報を取得できます。
socket server_scoket = socket.accept(); socket server_scoket2 = socket.accept(); socket server_scoket3 = socket.accept();
サーバーに同時接続を実装するには、次のコードを大まかに使用します。ここで、ThreadTaskはThreadタスクオブジェクトです。
public static void main(string [] args)throws ioexception {serversocket risten_sock = new Serversocket(8888); //ソケットを聴くのに必要なのは1つだけなので、タスクの外側の外側(//接続が確立されるたびにスレッドが開かれます。 socket conn_sock = listen_sock.accept(); //新しい接続が入っていない場合、メインのメインスレッドはこの新しいスレッド(new ThreadTask(conn_sock))をブロックします。start(); }}クライアントは、接続されたソケットに基づいて出力ストリームを取得する必要があり、サーバーはソケットに基づいて入力ストリームを取得する必要があります。もちろん、接続されたソケットがあるため、任意の端に入力ストリームと出力ストリームを取得できます。
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 = new Socket( "192.168.0.124"、8888); // 2。出力ストリームを取得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(); }}}}}}シンプルなサーバー側:
java.io.bufferedreader;インポートjava.io.ioexception;インポートjava.io.inputStream;インポートjava.io.inputStreamReader; Import java.net.serversocket; Import java.net.socket; public class tcpserver {serting ser sertiC boid main(] agrestic boid main(agss)ヌル; try {listen_sock = new Serversocket(8888); } catch(ioexception i){i.printstacktrace(); } socket server_sock = null; inputstream in_sock = null; while(true){try {//2。クライアントとの接続を確立し、接続されたソケットを生成し、クライアントIPアドレスserver_sock = risten_sock.accept()を取得します。 string client_ip = server_sock.getinetaddress()。gethostaddress(); System.out.println( "client:" + client_ip + "connected"); // 3。接続されたソケットに基づいて入力ストリームを取得し、クライアントIN_SOCK = SERVER_SOCK.GETINPUTSTREAM()によって送信されたデータを読み取ります。 BufferedReader bufr = new BufferedReader(new inputStreamReader(in_sock));文字列line = null; while((line = bufr.readline())!= null){system.out.println(line); } // 4。接続されたソケットServer_sock.close()を閉じます。 } catch(ioexception e){e.printstacktrace(); }}}}以下は、TCPファイルのアップロード関数です。
ソケット出力ストリームに加えて、クライアントはローカルファイルを読み取る入力ストリームと、サーバーからフィードバック情報を読み取るためのソケット入力ストリームも持っています。
サーバーには、ソケット入力と出力ストリームの3つのストリームもあり、ターゲットファイルをアップロードするために書き込みます。
クライアントがローカルファイルからすべてのデータを読み取ると、ソケットのShutdownOutput()を使用して、ソケットの出力ストリームが端に達したことをサーバーに通知する必要があります。
複数の人にアップロード機能を提供するために、サーバーは複数のスレッドを使用して同時接続を実装する必要があります。
クライアント:
java.io.bufferedreader; Import java.io.fileinputStream; Import java.io.ioexception; Import java.io.inputStream; Import java.io.inputStreamReader; Import java.io.OutputStream; Import java.outputStream; Impont java.net.sockent; public class uploadclient {public static vaid []自動生成メソッドスタブストリングserver_addr = "192.168.0.124"; int server_port = 8888; Socket send_sock = null; fileInputStream local_read = null; try {//1。クライアントソケットsend_sock = new Socket(server_addr、server_port); //2。接続の出力ストリームを取得しますpipeline出力ストリームsend_stream = send_sock.getOutputStream(); // 3。バイト入力ストリームローカルファイルデータを読み取り、ソケットの出力ストリームを使用してlocal_read = new fileinputStream( "d:/myjava/net/sql.docx"); byte [] buf = new byte [1024]; int len = 0; while((len = local_read.read(buf))!= -1){send_stream.write(buf、0、len); } //4。出力ストリームを最後にマークしますsend_sock.shutdownoutput(); // 5。成功のアップロード、アップロード障害など、サーバーからフィードバックデータを受信します。PuntStreamRecv_Stream= send_sock.getInputStream(); BufferedReader ACK_RECV = new BufferedReader(new inputStreamReader(recv_stream));文字列line = 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(); }}}}}}サーバー側:
java.io.fileをインポート; java.io.fileoutputStreamをインポート;インポートjava.io.io.ioexception; Import java.io.inputStream; Import java.OutputStream; Import java.net.serversocket; Import java.net.sockets sercackecced; public void boid boid main( listen_sock = new Serversocket(8888); //ソケットを聴くのに必要なのは1つだけなので、(true){//接続が確立されるたびにスレッドが開始されます。 socket conn_sock = listen_sock.accept(); //新しい接続が入っていない場合、メインのメインスレッドはここに新しいスレッド(new uploader(conn_sock))をブロックします。start(); }}} class uploaderを実装してrunnable {private file dest_dir = new file( "d:/temp"); //ディレクトリプライベートソケットConn_sock = nullをアップロードします。 //ソケット入力ストリームrecv_stream = nullを接続します。 fileoutputStream dest_stream = null; uploader(socket conn_sock)throws 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」ファイル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"); count ++; } // 3。データを読み取り、ターゲットファイルに書き込みdest_stream = new fileoutputStream(dest_file); byte [] buf = new byte [1024]; int len = 0; while((len = recv_stream.read(buf))!= -1){dest_stream.write(buf、0、len); } // 4。クライアントへのフィードバック情報outputStream ack_send = conn_sock.getOutputStream(); byte [] text = "upload succupe!"。getBytes(); ack_send.write(text); } 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(); }}}}}}TCP通信の上記の例とJavaネットワークプログラミングの単純なファイルアップロード機能は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。