黑马程序员---网络,tcp udp 笔记


------- android培训java培训、期待与您交流! ----------



总结:
一、UDP:
                1、将数据源和目的地封装到数据包中,不需要建立连接
                2、每个数据包的大小限制在64k以内
                3、因无连接,是不可靠协议
                4、不需要建立连接,速度快

 

例子:聊天、对讲机就是UDP的,面向无连接(不管在不在,知不知道,只管发送,求速度),丢数据也不管。速度快。数据被分成包

 

 


二、TCP:
                1、建立连接,形成传输数据的通道
                2、在连接中进行大量数据的传输
                3、通过三次握手完成连接、是可靠协议
                4、必须建立连接,效率会稍低

 

例子:电话通话,必须连接,对方同意才可以发送数据(不然就等待),不能丢失数据。


udp的发送端:

①:建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。

②:明确要发送的具体数据。

③:将数据封装成了数据包。

④:用socket服务的send方法将数据包发送出去。

⑤:关闭资源。

 

udp的接收端:

①:创建udp的socket服务,必须要明确一个端口,作用在于,只有发送到这个端口的数据才是这个接收端可以处理的数据。

②:定义数据包,用于存储接收到数据。

③:通过socket服务的接收方法将收到的数据存储到数据包中。

④:通过数据包的方法获取数据包中的具体数据内容,比如ip、端口、数据等等。

⑤:关闭资源。


TCP客户端:

①:建立tcp的socket服务,最好明确具体的地址和端口。这个对象在创建时,就已经可以对指定ip和端口进行连接(三次握手)。

②:如果连接成功,就意味着通道建立了,socket流就已经产生了。只要获取到socket流中的读取流和写入流即可,只要通过getInputStream和getOutputStream就可以获取两个流对象。

③:关闭资源。


TCP服务端:

①:创建服务端socket服务,并监听一个端口。

②:服务端为了给客户端提供服务,获取客户端的内容,可以通过accept方法获取连接过来的客户端对象。

③:可以通过获取到的socket对象中的socket流和具体的客户端进行通讯。

④:如果通讯结束,关闭资源。注意:要先关客户端,再关服务端。



客户端:
package july76net;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Demo22 {
	public static void main(String[] args) throws Exception {
		Socket s = new Socket("localhost", 12036);
		
		BufferedReader br = new BufferedReader(new FileReader("E:/你好.txt"));
		PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
		
		BufferedReader br2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
		
		
		String line;
		while((line = br.readLine()) != null){
			pw.println(line);
		}
		s.shutdownOutput();
		
		String str = br2.readLine();
		System.out.println(str);
		s.close();
	}
}

服务器端:
package july76net;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


class MyUpdate implements Runnable{
	private Socket s;

	public MyUpdate(Socket s) {
		super();
		this.s = s;
	}

	@Override
	public void run() {
		
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+".........connected!");
		int count = 0;
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
			File file = new File("E:/");
			File f = new File(file,"你好"+count+".txt");
			while(f.exists()){//如果写成if,就不可以!
				f = new File(file,"你好"+(++count)+".txt"); 
			}
			PrintWriter pw = new PrintWriter(new FileWriter(f),true);
			PrintWriter pw2 = new PrintWriter(s.getOutputStream(),true);
			
			String line;
			while((line = br.readLine()) != null){
				pw.println(line);
			}
			
			pw2.println("恭喜您,上传成功!");
			s.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

public class Demo23 {
	public static void main(String[] args) throws Exception {
		
		ServerSocket ss = new ServerSocket(12036);
		while(true){
			Socket s = ss.accept();
			new Thread(new MyUpdate(s)).start();
		}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值