实训--day就算是23吧

哎,今天进度又慢下来了。可能是有点难度吧。

看了网络编程,也只是把简单的基于udp的传输弄懂了,TCP的,有点复杂,就先不去纠结。

TCP
1)建立连接,形成传输数据的通道
2)在连接中进行大数据量的传输
3)通过三次握手完成连接,是可靠协议
4)必须建立连接,效率会稍低
UDP
1)将数据及源和目的封装成数据包中,不需要建立连接
2)每个数据报的大小限制在64K内
3)因无连接,是不可靠的协议
4)不需要建立连接,速度快


Socket
1)socket就是为网络服务提供的一种机制
2)通信的两端都有socket
3)网络通信其实就是socket间的通信
4)数据在两个socket间通过io传输


*
1)找到对方IP
2)数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都有数字进行标识
   为了方便称呼这个数字,叫做端口,逻辑端口
3)定义通信规则,这个通信规则成为协议,国际组织定义了通用协议TCP/IP


基于UDP
发送端思路
1)建立udpSocket服务
2)提供数据(数据包对象只接收byte数组对象的数据),并将数据封装到数据包中
3)通过socket服务的发送功能,将数据包发出去
4)关闭资源


接收端思路
1)定义UDPSocket服务,通常会监听一个接口,其实就是给这个接收网络应用层
2)定义一个数据包,存储接收到的字节数据。因为数据包对象中该有更多功能可以处理字节数据中的不同数据信息
3)socket服务的receive方法将受到的数据存入已经定义好的数据包中
4)关闭资源


为什么建立连接是三次握手,关闭连接是四次握手?
因为服务端listen状态下的socket当收到syn保温的连接请求后,它可以把ack和SYN(ack起应答作用,而SYN起同步作用)放在一个报文里来发送
但是关闭连接时,当收到对方的fin报文通知时,它仅仅表示对方没有数据发送给你了,但未必你所有的数据都全部发送给对方了。
所以你可能未必会马上关闭socket,也即你可能还需要发送一些数据给对方之后,再发送fin报文给对方来表示你同意现在可以关闭连接了
所以它的ack报文和fin报文多数情况下都是分开发送的。


练习:

package com.swpu.khl.socket;

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

public class UdpSend 
{
	public static void main(String[] args) throws IOException 
	{
		/*DatagramSocket ds=new DatagramSocket();
		byte [] buf="test".getBytes();
		DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10000);
		ds.send(dp);
		ds.close();*/
		
		DatagramSocket ds=new DatagramSocket();
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String line=null;
		while((line=br.readLine())!=null)
		{
			if(line.equals("quit"))
				break;
			byte [] buf=line.getBytes();
			DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"),10001);
			ds.send(dp);
		}
		ds.close();
		
	}

}


package com.swpu.khl.socket;

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

public class UdpReceive 
{
	@SuppressWarnings("resource")
	public static void main(String[] args) throws IOException 
	{
		/*DatagramSocket ds=new DatagramSocket(10000);
		//服务器一般都是一直开着的,此处就用一个无限循环来表示它是一直开着的
		while(true)
		{
			byte [] buf=new byte[1024];
			DatagramPacket dp=new DatagramPacket(buf, buf.length);
			ds.receive(dp);
			String ip = dp.getAddress().getHostAddress();
			String data=new String(dp.getData(), 0, dp.getLength());
			int port=dp.getPort();
			System.out.println(ip+":"+data+":"+port);
		}*/
		
		DatagramSocket ds=new DatagramSocket(10001);
		while(true)
		{
			byte [] buf=new byte[1024];
			DatagramPacket dp=new DatagramPacket(buf, buf.length);
			ds.receive(dp);
			System.out.println(dp.getData()+":"+dp.getAddress().getHostAddress());
		}
		
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值