目的
この実験を通じて、ソケット(ソケット)を使用して単純なネットワークデータの送受信プログラムを設計する方法を学び、アプリケーションデータパケットがトランスポート層を介してどのように送信されるかを理解します。
実験手順
1.TCPを使用してデータを送信する簡単なプログラム
ストリームソケットはエンドツーエンドプロトコルとしてTCPを使用し(最下層はIPプロトコルを使用します)、信頼性の高いバイトストリームサービスを提供します。
プログラムの概要:クライアントとサーバーは、お互いに情報を交換することができます。「さようなら」と応答すると自分自身を閉じ、クライアントが「OK」と応答するとサーバーを閉じます。
リファレンスチュートリアル:JAVAソケットクラスに基づくTCPネットワークプログラミング
クライアントコード:
package com.mwx.tcp;
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) throws UnknownHostException, IOException {
try {
//创建soket
Socket socket = new Socket("10.69.51.117",9999);//参数:IP地址,端口号(这里填的IP地址是本机的,端口号是自定义的)
//建立连接:
//从键盘读取的
InputStreamReader sysin = new InputStreamReader(System.in); //输入字节流(从键盘键入)
BufferedReader sysbuf = new BufferedReader(sysin); //将输入放到缓冲区中
//从socket中读取的
InputStreamReader socin = new InputStreamReader(socket.getInputStream());
BufferedReader socbuf = new BufferedReader(socin);
//向socket中写
PrintWriter socout = new PrintWriter(socket.getOutputStream());
//进行通信:
//首先是客户端向服务器发送数据,所以先等键盘键入,即获取客户端要发送的内容
String readline = sysbuf.readLine();
while(!readline.equals("bye")) {
//如果我们键入的是 bye ,则停止连接 (在while循环中进行,即可一次连接,多次通信)
socout.println(readline); //将从键盘键入的内容写入socket
socout.flush();//flush():刷新此输出流并强制写出所有缓冲的输出字节。
//写入的时候数据是先写入内存,然后再从内从写入到文件中,之后才能从文件中读取。所以可能写入内存写完了,但是写入文件没写完,因此为了能够即时通信,需要flush()
System.out.println("Client:"+readline);
//客户端接收服务器的回复,将此回复打印出来
System.out.println("Server:"+socbuf.readLine());//readLine()方法若还没接收到任何数据,则会停在此处等待
//收到服务器的回复后,客户端继续键盘键入要发送给服务器的数据
readline = sysbuf.readLine();
}
//完成通信后关闭io和socket
socout.close();
socin.close();
socket.close();
System.out.println("客户端已关闭");
}catch(Exception e) {
//打印异常
System.out.println("Error:"+e);
}
}
}
サーバーコード:
package com.mwx.tcp;
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) throws UnknownHostException, IOException {
try {
//建立套接字
ServerSocket server = new ServerSocket(9999);//参数:端口号(要与客户端相同)
//监听
Socket socket = server.accept();
//建立连接:
//从键盘读取的
InputStreamReader sysin = new InputStreamReader(System.in); //输入字节流(从键盘键入)
BufferedReader sysbuf = new BufferedReader(sysin); //将输入放到缓冲区中
//从socket中读取的
InputStreamReader socin = new InputStreamReader(socket.getInputStream());
BufferedReader socbuf = new BufferedReader(socin);
//向socket中写
PrintWriter socout = new PrintWriter(socket.getOutputStream());
//进行通信:
//首先打印出客户端发来的信息,从socket缓冲区读取 (如果客户端一开始就回复ok的话不会停止通信)
System.out.println("Client:"+socbuf.readLine());
//从键盘键入服务器要回复的内容
String readline = sysbuf.readLine();
while(!readline.equals("bye")) {
//只要服务器键入的不是 bye,就继续通信
//将readline发送给客户端
socout.println(readline);
socout.flush(); //刷新缓冲区
//打印出服务器回复了啥
System.out.println("Server:"+readline);
String flag = socbuf.readLine();
if(!flag.equals("ok")) //如果从客户端接收的字符不是 ok,则打印出来,若果不是则结束循环
System.out.println("Client:"+flag);
else //如果客户端发来的信息是ok,则关闭与客户端的通信
break;
readline = sysbuf.readLine();
}
socout.close();
socin.close();
server.close();
System.out.println("服务器已关闭");
}catch(Exception e) {
System.out.println("Error:"+e);
}
}
}
動作モード:最初にサーバーを起動してからクライアントを起動します。クライアントが最初にデータを送信し、サーバーが応答します。
スクリーンショットを実行します。
2.UDPを使用してデータを送信する単純なプログラム
行われなければ...