TCP/UDP是如何传输的?
一、网络模型:
OSI参考模型
TCP/IP参考模型
二、网络通讯要素
- IP地址:
- 网络中设备的标识
- 不易记忆,可用主机名
- 本机回环地址:127.0.0.1 主机名: localhost
- 端口号:
- 用于标识进程的逻辑地址,不同进程的标识
- 有效端口: 0~65535,其中0~1024系统使用或者保留端口
- 传输协议:
- 通讯的规则
- 常见的协议: TCP、 UDP
三、Socket
就是为了网络服务提供的一种机制;通信的两端都有Socket;网络通信其实就是Socket间的通信;数据在两个Socket间通过IO传输。
四、TCP和UDP
TCP: 建立连接、在连接中进行传输、通过三次握手完成连接(是可靠协议)、效率会稍低
Socket和ServerSocket
传输步骤:
1、建立客户端和服务器端
2、建立连接后,通过Socket中的IO流进行数据的传输
3、关闭socket
————客户端和服务器端是两个独立的运行程序
客户端:通过Socket建立对象并指定要连接的服务端主机以及端口
Socket s = new Socket(“192.168.1.1”,9999); OutputStream out = s.getOutputStream(); out.write(“hello”.getBytes()); s.close();
服务器端:建立服务端需要监听的一个端口
ServerSocket ss = new ServerSocket(9999); Socket s = ss.accept (); InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int num = in.read(buf); String str = new String(buf,0,num); System.out.println(s.getInetAddress().toString()+”:”+str); s.close(); ss.close();
UDP:不需要建立连接、将数据及源和目的封装成包(限制在64K内)、不可靠协议、速度快
DatagramSocket与DatagramPacket
传输步骤:
1、建立发送端,接收端;
2、建立数据包;
3、调用Socket的发送接受方法;
4、关闭Socket
————发送端和接受端是两个独立的运行程序
发送端:
DatagramSocket ds = new DatagramSocket(); byte[] by = “hello,udp”.getBytes(); DatagramPacket dp = new DatagramPacket(by,0,by.length, InetAddress.getByName(“127.0.0.1”),10000); ds.send(dp); ds.close();
接受端:
DatagramSocket ds = new DatagramSocket(10000); byte[] by = new byte[1024]; DatagramPacket dp = new DatagramPacket(by,by.length); ds.receive(dp); String str = new String(dp.getData(),0,dp.getLength()); System.out.println(str+"--"+dp.getAddress()); ds.close();
小练习:
UDP聊天程序:1.通过键盘录入获取要发送的信息;2.将发生和接受分别封装到两个线程中。
~~~~~问题分析:
Tcp传输最容易出现的问题:1、客户端连接上服务端,两端都在等待,没有任何数据传输; 2、因为read方法或者readLine方法是阻塞式。《解决办法》1.自定义结束标记 2.使用shutdownInput, shutdownOutput方法。
Test:
1、建立一个群聊服务器端。
2、客户端向服务端上传一个图片。
3、客户端向服务端发送用户名请求登录,服务端通过验证,返回“欢迎光临”,未通过则返回“用户不存在”。