实验目的:
(1)掌握网络通信的概念。
(2)掌握InetAddress、URL类的使用。
(2)掌握JAVA利用 TCP协议和UDP协议进行通信的网络编程方法。
实验内容
1、从键盘输入网址,读取网址内容,在显示器进行显示,并存储为文件test.html。
package sdut.cs;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Scanner;
public class DemoTest {
public static void main(String[] args) throws IOException {
Scanner reader = new Scanner(System.in);
String str = reader.next();
URL url = new URL(str);
InputStream is = url.openStream();
OutputStream os = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\test.html");
byte[] bytes = new byte[1024];
int len;
while ((len = is.read(bytes)) != -1) {
os.write(bytes, 0, len);
}
is.close();
os.close();
reader.close();
}
}
2、TCP Socket编程实现服务器和客户端的交互:
(1)服务器端先运行,利用循环时刻为客户端提供服务;
(2)客户端与服务器接通后,从键盘上输入若干字符,传到服务器,服务器在控制台显示所收收到的数据,并向客户端反馈信息"I have received ******",此次通话结束;
(3)客户端发送"quit"字符串,服务器终止程序。
//客户端
package sdut.cs;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9999);// 服务器端只需提供端口号
InputStream is;
OutputStream os;
Socket socket;
while (true) {
socket = ss.accept(); // 等待连接
// socket 为端口号和ip地址的组合
System.out.println("server:" + socket);
// 服务器得到客户端传来的数据
is = socket.getInputStream();
StringBuffer buffer = new StringBuffer();
byte[] bytes = new byte[10];
int len = 0;
while ((len = is.read(bytes)) != -1) {
String str = new String(bytes, 0, len);
buffer.append(str);
}
System.out.println(buffer);
socket.shutdownInput();
// 服务器得到信息之后向客户端进行反馈
os = socket.getOutputStream();
if (buffer.toString().equals("quit")) {
os.write(("I have received:服务器将停止服务").getBytes());
socket.shutdownOutput();
break;
} else {
os.write(("I have received:" + buffer).getBytes());
System.out.println("服务器写出数据完成!");
}
socket.shutdownOutput();
}
is.close();
os.close();
socket.close();
ss.close();
}
}
//服务端
package sdut.cs;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class TCPClient {
public static void main(String[] args) throws UnknownHostException, IOException {
Scanner reader = new Scanner(System.in);
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("client:" + socket);
// 客户端通过键盘输入一个字符串
OutputStream os = socket.getOutputStream();
String Clientstr = reader.nextLine();
os.write(Clientstr.getBytes());
System.out.println("客户端读取到数据!" + Clientstr);
socket.shutdownOutput();
// 客户端收到服务器端的反馈
InputStream is = socket.getInputStream();
StringBuffer buffer = new StringBuffer();
byte[] bytes = new byte[10];
int len = 0;
while ((len = is.read(bytes)) != -1) {
String str = new String(bytes, 0, len);
buffer.append(str);
}
System.out.println(buffer);
is.close();
os.close();
socket.close();
reader.close();
}
}
3、UDP Socket编程实现服务器和客户端的交互:
(1)服务器端先运行;
(2)客户端向服务器端发送数据"Hello World!",传到服务器;
(3)务器打印该信息的同时,向客户端发出信息"OK";
(4)客户端收到信息后打印,通信结束。
//接收端、服务器
package sdut.cs;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* 要实现UDP通信需要创建一个发送端程序和一个接收端程序
* 很明显在通信时只有接收端程序先运行,才能避免因发送端发送的数据无法接受,而造成的数据丢失
* 因此,首先需要来完成接收端程序的编写
*/
public class UDPReceiver {
public static void main(String[] args) throws IOException {
// 定义一个指定端口号为9999的接收端DatagramSocket对象
@SuppressWarnings("resource")
DatagramSocket server = new DatagramSocket(9999);
// 定义一个长度为1024的字节数组,用于接收数据
byte[] bytes = new byte[1024];
// 定义一个DatagramPacket数据报对象,用于封装接受的数据
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
System.out.println("等待接收数据...");
// 等待接收报数据,在没有接收到数据之前会处于阻塞状态
server.receive(packet);
// 调用DataGramPacket的方法获得接收到的信息,并转换为字符串形式
String str = new String(packet.getData(), 0, packet.getLength());
System.out.println("成功收到信息:" + str);
String strout = "发送成功 OK";
DatagramPacket packetOut = new DatagramPacket(strout.getBytes(), strout.getBytes().length,
InetAddress.getLocalHost(), 3000);
server.send(packetOut);
}
}
//发送端、客户端
package sdut.cs;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPSender {
public static void main(String[] args) throws IOException {
DatagramSocket client = new DatagramSocket(3000);
String str = "Hello World!";
DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getLocalHost(),
9999);
System.out.println("开始发送消息:" + str);
client.send(packet);
// 接受反馈
byte[] bytes = new byte[1024];
DatagramPacket packetIn = new DatagramPacket(bytes, bytes.length);
client.receive(packetIn);
String strIn = new String(packetIn.getData(), 0, packetIn.getLength());
System.out.println(strIn);
client.close();
}
}