Java の基本的な知識を補足します。
1. Java の例外処理は Delphi の例外処理と同じです。例外の発生を意図的に回避するのではなく、例外が発生した後にそれを解決するのが
Try
Except/ / です。例外が発生したら、ここに転送して実行します
最後に//例外が発生してもしなくても、ここに転送して実行します
終了
これと同様に、Javaの例外処理の基本形は次のようになります
try{
}catch(ExceptionType1 e){
file://例外1の処理
}catch(ExceptionType2 e){
file://例外2の処理
throw(e)//例外をスローし、発生させるDelphi でも同じことです
}
私が付け加えたいのは、ほとんどの例外について、例外をキャッチするプログラムではなく、通常実行中のプログラムで明示的に例外をスローしたい場合、Java コンパイラは何を伝える必要があるということです。スローされる例外は事前に宣言する必要があります。宣言しないと、このタスクはスローによって完了します。
2.1 出力
System.out.PRint file:// ここ。 outは静的メソッドです ああ
System.out.println
System.err.print file://errもoutと同じ標準出力です 違いはまだ分かりません
System.err.println
2.2入力
System.in.read ()
2.3 ファイル操作
注釈付きの例をいくつか挙げるだけで十分です。
最初のプログラムは、ファイルに関する基本情報を表示するプログラムです
import java.io.*;//io関連のクラスに転送します
class fileinfo{
file://注意、main関数は静的メソッドである必要があります
public static void main(String args[])throws IOException{
File fileToCheck;//ファイルオブジェクトを使用してインスタンスを作成する
if (args.length>0){
for (int i=0;i
info(fileToCheck);//ここで参照される情報は静的メソッドのメンバーである必要があります
}
}
else{
System.out.println( "ファイルが指定されていません");
}
}
public static void info(File f)throws IOException{
System.out.println("Name:"+f.getName());
System.out.println( "パス:"+f.getPath());
if (f.exists()){
System.out.println("ファイルが存在します。");
System.out.print(( f.canRead()? " and is Readable":""));//判定関数、条件を満たしていれば前者を出力、そうでなければ後者を出力
System.out.print((f.canWrite()?) "そして書き込み可能です":"") );
System.out.print(".");
System.out.println("ファイルは"+f.length()+"バイトです。");
}
else{
System.out.println( "ファイルが存在しません。");
}
}
}
2 番目の例は、ユーザーが名前と電話番号を入力し、そのプログラムを保存する小さなプログラムです。 FileOutputStream を通じて、phone.numbers ファイルに保存します。
import java.io.*;
classphones{
static FileOutputStream fos;
public static Final int lineLength=81;
public static void main(String args[]) )throws IOException{
byte[]phone= new byte[lineLength];
byte[] name=new byte[lineLength];
int i;
fos=new FileOutputStream("phone.numbers");
while(true) {
System.err.println("名前を入力してください(終了するには「done」と入力してください)");
readLine(name);
if ("done".equalsIgnoreCase(new String(name,0,0,4)) ){
break;
}
System.err.println("電話番号を入力してください");
readLine(phone);
for (i=0;phone[i]!=0;i++){
fos.write (phone[i]);
}
fos.write(′,′);
for (i=0;name[i]!=0;i++){
fos.write(name[i]);
}
fos.write('' '');
}
fos.close();
}
private static void readLine(byte line[])throws IOException{
int i=0,b=0;
while((i< ;(lineLength-1))&&(( b=System.in.read())!=′ ′)){
line[i++]=(byte)b;
}
line[i]=(byte)( 0);
}
}
2.4 ストリーム
は 2 つの
出力ストリームにすぎません。
入力ストリームを書き、
を読み取らせましょう。 java.io パッケージには多くのタイプの入力ストリームと出力ストリームがあります
1 FileInputStream および FileOutputStream ノード ストリーム
2. BufferedInputStream および BufferedOutputStream フィルターされたストリーム
4. スレッドの PipedInputStream および PipledOutputStream ストリーム
ストリームの概念を理解したら、ソケットについて学習を開始できます。ソケットの役割については、昨日すでに説明しました。
ここで、ソケットをよく理解するために、簡単な通信プログラムを作成します。このプログラムは、クライアント (RemoteFileClient) とサーバー (RemoteFileServer) の 2 つの部分で構成されます。クライアントはサーバーにリクエストを送信し、サーバー上のファイル情報を読み取ります。サーバーはリクエストに応答し、対応するファイル情報をクライアントに渡します。
まず、 RemoteFileClient クラス:
import java.io.*;/ /java.io パッケージは、ストリームの読み取りと書き込みのためのツールを提供し、TCP ソケットと通信する唯一の方法でもあります
import java.net.*;//Java.io net パッケージはソケット ツールを提供します。
public class RemoteFileClient {
protected String hostIp;
protected int hostPort;
protected BufferedReaderソケットReader;//データの読み取りを担当するオブジェクト
protected PrintWriterソケットWriter;//データの書き込みを担当するオブジェクト
file:// クラスのコンストラクターには、リモート ホストの IP アドレス (hostIp) とコンストラクターはそれらをインスタンス変数
hostIp = aHostIp;
hostPort = aHostPort;
に割り当てます。
file://リモートサーバーに接続します
public void setUpConnection() {
}
file://リモートサーバーからファイル情報を要求します
public String getFile(String fileNameToGet) {
}
file://リモートサーバーから切断しますリモートサーバーを開く
public void teaDownConnection() {
}
}
まず main() を実装します
public static void main(String[] args) {
RemoteFileClient RemoteFileClient = new RemoteFileClient("127.0.0.1", 3000);/ / デバッグを容易にするために、ローカル サーバーをリモート サーバーとして扱います
remoteFileClient.setUpConnection();//Connect。 setUpConnection は非静的変数であるため、直接使用することはできません。作成後にインスタンスを参照する必要があります。これは非常に具体的です。 .txt") ;//Read
remoteFileClient.tearDownConnection();//Disconnect
System.out.println(fileContents);//読み取った内容を出力します
}
手順は非常に明確です。それでは、以下を見てみましょう。接続と読み込みを分けて、切断を実現する方法
1. 接続
public void setUpConnection() {
try {
Socket client = new Socket(hostIp, hostPort);//Socket オブジェクトを作成
OutputStream outToServerStream=client.getOutputStream( );
InputStream inFromServerStream=client.getInputStream();
socketReader = new BufferedReader(new InputStreamReader(inFromServerStream));
file://ストリームの行を読み取れるように、ソケットのInputStreamをBufferedReaderにラップします
socketWriter = new PrintWriter( outToServerStream);
file://ファイルリクエストをサーバーに送信できるように、ソケットの OutputStream を PrintWriter にラップします
} catch (UnknownHostException e) {
System.out.println("ソケット接続の設定エラー: 不明なホストat " + hostIp + ":" + hostPort);
file://Socket オブジェクト作成エラーの例外処理
} catch (IOException e) {
System.out.println("ソケット接続の設定エラー: " + e) ;
file://IO エラーの例外処理
}
}
2. Read
public String getFile(String fileNameToGet) {
StringBuffer fileLines = new StringBuffer();//StringBuffer オブジェクトも String オブジェクトですが、サイズは小さくなります。より柔軟です。ここでは、読み取ったコンテンツを保存するために使用されます
try {
socketWriter.println(fileNameToGet);
socketWriter.flush();//ファイルの保存アドレスがsocketWriterに出力され、バッファがこのアドレスをサーバーに送信できるようにするためにクリアされました
String line = null;
while ((line =ソケットReader.readLine()) != null)
fileLines.append(line + " ");
file://これでサーバーに送信されたら、応答を待つ必要があります。ここでのプログラムは、サーバーが必要なファイルの内容を渡すのを待つことになります。
} catch (IOException e) {
System.out.println("ファイルからの読み取りエラー: " + fileNameToGet);
}
return fileLines.toString();//バッファ内のコンテンツを String に変換して返すことを忘れないでください
}
3. 切断
public void bearDownConnection( ) {
try {
socketWriter.close() ;
socketReader.close();
} catch (IOException e) {
System.out.println("ソケット接続の切断エラー: " + e);
}
}
tearDownConnection() メソッドは、私たちが行っていることを閉じないでください。 BufferedReader と PrintWriter は、Socket の InputStream と OutputStream 上に作成されます。これを行うと、ソケットから取得した基になるストリームが閉じられるため、発生する可能性のある IOException をキャッチする必要があります
さて、クライアント プログラムを作成する手順を要約します
1。 対象となるマシンの IP ポート番号を使用してソケットをインスタンス化します。接続されています (問題がある場合は例外をスローします)。
2. 読み取りおよび書き込み用に Socket 上のストリームを取得します。
3. ストリームを BufferedReader/PrintWriter のインスタンスにパックします。具体的には、Socket 上のファイル アドレス情報を送信します。 . Reader でサーバーからファイル情報を読み取ります
5. 開いているストリームを閉じます。
以下はRemoteFileClientのコードリストです
import java.io.*;
import java.net.*;
public class RemoteFileClient {
protected BufferedReaderソケットReader;
protected PrintWriterソケットWriter;
protected String hostIp;
protected int hostPort ;
public RemoteFileClient(String aHostIp, int aHostPort) {
hostIp = aHostIp;
hostPort = aHostPort;
}
public String getFile(String fileNameToGet) {
StringBuffer fileLines = new StringBuffer();
try {
ソケットWriter.println(fileNameToGet);
socketWriter.flush();
String line = null;
while ((line =ソケットReader.readLine()) != null)
fileLines.append(line + " ");
} catch (IOException e) {
System.out.println("ファイルからの読み取りエラー: " + fileNameToGet);
}
return fileLines.toString();
}
public static void main(String[] args) {
RemoteFileClient RemoteFileClient = new RemoteFileClient("127.0.0.1", 3000);
remoteFileClient.setUpConnection();
String fileContents = RemoteFileClient.getFile("RemoteFile.txt");
OutputStream outToServerStream=client.getOutputStream() );
InputStream inFromServerStream=client.getInputStream();
socketReader = new BufferedReader(new InputStreamReader(inFromServerStream));
socketWriter = new PrintWriter(outToServerStream);
} catch (UnknownHostException e) {
System.out.println( "ソケット接続の設定エラー: " + hostIp + ":" + hostPort の不明なホスト);
} catch (IOException e) {
System.out.println("ソケット接続の設定エラー: " + e);
}
}
public void teaDownConnection() {
try {
socketWriter.close();
socketReader.close();
} catch (IOException e) {
System.out.println("ソケット接続の切断エラー: " + e);
}
}
}
好了,现在来看サービス端末的程序怎么写.
创建RemoteClientServer类:
import java.io.*;
import java.net.*;
public class RemoteFileServer {
protected int listenPort = 3000;
public static void main(String[] args) {
}
public void acceptConnections() {
}
public void handleConnection(Socket incomingConnection) {
}
}
跟客户机中一样次に、私の例では、ポートを保持し、そのポートから接続します。 節約された場合、ポートは 3000 です。サーバーに接続されているマシン
handleConnection() は、要求されたファイルの内容をゲストマシンに送信するために、ゲストマシンのソケットと通信します。 server = new RemoteFileServer();
server.acceptConnections();
}
非常に危険なため、主関数が非承認サービスであるため、acceptConnection() を直接使用します。例、ではなく直接调用。 {
ServerSocket サーバー = new ServerSocket(listenPort);//同客端末のソケット对应,在サービス务器端,我们必要ServerSocket对象,パラメータ是兼听的口口番号
Socket incomingConnection = null;//一客端末のソケット变量,顧客端末から受信した Socket
while (true) {
incomingConnection = server.accept();//调用 ServerSocket の accept() 来告诉它開始侦听,
handleConnection(incomingConnection);
}
file: //不断监听直入了一连接请要求、その後交由handleConnection处処理
} catch (BindException e) {
System.out.println("ポートにバインドできません " + listenPort);
} catch (IOException e) {
System.out.println("ポートで ServerSocket をインスタンス化できません: " + listenPort);
}
}
無论何時假如创建了一無法绑定到指定端口(可能性故别的何か制御了该)したがって、ここでは、可能性のある BindException を捕捉する必要があります。同時に、クライアント端末上での接続時と同様に、IOException を捕捉する必要があります。非常に長い時間の待機を回避するために、 setSoTimeout() を使用して accept() の設定時間を指定することができます。
最も有害な処理は、handleConnection() 内で、この時点でクライアント端末のソケットに接続されており、このソケットからクライアントの要求を取得し、呼び出します。 = incomingConnection.getOutputStream();
InputStream inputFromSocket = incomingConnection.getInputStream();
file://首先取同Socket関連の流れoutputToSocketとInputStream
file://その中のoutputToSocketは顧客端末Socketに返されるべき流れ
file://InputStream は客端発行の要求、ここにあるのは文件路径、つまり "RemoteFile.txt" です
BufferedReader streamReader =
new BufferedReader(new InputStreamReader(inputFromSocket));
file://首先要将InputStream荢がBufferedReaderに
FileReader fileReader = new FileReader(new File(streamReader.readLine()));
file://BufferedReader からファイル パスを読み取り、新しいオブジェクトを作成します FileReader
BufferedReaderbufferedFileReader = new BufferedReader(fileReader);
file:/ /BufferedReader オブジェクトを再度作成します。今回はファイルの内容を読み取ります
PrintWriter streamWriter =
new PrintWriter(OutputStream);
file://Socket の OutputToSocket ストリームを PrintWriter にパックして、ファイル情報をクライアントに送信できるようにします
String line = null;
while ((line =bufferedFileReader.readLine()) != null) {
streamWriter.println(line);
}
file://bufferedFileReaderからファイル情報を読み込み、出力しますstreamWriter 経由でクライアント
fileReader.close();
streamWriter.close();//Socket の 2 つのストリームが閉じられる順序に注意してください
streamReader.close();
file://Close all完了後のストリーム
} catch (Exception e) {
System.out.println("クライアント処理エラー: " + e);
}
}
完了後にストリームが閉じる順序に注意してくださいstreamReader が閉じられた後に、すべての操作が閉じられます。これは偶然ではなく、streamWriter を閉じる前に streamReader を閉じると、クライアントはファイル情報を取得できなくなります。 streamWriter に書き込まれていますが、チャネルを通過できるデータはありません (チャネルは閉じられています)。しかし、奇妙なことに、前の streamWriter.println() で既に出力していませんか? すべてのストリームが完了するまで待つ必要があります。クライアントに出力された情報のみに到達できますか?
streamWriter.close();
をブロックして、まだ正常に通信できるかどうかを確認してみました。おそらく、チャネルが閉じられていないため、特定の順序で正常にチャネルを閉じなければ通信データの送信が完了せず、そうでなければクライアントは情報を受信できないと説明できます。
最後に、サーバー側プログラムを作成する手順をまとめてみましょう
1. 受信クライアント接続をリッスンするポート (プログラム内の 3000 など) を使用して ServerSocket をインスタンス化します (存在する場合は例外をスローします)。問題です)。
2. ループ内で ServerSocket の accept() を呼び出して接続を待機します
3. 読み取りおよび書き込み操作のためにクライアントのソケット ストリームを取得します
5. 開いているクライアントのソケットを読み取り、書き込みます
6. (ライターを閉じる前にリーダーを決して閉じないでください)、通信を完了します
以下は
RemoteFileServerのコードリストです
import java.io.*;
import java.net.*;
public class RemoteFileServer {
int listenPort;
public RemoteFileServer(int aListenPort) {
listenPort = aListenPort;
}
public void acceptConnections() {
try {
ServerSocket サーバー = new ServerSocket(listenPort);
Socket incomingConnection = null;
while (true) {
incomingConnection = server .accept();
handleConnection(incomingConnection);
}
} catch (BindException e) {
System.out.println("ポートにバインドできません " + listenPort);
} catch (IOException e ) {
System.out.println("ポートで ServerSocket をインスタンス化できません: " + listenPort);
}
}
public void handleConnection(Socket incomingConnection) {
try {
OutputStream OutputToSocket = incomingConnection.getOutputStream();
InputStream inputFromSocket = incomingConnection. getInputStream();
BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputFromSocket));
FileReader fileReader = new FileReader(new File(streamReader.readLine()));
BufferedReaderbufferedFileReader = new BufferedReader (fileReader);
PrintWriter streamWriter = new PrintWriter(outputToSocket);
String line = null;
while ((line =bufferedFileReader.readLine()) != null) {
streamWriter.println(line);
}
fileReader .close();
streamWriter.close();
streamReader.close();
} catch (Exception e) {
System.out.println("クライアント処理エラー: " + e);
}
}
public static void main( String[] args) {
RemoteFileServer server = new RemoteFileServer(3000);
server.acceptConnections();
}
}
さて、やっとSocketを使い始めました
以上メモ( 5) Java コンテンツを学習する初心者向け。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。