网络编程个人归纳

版权声明:支持原创,注明出处。 https://blog.csdn.net/qq_38584967/article/details/88087922

前言

最近又学习了基础的网络编程,主要是学习并使用UDP和TCP来编写Demo,做一下归纳总结,方便以后温习。

正文

定位资源

首先网络编程第一步,定位资源:

定位一台机器:    	使用IP
定位一个软件:		使用端口Port
定位软件上的一个资源:使用URL

IP

//得到本机InetAddress对象
InetAddress addr = InetAddress.getLocalHost();
String ip = addr.getHostAddress();
String name = addr.getHostName();
System.out.println("ip->" + ip + " Name->" + name);
//输出: ip->192.168.43.18 Name->DESKTOP-S60Q5R1

//根据域名得到InetAddress对象
addr = InetAddress.getByName("www.baidu.com");
System.out.println("百度的ip->" + addr.getHostAddress());
//百度的ip->111.13.100.91
System.out.println("名称->" + addr.getHostName());
//名称->www.baidu.com

获取URL参数

URL url = new URL("http://www.baidu.com:80/index.html" +
        "?username=jjh&&iscool=true#a");
//获取四个值
System.out.println("协议->" +url.getProtocol());
//协议->http
System.out.println("域名|ip->" +url.getHost());
//域名|ip->www.baidu.com
System.out.println("端口->" +url.getPort());
//端口->80
System.out.println("请求资源1->" +url.getPath());
//请求资源1->/index.html
System.out.println("请求资源2->" +url.getFile());
//请求资源2->/index.html?username=jjh&&iscool=true

//参数
System.out.println("参数->" +url.getQuery());
//参数->username=jjh&&iscool=true

//锚点
System.out.println("锚点->" +url.getRef());
//锚点->a

通过URL可以做很多事情,比如爬虫也是先从URL获取资源,然后进行解析处理来得到想要的数据

//获取Url,点评网不能直接获得输入流
URL url = new URL("https://www.dianping.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//伪装成浏览器
connection.setRequestMethod("GET");
connection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36");
//下载资源
InputStream is = connection.getInputStream();
BufferedReader br = new BufferedReader(
        new InputStreamReader(is,"UTF-8"));
String msg = null;
//分析...
while (null != (msg = br.readLine())){
    System.out.println(msg);
    //处理数据...
}
br.close();

UDP编程

UDP是面向无连接的,效率会比TCP高,但是存在丢失数据的问题。
UDP是没有具体的区分服务端和客户端的,两两之间关系对等。

使用UDP编程发送数据:

发送数据大概分为五步
1.创建DatagramSocket 指定端口
2.准备数据 转换成byte数组
3.使用DatagramPacket封装数据
4.发送数据
5.释放资源

//1.创建DatagramSocket 指定端口和ip
// 参考构造函数,这里只指定端口,默认ip为本地
System.out.println("发送方启动...");
DatagramSocket client = new DatagramSocket(8888);
//2.准备数据 转换成byte数组
//传输对象
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(baos));
oos.writeObject("hhh");
oos.writeObject(222);
oos.flush();
byte[] data = baos.toByteArray();
//3.使用DatagramPacket封装数据,指定发送的ip和port
DatagramPacket packet = new DatagramPacket(data, 0, data.length,
        new InetSocketAddress("localhost",9999));
//4.发送数据
client.send(packet);
//5.释放资源
System.out.println("发送方结束进程...");
oos.close();
client.close();
使用UDP编程接收数据:

接收数据对应的也大致分为五步
1.使用DatagramSocket 指定端口 创建接收端
2.准备容器 封装为DatagramPacket 包裹
3.阻塞式接收包裹
4.处理数据
5.释放资源

//1.使用DatagramSocket 指定端口 创建接收端
System.out.println("接收方启动...");
DatagramSocket server = new DatagramSocket(9999);
//2.准备容器 封装为DatagramPacket 包裹
byte[] data = new byte[1024*60];
DatagramPacket packet = new DatagramPacket(data, 0, data.length);
//3.阻塞式接收包裹
server.receive(packet);
//4.处理数据
byte[] datas = packet.getData();
ByteArrayInputStream bais = new ByteArrayInputStream(datas);
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(bais));
Object str = ois.readObject();
Object i = ois.readObject();
if (str instanceof String) {
    System.out.println(str);
}
if (i instanceof Integer) {
    System.out.println(i);
}
//5.释放资源
System.out.println("接收方结束进程...");
ois.close();
server.close();

TCP编程

TCP相较于UDP,它是面向连接的,在java中都已经对其细节进行了封装,所以实现起来也不难。
TCP是区分服务端和客户端的,两者之间是存在通道进行读写操作。

客户端使用TCP发送数据:

发送数据大概分为三步
1.创建服务器连接
2.输入输出流操作
3.释放资源

System.out.println("----客户端----");
//1.创建服务器连接
Socket client = new Socket("127.0.0.1", 8888);
//2.输入输出流操作
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
String data = "Hello TCP!";
dos.writeUTF(data);
dos.flush();
//3.释放资源
dos.close();
client.close();
服务端端响应TCP接收数据:

接收数据对应的大致分为四步
1.创建ServerSocket,绑定端口
2.阻塞式等待连接,返回一个Socket
3.获取数据,进行操作
4.释放资源

System.out.println("----服务端----");
//1.创建ServerSocket,绑定端口
ServerSocket server = new ServerSocket(8888);
//2.阻塞式等待连接,返回一个Socket
Socket socket = server.accept();
System.out.println("----一个客户端建立了连接----");
//3.获取数据,进行操作
DataInputStream dis = new DataInputStream(socket.getInputStream());
System.out.println(dis.readUTF());
//4.释放资源
server.close();

以上就是TCP编程最简单的使用,注意,在服务器和客户端之间的通道是双向的,彼此通过tcp连接互相交流,主要是靠Socket对象来获取流进行操作,并且一般来说一个服务端可以响应多个客户端,这里就不贴代码了。

结束

跟着尚学堂的视频我自己也写了个TCP实现的聊天室,可以多人聊天也可以对某个人私聊。点击下载,仅供参考,感谢尚学堂的视频。

猜你喜欢

转载自blog.csdn.net/qq_38584967/article/details/88087922