前言
所有的通信都是基于IP和端口的
在java中使用UDP和TCP协议编写通信程序
1.客户端:首先发起连接的叫做客户端,相当于电话中的主叫
2.服务端:等待被连接的叫做服务端,相当于电话中的被叫
3.当连接建立好之后,客户端和服务端是平等的
4.Java中有两个类是专门用来实现TCP的网络编程
ServerSocket 服务端套接字
Socket 客户端套接字
5.Java中有三个类是专门用来实现UDP的网络编程
InetSocketAddress 网络地址(发送方地址,接收方地址)
DatagramSocket UDP套接字(快递员)
DatagramPacket UDP数据报(包裹)
6.在网络编程中,数据的交互也是通过IO来完成的
InputStream 输入流
OutputStream 输出流
7.所有的输入和输出是相对于内存而言的
8.Socket就是两台设备之间的通信管道,所有的数据流都是基于Socket的
TCP
传输控制协议,面向连接的,可靠的,消耗较多的网络资源。
面向连接:在通信之前,设备之间一定要建立一个逻辑上的连接,所有的数据传输必须基于这个连接
可靠性:在数据传输的过程中,会不断的检测数据的正确性;三次握手:重传机制,顺序检测机制,超时处理机制;四次挥手
类似于打电话
客户端
首先发起连接的叫做客户端
1.编写客户端,创建一个客户端套接字对象
如果能创建成功,说明已经连接上
Socket socket = new Socket(服务器IP,服务器端口);
2.在客户端通过Socket来获得数据输出流,用来向服务端发送数据
//创建控制台输入的对象
Scanner sc = new Scanner(System.in);
while(true) {
//获得控制台输入的字符串
String str = sc.nextLine();
//补上结束符
String msg = str+'\n';
//将字符串转成字节数组
byte bs[] = msg.getBytes();
//将字节数组通过输出流写出去
ops.write(bs);
//刷新数据,保证数据一定到达对方
ops.flush();
服务端
等待被连接的叫做服务端
1.编写服务端,创建服务端套接字对象
ServerSocket server = new ServerSocket(10086);
2.服务端等待并接受客户端的连接
Socket socket = server.accept();
3.在服务端通过Socket来获得输入流,用来接收客户端发来的数据
while(true) {
//定义一个字节数据,用来存放接受到的数据
byte bs[] = new byte[100];
//开始一个字节一个字节的接受数据,直到接受到\n
int t='\n';
int index=0;
do{
t = ips.read();
//每读取到一个字节,就将该字节放到数组中
bs[index++] = (byte)t;
}while(t!='\n');
//将字节数组中存放了数据的部分转换成字符串
String str = new String(bs,0,index);
System.out.print("服务端收到:"+str);
}
UDP
用户数据报协议,无连接的,不可靠的,相对TCP来说,消耗的资源较少
无连接的:在发送数据的时候不需要检测是否能找到对方
不可靠的:发送数据之后,对方是否能收到数据是未知的,不会进行数据检测
类似于发短信
客户端
//服务端的ip和端口(收件人)
InetSocketAddress server=new InetSocketAddress("127.0.0.1", 10086);
//客户端的地址(寄件人)
InetSocketAddress client=new InetSocketAddress(10001);
//UDP套接字对象(快递员),绑定发送方地址
DatagramSocket socket=new DatagramSocket(client);
//要发送的数据先转换成字节数组再传
String msg="Hello World";
byte buf[]=msg.getBytes();
//UDP数据包对象(包裹) ,包裹中要包含要发送的数据和接收方地址
DatagramPacket packet=new DatagramPacket(buf, 0,buf.length,server);
//发送数据(快递员发送包裹)
socket.send(packet);
System.out.println("客户端发送完毕!!!");
服务端
//接收方的地址(收件人)
InetSocketAddress server=new InetSocketAddress(10086);
//UDP套接字(快递员)
DatagramSocket socket=new DatagramSocket(server);
//创建一个空的数据报对象,用来缓存接收到的数据
byte buf[]=new byte[1024];
DatagramPacket packet=new DatagramPacket(buf, 0,buf.length);
//开始接收数据,将接受的数据要缓存到一个UDP数据报中
socket.receive(packet);
//从接收完数据之后,从packet中提取数据
byte bs[]=packet.getData();
int start=packet.getOffset();
int len=packet.getLength();
//根据以上三个数据来封装一个字符串
String str=new String(bs,start,len);
System.out.println("服务器收到: "+str);