java网络编程基础夯实07-基于TCP/UDP的Socket编程(单线程)

基于TCP/UDP的Socket编程

一. 基于UDP协议的Socket通信

1. UDP传送的发送端

<span style="font-size:18px;">package com.markliu.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * 创建UDP传输的发送端。
 * @author MarkLiu
 */
public class UDPSend {

	/*
	 * 创建UDP传输的发送端。
	 * 思路:
	 * 1,建立udp的socket服务。
	 * 2,将要发送的数据封装到数据包中。 
	 * 3,通过udp的socket服务将数据包发送出去。
	 * 4,关闭socket服务。
	 */
	public static void main(String[] args) throws IOException {

		System.out.println("UDP发送端启动...");
		//1,建立udp的socket服务。使用DatagramSocket对象。
		DatagramSocket datagramSocket = new DatagramSocket(20100); // 指定该发送端的端口号	
		//2,将要发送的数据封装到数据包中。
		String data = "UDP开始发送数据,哥们来啦。。。";
		byte[] dataByte = data.getBytes();
		// 使用DatagramPacket将数据封装到的该对象包中。
		// 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
		DatagramPacket datagramPacket = new DatagramPacket(dataByte, dataByte.length,
				InetAddress.getByName("10.136.13.203"), 20000);  // 接收端的ip和端口号
		//3,通过udp的socket服务将数据包发送出去。使用send方法。
		datagramSocket.send(datagramPacket);
		//4,关闭资源。
		datagramSocket.close();
	}
}</span>

2. UDP传送的接收端

<span style="font-size:18px;">package com.markliu.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * 创建UDP传输的接收端。
 * @author MarkLiu
 */
public class UDPReceiveDemo {

	/*
	 * 建立UDP接收端的思路。 
	 * 1,建立udp socket服务,因为是要接收数据,必须要明确一个端口号。
	 * 2,创建数据包,用于存储接收到的数据。方便用数据包对象的方法解析这些数据.
	 * 3,使用socket服务的receive方法将接收的数据存储到数据包中。
	 * 4,通过数据包的方法解析数据包中的数据。 
	 * 5,关闭资源
	 */
	public static void main(String[] args) throws IOException {

		System.out.println("UDP接收端启动...");
		// 1,建立udp socket服务。
		DatagramSocket datagramSocket = new DatagramSocket(20000); // 指定接收端的端口号
		// 2,创建数据包。
		while (true) { // 此处循环,模拟服务器
			byte[] buf = new byte[1024];
			DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);

			// 3,使用接收方法将数据存储到数据包中。
			datagramSocket.receive(datagramPacket); // 阻塞式

			// 4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。

			InetAddress address = datagramPacket.getAddress(); // 返回某台机器的 IP地址对象
			String ip = address.getHostAddress();
			int port = datagramPacket.getPort();

			// 取出数据并转换为字符串
			String receiveData = new String(datagramPacket.getData(), 0,
					datagramPacket.getLength());
			System.out.println("IP:" + ip + "\n端口号Port:" + port
					+ "\n接收到的数据receiveData:" + receiveData);
		}
		// 5,关闭资源
		// datagramSocket.close();
	}
}
</span>

二. 基于TCP协议的Socket通信


1.客户端程序

package com.markliu.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 客户端
 * @author MarkLiu
 */
public class TCP_ClientDemo {

	public static void main(String[] args) throws UnknownHostException, IOException {
		/*
		 * 客户端发数据到服务端
		 * 
		 * Tcp传输,客户端建立的过程。
		 * 1,创建tcp客户端socket服务。使用的是Socket对象,建议该对象一创建就明确目的地。明确要连接的主机。 
		 * 2,如果连接建立成功,说明数据传输通道已建立。 该通道就是socket流 ,是底层建立好的。
		 * 	    既然是流,说明这里既有输入,又有输出。 想要输入或者输出流对象,可以找Socket来获取。
		 *	    可以通过getOutputStream(),和getInputStream()来获取两个字节流。 
		 * 3,使用输出流,将数据写出。
		 * 4,关闭资源。
		 */
		
		//创建客户端socket服务。
		Socket clientSocket = new Socket( "10.136.13.203",10001); // 创建一个流套接字并将其
																// 连接到指定 IP 地址的指定端口号。
		
		//获取socket流中的输出流。
		
		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));	
		OutputStream out = clientSocket.getOutputStream();
		
		String text = null;
		while((text = bufr.readLine()) != null ){
			//使用输出流将指定的数据写出去。
			out.write(text.getBytes());
		}
		
		// 关闭资源
		clientSocket.close();
	}

}
2.服务端程序
package com.markliu.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCP_ServerDemo {

	public static void main(String[] args) throws IOException {
		 
		/* 服务端接收客户端发送过来的数据,并打印在控制台上。
		 * 
		 * 建立tcp服务端的思路: 
		 * 1,创建服务端socket服务。通过ServerSocket对象。
		 * 2,服务端必须对外提供一个端口,否则客户端无法连接。 
		 * 3,获取连接过来的客户端对象。
		 * 4,通过客户端对象获取socket流读取客户端发来的数据 并打印在控制台上。 
		 * 5,关闭资源。关客户端,关服务端。
		 */

		ServerSocket serverSocket = new ServerSocket(10001);
		Socket clientScSocket = serverSocket.accept();

		String ip = clientScSocket.getInetAddress().getHostAddress();
		InputStream in = clientScSocket.getInputStream();

		byte[] buf = new byte[1024];
		while(true){
			int len = in.read(buf);
			String text = new String(buf, 0, len);
			System.out.println(ip + ":" + text);
			if (text.equals("886")) { // 模拟退出效果
				System.out.println("退出聊天窗口");
				clientScSocket.close();
				serverSocket.close();
			}
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sunny Mornings

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值