ネットワークプログラミングを見つけるために、我々はUDPプロトコルとTCP / IPプロトコルを理解する必要があり、この場合は、文書の送信の目的を達成し、受信するTCPプロトコルのアプリケーションであり、この場合には、我々は2つのプログラムのクライアントのための1つを作成したいですこのプログラムは、受信してサーバ側で保存し、クライアント上のファイルをアップロードし、サーバー側のプログラムであり、成功したレシート情報のライトバック。
TCP:伝送制御プロトコル(伝送制御プロトコル)。TCPプロトコルは、データが送信される前に、それは2台のコンピュータ間で信頼性とエラーのないデータ転送を提供し、送信側の論理接続と受信端を確立する、すなわち、データの送信前に、コネクション型のプロトコルです。スリーウェイハンドシェイク:TCPプロトコル、信頼性の高い接続を確保するために、データ、クライアントとサーバを送信するための準備の三段階の間の相互作用。
まず握手、クライアントは、サーバーが受信確認を待って、サーバーへの接続要求を送信します。
第二にハンドシェイクは、クライアントへの応答の背中を送信するために、サーバは、クライアントは、通知の接続要求を受信します。
第三に、ハンドシェイクは、クライアントは再び、サーバに確認メッセージを送信し、接続を確認してください。
通信プロトコルが非常に複雑であり、java.netパッケージは、通信の低レベルの詳細を提供するクラスおよびインタフェースを含んでいます。我々は関係なく、通信の詳細を、プログラム開発に注力し、ネットワークにこれらのクラスやインタフェースを使用することができます。完全な3ウェイハンドシェイクは、接続が確立され、クライアントとサーバがデータ転送を開始することができます。この接続指向特性により、TCPプロトコルは、データ伝送のセキュリティを保証することができ、それが広く使用されているため、このようなファイルのダウンロードなど、ウェブページを閲覧。
騒ぎ、すべてがコードである......
クライアント
まず、クライアントプログラムを作成し、クライアントプログラムの役割は、ローカルその後、バイトによってサーバに広がり、中央には、ファイルの読み書きを伴うからファイルを取得することです。コードは以下の通りであります:
package Practices.Net.Demo02;
import java.io.*;
import java.net.Socket;
public class FileUploadClient {
public static void main(String[] args) throws IOException {
//创建输入流读取本地要上传的文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\Java\\Java程序练手\\Arya.jpg"));
//创建一个Socket对象,绑定服务器IP地址和端口
Socket socket =new Socket("localhost",9999);
//创建一个输出流对象,指向网络输出流对象
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
byte[] bytes = new byte[1024];
int len = 0;
while ((len=bis.read(bytes))!=-1){
//写出读到的数据
bos.write(bytes,0,len);
//刷新
bos.flush();
}
//关闭输出流,通知服务器端,数据写出完毕
socket.shutdownOutput();
System.out.println("文件发送完毕");
//解析服务器端回写的数据
InputStream is = socket.getInputStream();
byte[] bytes1 = new byte[1024];
int lengths = 0;
while((lengths=is.read(bytes1))!=-1){
System.out.println(new String(bytes1));
}
//不要忘了关闭流并释放资源
is.close();
bos.close();
socket.close();
bis.close();
}
}
サーバー側
そして、サーバ側、サーバー側のプログラムは、主に3つのことを行うには:ネットワークからのデータストリームを受信し、読んで、指定された場所に書き込まれたデータの読み取り、クライアントに受信メッセージを送信します。次のようにまた、ファイルの読み書きの中間に関し、コードは次のとおりです。
package Practices.Net.Demo02;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class FileUploadServer {
public static void main(String[] args) throws IOException {
System.out.println("服务器已启动,等待客户端请求中……");
//创建ServerSocket对象,并绑定端口号
ServerSocket ss = new ServerSocket(9999);
//使用while(true)循环,使服务器始终处于开启状态
while(true){
//使用ServerSocket对象的accept方法获取一个网络Socket对象
Socket sa = ss.accept();
//将新的客户端请求创建为一个新的线程
new Thread(new Runnable() {
@Override
public void run() {
//创建输入流对象,获取数据
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(sa.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
//判断Upload文件夹是否存在,不存在则创建一个
File filename = new File("D:\\Java\\Java程序练手\\Upload");
if(!filename.exists()){
filename.mkdirs();
}
//创建输出流对象,将客户端上传的文件保存到本地
FileOutputStream fi = null;
try {
fi = new FileOutputStream(filename+"\\Arya"+System.currentTimeMillis()+".jpg");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
BufferedOutputStream bos = new BufferedOutputStream(fi);
//向客户端回写数据
OutputStream os = null;
try {
os = sa.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
try{
//读取数据
byte[] bytess = new byte[1024];
int len = 0;
while((len=bis.read(bytess))!=-1){
bos.write(bytess,0,len);
}
os.write("文件上传成功!!!".getBytes());
}catch (IOException e) {
System.out.println(e);
}finally{
try {
os.close();
bos.close();
bis.close();
sa.close();
}catch (IOException e){
System.out.println(e);
}
}
}
}).start();
}
}
}
このように、それが行われた場合でも、簡単なマルチスレッドファイルアップロードクライアント/サーバー・プログラムのコードは、ファイルをアップロードを完了することができ、アップロード時間は、問題は発生しません重複するファイルによって覆われている、これが私の学習です何かが間違っている場合は、最初の例完了は、またはコメント欄での議論を歓迎するためのより良い方法があるのJavaネットワークプログラミング。