java-网络编程之TCP、UDP简单交互

(1)运用网络地址获取网页信息浅用。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;

class getinformation_website {
	public boolean find(String webl) {
		int length = 0;
		try {
			URL is = new URL(webl);//建立与所需读取信息网络的连接。
			InputStream open = is.openStream();//创建一个输入流对象。
			exization("test.html");//判断此文件是否存在
			FileOutputStream out = new FileOutputStream("test.html");//创建字节输出流,将数据读入此文件中
			BufferedInputStream input = new BufferedInputStream(open);//字符输入流,并创建数据缓冲区
			BufferedOutputStream output = new BufferedOutputStream(out);//字符输出流,创建数据缓冲区
			byte[] box = new byte[1024 * 20];
			//将网络信息打印到显示屏上。
			System.out.println("*********************打印网页信息如下********************");
			while ((length = input.read(box, 0, box.length)) != -1) {
				String s = new String(box);
				System.out.println(s);
				output.write(box, 0, box.length);
			}
			open.close();
			out.close();
			input.close();
			output.close();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (length != 0)
				return true;
			else
				return false;
		}
	}

	public void exization(String R) throws IOException {
		File fip = new File(R);
		if (fip.exists()) {
			fip.delete();//文件存在则删除
		}
		fip.createNewFile();//创建以R为名的文本。
	}
}

public class getinformation {

	public static void main(String[] args) {
		//主函数
		getinformation_website web = new getinformation_website();
		Scanner input = new Scanner(System.in);
		System.out.println("请输入需要获取网站的网址信息:");
		String webl = input.nextLine();
		input.close();
		if (web.find(webl))
			System.out.println("获取指定网络信息成功!");
		else
			System.out.println("信息获取失败!");
	}

}

(2)运用TCP编程原理实现客户端和服务端简单交互。
注:运行代码时应先运行服务端代码。
1.服务端代码:

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

class LTCPserver {

	public void tcps() {
		Scanner input = new Scanner(System.in);// 标准输入
		try {
			ServerSocket open = new ServerSocket(6666);// 创建端口号
			Socket tcpser = open.accept();// 等待客户端的连接
			if (tcpser != null)// 判断连接是否成功
			{
				System.out.println("服务器接收到来自" + tcpser.getInetAddress().getHostAddress() + "的连接");
				System.out.println("可以与客户端进行对话");
				while (true) {
					OutputStream os = tcpser.getOutputStream();// 创建可以向连接的客户端进行字节输出流对象。
					// 创建字符打印流,向客户端可以打印信息(即发送信息,其中具有字节缓冲输出流)。
					// OutputStreamWriter:字符转换输出流
					PrintWriter autor = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(os)));
					System.out.print("请输入向客户端待发送的信息:");
					String mesage = input.nextLine();
					autor.println(mesage);// 向客户端发送信息。
					autor.flush();// 清空缓冲区的数据
					InputStream is = tcpser.getInputStream();// 创建与客户端相连接的字节输入流。
					// 以字符流的方式接收来自客户端的信息,并建立数据缓冲区
					BufferedReader reader = new BufferedReader(new InputStreamReader(is));
					String apt = reader.readLine();
					if (apt.equals("quit"))// 若接收数据为《quit》则关闭服务器,结束交流。(可自由更改此条件)
					{
						System.out.println("本次会话到此结束!");
						tcpser.shutdownInput();
						tcpser.shutdownOutput();
						autor.close();
						reader.close();
						break;
					} else {
						System.out.println("客户端向你发来消息说:" + apt);
					}
				}
			} else
				System.out.println("无客户端连接!");
			input.close();
			open.close();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

public class TCPserver {

	public static void main(String[] args) throws InterruptedException {
		LTCPserver find = new LTCPserver();
		find.tcps();
	}

}

2.客户端代码

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;


class LTcpclient {
	public void Tcpc() {
		try {
			// 客户端连接需要服务器的ip地址,和端口号。
			Socket accpet = new Socket(InetAddress.getLocalHost(), 6666);
			Scanner input = new Scanner(System.in);
			if (accpet != null) {
				System.out.println("连接服务端成功!");
				System.out.println("接下来可选择和服务端进行对话,发送<quit>将结束对话!");
				while (true) {
					// 以下与服务端同理
					InputStream setmasege = accpet.getInputStream();
					BufferedReader reader = new BufferedReader(new InputStreamReader(setmasege));
					String opt = reader.readLine();
					System.out.println("服务端说:" + opt);
					OutputStream seller = accpet.getOutputStream();
					PrintWriter opn = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(seller)));
					System.out.print("请输入向服务端待发送的信息:");
					String seter = input.nextLine();
					opn.println(seter);
					opn.flush();
					if (seter.equals("quit")) {
						opn.close();
						accpet.shutdownInput();
						accpet.shutdownOutput();
						reader.close();
						break;
					}
				}
				input.close();
				accpet.close();
			} else {
				System.out.println("服务器连接失败!");
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("服务器连接失败或断开连接!");
			System.out.println("打印失败原因:" + e.getMessage());
		}
	}
}

public class TCPclient {

	public static void main(String[] args) {
		LTcpclient accpet = new LTcpclient();
		accpet.Tcpc();
	}

}

(3)使用UDP编程原理实现交互
注:UDP协议无需建立客户端可服务器的连接,故没有严格的服务端和客户端的划分,为不可靠协议,不过传输效率快。
1.服务端代码

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.Scanner;

//UDP编程发送信息和接收信息都需要封装成包,注意包内所应具备的信息。
class server {
	public void setser() {
		try {
			DatagramSocket open = new DatagramSocket(6666);
			Scanner input = new Scanner(System.in);
			while (true) {
				byte[] box = new byte[1024 * 18];
				DatagramPacket paket = new DatagramPacket(box, box.length);// 将接收信息封装为包
				open.receive(paket);// 接收客户端信息
				String message = new String(paket.getData(), 0, box.length);
				if (message.equals("goodbye")) {
					break;
				} else {
					System.out.println("收到来自客户端的信息:" + message);
					System.out.print("请输入给客户端回复的信息:");
					message = input.nextLine();
					box = message.getBytes();
					if (message.equals("goodbye")) {// 结束聊天需要双向结束
						System.out.println("本次聊天到此结束,感谢你的使用!");
						input.close();
						open.close();
						break;
					}
					DatagramPacket setpaket = new DatagramPacket(box, 0, box.length, paket.getAddress(),
							paket.getPort());// 将发送信息封装为包,包内包含发送信息的ip和端口。
					open.send(setpaket);
				}
			}
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

public class UDPserver {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		server order = new server();
		order.setser();
	}

}

2.客户端代码

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

class client {
	public void user() {
		try {
			DatagramSocket list = new DatagramSocket();
			Scanner input = new Scanner(System.in);
			System.out.println("欢迎使用本次聊天,输入<goodbye>将结束聊天,祝您聊天愉快!");
			while (true) {
				System.out.print("请输入待发送至服务端的内容:");
				String message = input.nextLine();
				byte[] box = new byte[1024 * 18];
				box = message.getBytes();
				DatagramPacket sell = new DatagramPacket(box, 0, box.length, InetAddress.getLocalHost(), 6666);
				list.send(sell);
				if (message.equals("goodbye")) {
					list.close();
					input.close();
					System.out.println("欢迎下次使用!");
					break;
				} else {
					DatagramPacket set1 = new DatagramPacket(box, box.length);
					list.receive(set1);
					message = new String(box);
					System.out.println("接收到服务端信息:" + message);
				}
			}
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

public class UDPclient {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		client test = new client();
		test.user();
	}

}

本文仅供学习参考,皆为较粗浅原理,如有不对,欢迎指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值