前書き
ネットワークはコンピュータ通信の基盤です。ネットワークプログラミングはコンピュータネットワークを学ぶための最良の方法です。通常、標準的なコンピュータネットワーク通信プロトコルはUDPとTCPです(これにはマイクロコンピュータネットワーク通信プロトコル(CANなど)は含まれません)。すべて、Xiaoyuanはいくつかの一般的なインタビューの質問を紹介します。
1.ネットワークプログラミングの3つの要素は何ですか?
回答:ネットワークプログラミングの3つの要素は、IP、伝送プロトコル、およびポート番号です。
2.ネットワークモデルはいくつありますか?理解する方法は?
回答:一般的なネットワークモデルには、5層分布、7層分割、および4層理論が含まれています。これらの分割の概略図は次のとおりです。7
層の概略図と各層のプロトコルの説明。
7層プロトコルと5層プロトコル
は、各iso層で使用されるプロトコルを比較します。
3.私たちのプログラミングはどのレベルに属しますか?
回答:私たちのプログラミングはアプリケーション層に属しています。
以下では、UDPとTCPに関連するプログラミングに焦点を当てます。
UDP
UDPはユーザープロトコルであり、トランザクション指向のシンプルで信頼性の低い情報伝送サービスを提供するコネクションレス型トランスポート層プロトコルです。UDPの機能:
UDPはコネクションレス型です。つまり、通信時に接続を作成する必要がないため、ネットワークリソースのオーバーヘッドが削減され(メッセージバイトが少なくなり)、送信時間が短縮されます。UDPは、ブロードキャストなどの一般的な方法を使用できます。
場合
udpプロトコルを使用して、1つの受信と1つの送信を実現します。
udp送信者プログラム
public class UDPSendDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = br.readLine()) !=null){
byte[] bytes = line.getBytes();
DatagramPacket dp = new DatagramPacket(bytes, bytes.length,
InetAddress.getByName("192.168.168.1"), 12345);
ds.send(dp);
if("886".equals(line)){
break;
}
}
ds.close();
br.close();
System.out.println("send socket closed ");
}
}
UDPレシーバーコード
public class UDPReceiveDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(12345);
while (true){
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
ds.receive(dp);
String data = new String(dp.getData(), 0, dp.getLength());
System.out.println("data is ,"+data);
if("886".equals(data)){
break;
}
}
ds.close();
System.out.println("receive socket closed");
}
}
実行結果
送信側
受信側
TCP
TCP通信プロトコルは信頼性の高いネットワークプロトコルです。通信の両端にソケットオブジェクトを確立し、トラフィックの両端にネットワーク仮想リンクを形成します。仮想ネットワークリンクが確立されると、両端のプログラムが通過できるようになります。仮想リンク。通信するためのリンク。
TCPプロトコルの特徴は
1、コネクション型です。TCPプロトコル通信を使用する2つのパーティは、データの読み取りと書き込みを開始する前に接続を確立する必要があります。TCP接続は全二重、つまり、データの読み取りと書き込みです。両方の当事者は、接続を介して実行できます。データ交換が完了した後、通信の両当事者は、リソースを解放するために切断する必要があります。TCPプロトコルのこの接続は1対1であるため、ブロードキャストおよびマルチキャストに基づくアプリケーション(ターゲットは複数のホストアドレス)はTCPサーバーを使用できません。
2ストリーミングサービス:TCPのバイトストリームサービスの兆候は、送信者が実行する書き込み操作の数と受信者が実行する読み取り操作の数の間に定量的な関係がないという事実に反映されています。送信者アプリケーションが複数の書き込みを実行する場合継続的に動作しているとき、TCPモジュールは最初にこれらのデータをTCP送信バッファに入れます。TCPモジュールが実際にデータの送信を開始すると、送信バッファで送信を待機しているデータは、送信のために1つ以上のTCPセグメントにカプセル化される場合があります。
あなたは、より詳細にコンピュータネットワークの知識を確認したい場合は、このお読みください記事のコンピュータネットワークを。
ケースナンバーワン
クライアントがデータを送信し、サーバーがデータを受信してコンソールに表示します。クライアントが終了コマンドを送信すると、クライアントとサーバーの両方がサービスを終了します。
クライアント
public class ClientDemo {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("192.168.152.1", 10001);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String line;
while ((line=br.readLine())!=null){
//如果不用socket.getOutPutStream来写的话,我们是否可以用bufferedWrite来写呢。
// OutputStream os = socket.getOutputStream();
// os.write(line.getBytes());
bw.write(line,0,line.length());
bw.newLine();
bw.flush();
if ("999".equals(line)){
break;
}
}
System.out.println("发送客户端停止命令,客户端开始停止");
br.close();
bw.close();
socket.close();
}
}
サーバ
public class ServerDemo {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(10001);
Socket accept = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream()));
String line;
String str=null;
while (true){
while ((line=br.readLine())!=null){
str=line;
System.out.println(line);
}
if(str.equals("999")){
break;
}
}
System.out.println("接收到停止命令,开始释放服务端资源");
br.close();
ss.close();
}
}
運用結果:
クライアント
サーバー
ケース2
クライアントはtxtファイルからデータを読み取り、読み取ったデータをサーバーに送信します。サーバーはコンテンツを読み取った後にファイルを再生成し、受信したコンテンツをファイルに書き込みます。
サーバースレッドクラス
public class ServerThread implements Runnable {
private Socket accept;
public ServerThread(Socket accept) {
this.accept = accept;
}
@Override
public void run() {
BufferedReader br=null;
BufferedWriter bw=null;
BufferedWriter bwServer=null;
try {
br = new BufferedReader(new InputStreamReader(accept.getInputStream()));
bw = new BufferedWriter(new FileWriter(Thread.currentThread().getName() + "copy.java"));
String line;
while ((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
bwServer = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
bwServer.write(Thread.currentThread().getName() + "文件上传成功");
System.out.println(Thread.currentThread().getName()+"文件上传成功");
bwServer.newLine();
bwServer.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
br.close();
bw.close();
bwServer.close();
accept.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
サーバーメインクラス
public class Server02Demo {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(10001);
while (true){
Socket accept = ss.accept();
new Thread(new ServerThread(accept)).start();
}
}
}
クライアントクラス
public class Client02Demo {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("192.168.152.1",10001);
BufferedReader br = new BufferedReader(new FileReader("reader&writer\\Client.txt"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String line;
while ((line = br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
socket.shutdownOutput();
BufferedReader brClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String data = brClient.readLine();
System.out.println("服务器的反馈是:"+data);
brClient.close();
br.close();
bw.close();
socket.close();
}
}
実行結果
サーバー側のテスト結果
クライアント側のテスト結果
実行結果は期待に応え、この章のケースは終了しました。