> 文章列表 > 网络编程UDP TCP

网络编程UDP TCP

网络编程UDP TCP

定义:关注底层数据的传输
区分网页编程:关注上层应用

端口号:区分软件
2个字节 0~65535表示端口号
同一协议下端口号不能冲突
8000以下称为预留端口号,建议之间设置端口号为8000以上
常见的端口号:
80:http
8080:tomcat
3306:mysql
1521:oracle

InetSocketAddress:此类实现IP套接字地址(IP地址+端口号)

URL:同一资源定位符,互联网中资源的指针
互联网的三大基石:http html url
url组成:
协议:http
域名:www.baidu.com
端口:80
资源:index.html?username=zhangsan&password=1234#a
http://www.baidu.com:80/index.html?username=zhangsan&password=1234#a

传输层协议:(标准,合同规范)
UDP:写信 不安全,协议简答,开销小,效率高 大小限制一般不超过60k
TCP:打电话 基于连接 安全,效率低 没有大小限制

IP:定位网络中的节点(区分电脑,手机)
IPV4 4个字节 32位 IPV6 128位
特殊的IP:
192.168.0.0-192.168.255.255 非注册IP,供组织内部使用的IP
127.0.0.1 本地IP
localhost:本地
IP与域名
DNS解析器:做域名与IP直接解析问题
java.net包
InetAddress

Socket:套接字
传输层为应用层开辟的一个小口子
面向Socket编程,不同的传输层协议对Socket的实现不同

UDP协议实现:
两端平等:发送端 接口端
UPD协议下数据传输基于字节数组
DatagramSocket
DatagramSocket(int port) 构造一个数据报套接字并将其绑定到本地主机上的指定端口。
void receive(DatagramPacket p) 从此套接字接收数据报包。
void send(DatagramPacket p) 从此套接字发送数据报包。
DatagramPacket : 该类表示数据报包。

UDP协议下基本流程:
发送端:
1.定义发送端
2.准备数据
3.打包数据
4.发送
5.关闭

接收端:
1.定义接收端
2.准备包裹用来接收
3.接收数据
4.处理数据
5.关闭

TCP
协议下两端是不平等的,客户端,服务器端
tcp协议下数据传输基于IO流

TCP协议下实现基本流程:
客户端:
1.定义客户端 Socket该类实现客户端套接字,两台机器通信的端点
Socket(String host,int port)参数:服务器IP+端口
2.准备数据
3.获取输出流,向服务器发送数据
4.刷出
5.关闭
服务器端:
1.定义服务器 ServerSocket该类实现服务器套接字
2.阻塞式监听
3.获取输入流,读取客户端发送的数据
4.处理数据
5.关闭

单向登入
TCP协议下实现单向登录流程 : 客户端
1.定义我是客户端
2.键盘输入接收用户输入的登录信息 username=zhangsan&password=123
3.获取输出流,向服务器发送数据
4.刷出
5.关闭

public class Client {
public static void main(String[] args) throws Exception {
// 创建要发送数据报包的工具,我本身占用9000端口向外面机器发数据包
DatagramSocket ds = new DatagramSocket(9000);
byte[] b = "aaaa".getBytes();
//必须告诉数据包要发到哪里去, 封装数据时才 指定 目标电脑以及端口
DatagramPacket dp = new DatagramPacket(b,b.length,new
InetSocketAddress("localhost",8999));
ds.send(dp);
ds.close();
}
}

TCP协议下实现单向登录流程 : 服务端
1.定义我是服务器
2.阻塞式监听
3.获取输入流,读取客户端发送的数据
4.处理数据
校验用户输入的登录信息是否正确(admin 1234)
5.关闭

        public class Server {
public static void main(String[] args) throws Exception {
// 创建数据报包 工具
DatagramSocket ds = new DatagramSocket(8999);
// 准备接收数据的容器空间
byte[] b = new byte[1024];
// 数据报
DatagramPacket dp = new DatagramPacket(b,b.length);
ds.receive(dp); //阻塞式方法
String string = new String(dp.getData(),0,dp.getLength());
//dp.getLength()返回实际收到的数据的字节数
System.out.println(string);
ds.close();
}
}

双向登入
TCP协议下实现双向登录流程 : 客户端
1.定义我是客户端
2.键盘输入接收用户输入的登录信息 username=zhangsan&password=123
3.获取输出流,向服务器发送数据
4.刷出
5.获取输入流,读取服务器响应的结果
6.处理结果
7.关闭

    import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 最简单的Socket客户端
*
*/
public class BasicSocketClient {
public static void main(String[] args) {
try {
//指定的是所要连接的服务器的ip和端口。而不是自己机器的端口。发送端口是随机的。
Socket socket = new Socket(InetAddress.getLocalHost(),8888);
// ObjectInputStream ois = new
ObjectInputStream(socket.getInputStream());
// String string = (String) ois.readObject();
// System.out.println(string);
BufferedReader br = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
System.out.println(br.readLine());
br.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

TCP协议下实现双向登录流程 : 服务端
1.定义我是服务器
2.阻塞式监听
3.获取输入流,读取客户端发送的数据
4.处理数据
校验用户输入的登录信息是否正确(admin 1234)
5.获取输出流,将结果响应给客户端
6.刷出
7.关闭

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 最简单的服务器端代码
*
*/
public class BasicSocketServer {
public static void main(String[] args) {
try {
//建立服务器端套接字
ServerSocket serverSocket = new ServerSocket(8888); //tcp端口一共多少??
//监听,等待客户端请求,并愿意接收连接。
System.out.println("服务端建立监听");
Socket socket = serverSocket.accept();
//通过流向客户端发送数据
// ObjectOutputStream oos = new
ObjectOutputStream(socket.getOutputStream());
// oos.writeObject("aaaaa");
// oos.close();
BufferedWriter bw = new BufferedWriter(new
OutputStreamWriter(socket.getOutputStream()));
bw.write("hhhh");
bw.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}