网络编程之Socket编程

TCP/IP协议
传输层协议中有两个非常重要的协议:
➢传输控制协议TCP(Transmission Control Protocol)
➢用户数据报协议UDP(User Datagram Protocol)。
TCP/IP以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。
IP(Internet Protocol)协议是网络层的主要协议,支持网间互连的数据通信。
TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即物理链路层、IP层、传输层和应用层。

TCP协议:
➢使用TCP协议前,须先建立TCP连接,形成传输数据通道
➢传输前,采用“三次握手”方式,点对点通信,是可靠的
➢TCP协议进行通信的两个应用进程:客户端、服务端。
➢在连接中可进行大数据最的传输
➢传输完毕,需释放已建立的连接,效率低
UDP协议:
➢将数据、源、目的封装成数据包,不需要建立连接
➢每个数据报的大小限制在64K内
➢发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
➢可以广播发送
➢发送数据结束时无需释放资源,开销小,速度快

URL类
●URL(Uniform Resource Locator):统一资源定 位符,它表示Internet. 上某一资源的地址。
●它是一种具体的URI,即URL 可以用来标识一个资源,而且还指明了如何locate这个资源。
●通过URL我们可以访问Internet 上的各种网络资源,比如最常见的www,ftp站点。浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源。
●URL的基本结构由5部分组成:
<传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表
➢例如:
http://192.168.1.100:8080/helloworld/index.jsp#a?username=shkstart&password=123
➢#片段名:即锚点,例如看小说,直接定位到章节
➢参数列表格式:参数名=参数值&参数名=参数值…

在这里插入图片描述

在这里插入图片描述

练习 客户端发送信息给服务端 服务端将其打印在控制台上实现TCP网络编程

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import org.junit.Test;
public class TCPTest1 {
	
	
	//客户端
	@Test
	public void Client() {
		Socket socket = null;
		OutputStream os = null;
		try {
//1造socket 明白把数据传输到哪里
			InetAddress inet = InetAddress.getByName("127.0.0.1");//本机IP号
			socket = new Socket(inet , 8888);
//2造一个输出流 通过流的形式传输出去
			os = socket.getOutputStream();
			/*java socket中有两个流,
			一个是输入流getinputstream,用于读取socket发送过来的数据,就是接收消息用的
			另一个是输出流getoutputstream,用于向socket端发送数据,就是发送消息用的*/
//3输出
			os.write("你好,我是第一个客户端".getBytes());
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
//4关闭资源
		if(socket != null) {
		try {
			os.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
		if(os != null) {
		try {
			socket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
	}}
	
	//服务端
	@Test
	public void Server(){
		
		ServerSocket ss = null;
		Socket socket = null;
		InputStream is = null;
		ByteArrayOutputStream baos = null;
		try {
//1造一个服务端的端口号
			ss = new ServerSocket(8888);
//2表示可接收		
			socket = ss.accept();
//3获取客户端的输入流			
			is = socket.getInputStream();
			
			//不推荐用下列方法 因为一个中文占三个字节 我们用的字节流 会把中文拆开成乱码
//			byte[] buffer = new byte[1024];//此时不管大小多少 如果数据过大会出现乱码 
//			int len;
//			while((len = is.read(buffer)) != -1) {
//				String str = new String(buffer , 0 , len );
//				System.out.println(str);
//			}
			
//4接收			
			baos = new ByteArrayOutputStream();
			byte[] buffer = new byte[5];//此时大小无所谓 
			int len;
			while((len = is.read(buffer)) != -1) {
				baos.write(buffer , 0 , len);
			}
			
			System.out.print(baos.toString());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
//5关闭资源
		if(baos != null) {
		try {
			baos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
		if(is != null) {
		try {
			is.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}}
		if(socket != null) {
		try {
			socket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}}
		if(ss != null) {
		try {
			ss.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}}

	}
}

练习UDP

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

import org.junit.Test;
public class UDPTest {	
	//发送端
	@Test
	public void sender() throws IOException {
		
		DatagramSocket socket = new DatagramSocket();
		
		
		String str = "我是UDP发送的!";
		byte[] data = str.getBytes();
		InetAddress ient = InetAddress.getLocalHost();
		DatagramPacket packet = new DatagramPacket(data,0,data.length,ient,9998);
		
		socket.send(packet);
		
		socket.close();
	}	
	//接收端
	@Test
	public void receiver() throws IOException {
		
		DatagramSocket soket = new DatagramSocket(9998);
		
		
		byte[] buffer = new byte[100];
		DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length); 
		
		soket.receive(packet);
		
		System.out.println(new String(packet.getData(),0,packet.getLength()));
			
		soket.close();
	}	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值