网络编程
一个简单的javaTCP客户端和服务端的交流:
TCP服务端:
/**
* @Auther EagleB
* @Date 2019/7/12 0012
* @Description
*/
public class TCPServer {
public static void main(String[] args) throws Exception {
//创建一个服务器对象指定的端口
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务器已经开启。。。。");
//等待客户端连接,并获得与客户端的连接
Socket socket = serverSocket.accept();
System.out.println("等待客户端的连接。。。。");
//获得字节输入流
InputStream inputStream = socket.getInputStream();
//读取客户端的数据到数组中,****切记是普通的类型****
byte[] b = new byte[1024];
int len = inputStream.read(b);
System.out.println("len=="+len);
System.out.println(new java.lang.String(b,0,len));
OutputStream outputStream = socket.getOutputStream();
java.lang.String contens = "你好,TCP客户端";
outputStream.write(contens.getBytes());
serverSocket.close();
socket.close();
}
}
总结:TCP协议的特点:
1.面向连接
2.通过三次握手获得建立连接,形成可以传输管道。疑问:三次握手的具体,为什么要三次握手。
3.基于io流传输,serverSocket获得流进行传输
4.传输没有数据大小
5.通过四次挥手断开连接。疑问:四次挥手的具体,为什么要四次挥手?
6.速度相对于UDP来说比较慢。
相关的两个核心类
* Socket:⼀一个该类的对象就代表⼀一个客户端程序
* ServerSocket:⼀一个该类的对象就代表⼀一个服务器器端程序
TCP客户端:
package com.itcast.EagleB;
import sun.security.util.Length;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* @Auther EagleB
* @Date 2019/7/12 0012
* @Description
*/
public class CliDemo {
public static void main(String[] args) throws IOException {
//创建一个socket对象,并指向服务端的ip和监听的端口
Socket socket = new Socket("127.0.0.1",9999);
//发送给服务端的内容
String Contect = "你好TCP服务器端";
//获得输出流
OutputStream outputStream = socket.getOutputStream();
//输出数据到服务器
outputStream.write(Contect.getBytes());
//获取服务器返回的数据
//获得字节输入流
InputStream inputStream = socket.getInputStream();
//创建字节数组对象,****切记是普通的字节数据对象****
byte[] b = new byte[1024];
int len = inputStream.read(b);
//读取数据到数组中
System.out.println("len=="+len);
System.out.println(new String(b,0,len));
//关闭Socket
socket.close();
}
}
总结:TCP协议客户端:
TCP客户端程序实现步骤
1.创建Socket对象:指定服务器器的IP地址和端⼝口号
2.准备要发送的数据
3.通过Socket对象的getOutputStream⽅方法获得字节输出流对象
4.通过字节输出流对象调⽤用write⽅方法输出数据到服务器器端
5.通过Socket对象的getInputStream⽅方法获得字节输⼊入流对象
6.通过字节输⼊入流对象的read⽅方法读取服务器器端返回的数据
7.关闭Socket断开连接
UDP服务端:
package com.itcast.EagleB;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* @Auther EagleB
* @Date 2019/7/12 0012
* @Description
*/
public class UDPServer {
public static void main(String[] args) throws IOException {
//创建字节输入数组
byte[] bytes = new byte[1024];
System.out.println("UDP接收端。。。。");
//创建数据接收对象
DatagramPacket packet = new DatagramPacket(bytes,bytes.length);
//创建数据接收对象
DatagramSocket socket = new DatagramSocket(9999);
socket.receive(packet);
//获得发送端的id,端口地址
String hostAddress = packet.getAddress().getHostAddress();
System.out.println(hostAddress);
int port = packet.getPort();
System.out.println("端口:"+port);
socket.close();
}
}
UDP客户端:
package com.itcast.EagleB;
import java.io.IOException;
import java.net.*;
/**
* @Auther EagleB
* @Date 2019/7/12 0012
* @Description
*/
public class UDPCli {
public static void main(String[] args) throws IOException {
byte[] bytes = "你好UDP服务端".getBytes();
//创建数据包对象:封装发送对象
DatagramPacket packet = new DatagramPacket(bytes,bytes.length,InetAddress.getLocalHost(),9999);
DatagramSocket socket = new DatagramSocket();
socket.send(packet);
System.out.println("发送成功");
socket.close();
}
}
.getLocalHost(),9999);
DatagramSocket socket = new DatagramSocket();
socket.send(packet);
System.out.println("发送成功");
socket.close();
}
}