一:Java网络通讯
请求与响应
IP地址+端口号(定位A2的应用程序)
端口号的作用:定位到应用程序
IP地址的作用:具体定位到某台计算机。
IP地址+端口号(定位A2的应用程序)
端口号的作用:定位到应用程序
IP地址的作用:具体定位到某台计算机。
怎么区分客户端与服务器端?
谁发起的,谁为客户端,谁接受请求谁为服务端。
谁发起的,谁为客户端,谁接受请求谁为服务端。
浏览器属于客户端。
域名 dns解析成IP地址
二:socket编程 网络模型
应用层
--Http协议
传输层
--Tcp协议
网络层
--Ip协议
链路层
--以太网协议
--Http协议
传输层
--Tcp协议
网络层
--Ip协议
链路层
--以太网协议
任何计算机语言通讯,底层都使用socket技术
Java c#,c,socket技术遵循一个规范 二进制+IP端口号
Java c#,c,socket技术遵循一个规范 二进制+IP端口号
socket分为两个核心 tcp与udp
tcp与udp区别?
1.udp面向无连接--不会建立连接 不可靠协议 限制传输64k。
tcp与udp区别?
1.udp面向无连接--不会建立连接 不可靠协议 限制传输64k。
2.tcp协议 面向连接协议 三次握手 字节流传输 效率没udp高
tcp协议比udp靠谱。
tcp协议比udp靠谱。
三:tcp协议与udp协议不能互通。
四:TCP协议
TCP协议采用三次握手,成功之后才开始进行数据传输
最后一次就会进行四次挥手。
最后一次就会进行四次挥手。
第一次握手:
建立连接时,客户端发送SYN=J报文到服务器端,等待确认。
第二次握手:
服务器端收到SYN=J报文,回传SYN=J+1,SYN=k给客户端。
第三次握手:
客户端接收ACK=ACK+1,客户端与服务器端开始传输数据。
建立连接时,客户端发送SYN=J报文到服务器端,等待确认。
第二次握手:
服务器端收到SYN=J报文,回传SYN=J+1,SYN=k给客户端。
第三次握手:
客户端接收ACK=ACK+1,客户端与服务器端开始传输数据。
四次分手:
1.客户端A发送一个FIN,用来关闭客户A到服务器B的数据传输。
2.服务器B收到这个FIN,它会发回一个ACK,确认序号为收到的
序号+1,和SYN一样,一个FIN将占有一个序号。
3.服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
4.客户端A发回ACK报文,并确认序号设置为收到序号+1.
1.客户端A发送一个FIN,用来关闭客户A到服务器B的数据传输。
2.服务器B收到这个FIN,它会发回一个ACK,确认序号为收到的
序号+1,和SYN一样,一个FIN将占有一个序号。
3.服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
4.客户端A发回ACK报文,并确认序号设置为收到序号+1.
![](https://i-blog.csdnimg.cn/blog_migrate/16119eb3bf2bc2ec9272bdc73a6f7cf8.png)
五:怎么解决tcp协议同时支持多个请求。
线程池?多线程?
用线程池。节约内存,缓存到队列。
保证服务器不宕机。
线程池?多线程?
用线程池。节约内存,缓存到队列。
保证服务器不宕机。
Udp:
package com.xuyuedu;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
//Udp服务器端
class UdpServer{
public static void main(String[] args) throws Exception {
//1.ip地址+端口号
System.out.println("udp服务器已经启动。。。8080");
//创建服务器端端口号 默认使用本机IP地址
DatagramSocket ds = new DatagramSocket(8080);
byte[] bytes=new byte[1024];
//定义数据包
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
//接收客户端请求,将数据封装给数据包 如果客户端不往服务器发送请求,就一直等待
ds.receive(dp);
System.out.println("来源IP地址:"+dp.getAddress()+",端口号:"+dp.getPort());
String result = new String(dp.getData(),0,dp.getLength());
System.out.println(result);
System.out.println("服务器端接收客户端请求");
ds.close();
}
}
//先写服务器端,再写客户端
public class UdpClint {
public static void main(String[] args) throws Exception {
System.out.println("Udp客户端启动连接。。。");
//不传端口号表示客户端
DatagramSocket ds = new DatagramSocket();
String str="腾讯课堂";
byte[] strBytes=str.getBytes();
DatagramPacket dp = new DatagramPacket(strBytes, strBytes.length,InetAddress.getByName("127.0.0.1"),8080);
ds.send(dp);
ds.close();
}
}
测试结果:
udp服务器已经启动。。。8080
来源IP地址:/127.0.0.1,端口号:51493
腾讯课堂
服务器端接收客户端请求
TCP:
package com.xuyuedu;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class TcpService{
public static void main(String[] args) throws Exception {
System.out.println("我是tcp服务器端启动。。");
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
//创建服务器端连接
ServerSocket serverSocket = new ServerSocket(8080);
try {
while(true) {
//接收客户端请求 阻塞功能
Socket accept = serverSocket.accept();
newCachedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
InputStream inputStream = accept.getInputStream();
//将字节流转换成String类型
byte[] bytes=new byte[1024];
int len=inputStream.read(bytes);
String result = new String(bytes,0,len);
System.out.println("服务器端接收到客户端内容:"+result);
OutputStream outputStream=accept.getOutputStream();
outputStream.write("this is yes ".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
} catch (Exception e) {
}finally {
serverSocket.close();
}
}
}
public class TcpClient {
public static void main(String[] args) throws Exception, IOException {
System.out.println("socket tcp客户端启动。。");
Socket socket = new Socket("127.0.0.1",8080);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("我是你的盖世英雄。。。".getBytes());
socket.close();
}
}
素材: