实验八网络程序设计(网络编程)_JAVA

实验目的:

(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();
	}

}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值