通信协议
网络通信协议:实现通信有些约定:对速率传输代码,代码结构,传输控制步骤,出错控制等指定标准
通信协议分层的思想:层次方式:同层可以通信,上一层可以调用下一层,而与在下一层不发生关系,
各层互不影响,利于系统的开发和扩展。
传输层协议中有两个重要的协议:1. 传输控制协议: TCP
2. 用户数据报协议:UDP
-
TCP协议:
2. 传输前,采用三次握手方式,点对点通信,是可靠的
3. TCP协议进行通信的两个应用进程:客户端,服务器
4. 在连接中可进行大数据量的传输
5. 传输完毕,释放已建立的链接(四次挥手),效率低
-
UDP协议:1. 将数据,源,目的封装成数据包,不需要建立链接
2. 每个数据报的大小限制在64k内
3. 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
4. 可以广播发送
5. 发送数据结束时不需释放资源,开销小,速度快
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class TCPTest1
{
/*
实现TCP的网络编程
客户端发送信息给服务端端,服务端将数据显示在控制台上
*/
public void client()//客户端
{
Socket socket= null;//快捷键ctrl+p 很多带参数的构造器
OutputStream outputStream = null;//调用io流传输据
try {//快捷键ctrl+alt+t
//创建socket对象,指明服务器端的ip和端口号
InetAddress inetAddress=InetAddress.getByName("127.0.0.1");//指明对方的ip
socket = new Socket(inetAddress,8899);
//获取一个输入流,用于输入数据
outputStream = socket.getOutputStream();
outputStream.write("你好".getBytes());//写出数据,已发出去
} catch (IOException e)
{
throw new RuntimeException(e);
}finally {
//资源关闭
if (outputStream!=null)
{
try {
outputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
if (outputStream!=null)
{
try {
socket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
public static void main(String[] args)
{
TCPTest1 tcptest1=new TCPTest1();
tcptest1.client();
}
}
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server1
{
public void server() //服务端
{
ServerSocket serverSocket= null;//对于服务器来说,指明自己的端口就行
Socket accepts = null;//接收客户端的socket
InputStream inputStream = null;//获取流,读入
ByteArrayOutputStream baos= null;
try {
//创建服务器端的ServerSocket,指明自己的端口号
serverSocket = new ServerSocket(8899);
//调用accept()表示接收客户端的socket
accepts = serverSocket.accept();
//获取输入流
inputStream = accepts.getInputStream();
//汉字可能会出现乱码,不建议 util-8占3个字节 一个一个转换字符,可能会出现乱码
// byte [] buffer=new byte[1024];
// int len;
// while ((len=inputStream.read(buffer))!=-1)
// {
// //发过来的是文本,用String
// String string=new String(buffer,0,len);
// System.out.print(string);
//
// }
//读取输入流中的数据
baos = new ByteArrayOutputStream();
byte [] buffer=new byte[5];//这样写多短都可以
int len;
while ((len=inputStream.read(buffer))!=-1)
{
baos.write(buffer,0,len);
}
System.out.println(baos.toString());//所有的字节都转换成字符串0
System.out.println("收到了来自于"+serverSocket.getInetAddress().getHostAddress()+"数据");
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
//关闭资源
if (baos!=null)
{
try {
baos.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
if (inputStream!=null)
{
try {
inputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
if (accepts!=null)
{
try {
accepts.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
if (serverSocket!=null)
{
try {