目录
?1、IP和端口号
????????1.1、IP?
?????????1.2、端口号
?2、网络通信协议
? ? ? ? 2.1、TCP和UDP
? ? ? ? ? ? ? ? 2.1.1、TCP网络编程
? ? ? ? ????????2.1.2、UDP网络编程?
? ? ? ? ?2.2、三次握手、四次挥手
? ? ? ? ? ? ? ? ? ? ? ? 2.2.1、三次握手
? ? ? ? ? ? ? ? ? ? ? ? 2.2.2、4次挥手
?1、IP和端口号
????????1.1、IP?
InetAdress类
实例化:
public static InetAddress getLocalHost() public static InetAddress getByName(String host)
常用方法:
public String getHostAddress() :返回 IP 地址字符串(以文本表现形式)。 public String getHostName() :获取此 IP 地址的主机名 public boolean isReachable(int timeout): :测试是否可以达到该地址
????????1.2、端口号
????????????????不同的进程有不同的端口号,端口与 号与IP 地址的组合得出一个网络套:接字:Socket? ??
????????????????公认端口:0~1023。被预先定义的服务通信占用(如:HTTP占用端口 80,FTP占用端口21,Telnet占用端口23) ????????????????注册端口:1024~49151。分配给用户进程或应用程序。(如:Tomcat占 用端口8080,MySQL占用端口3306,Oracle占用端口1521等)。 ????????????????动态/ 私有端口:49152~65535。
?2、网络通信协议
? ? ? ? 2.1、TCP和UDP
????????????????a、tcp面向连接,udp发送数据不需要建立连接
????????????????b、tcp提供可靠的服务,udp无法保证
????????????????c、tcp面向字节流,udp面向报文
????????????????d、tcp数据传输慢,udp数据传输快。
? ? ? ? ? ? ? ? 2.1.1、TCP网络编程
public class TCPTest {
// 服务端
@Test
public void server() {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream inputStream = null;
ByteArrayOutputStream byteArrayOutputStream = null;
try {
// 1、创建服务器端的ServerSocket,指明自己的端口。启动程序就指定自己的服务器地址,所以不用指明
serverSocket = new ServerSocket(8888);
// 2、接受来自客户端的socket
socket = serverSocket.accept();
// 3、获取输入流
inputStream = socket.getInputStream();
// 4、读取流中的数据
byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[10];
int len;
while ((len = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, len);
}
System.out.println("收到" + socket.getInetAddress().getHostAddress()+"数据"+byteArrayOutputStream.toString());
// inputStream这种写法如果有中文会有乱码情况
/*byte[] buffer = new byte[10];
int len;
while ((len = inputStream.read(buffer)) != -1) {
String str = new String(buffer,0,len);
System.out.println(str);
}*/
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4、资源关闭
if (null != byteArrayOutputStream) {
try {
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != inputStream) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != socket) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != serverSocket) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 客户端
@Test
public void client() {
Socket socket = null;
OutputStream outputStream = null;
try {
// 1、创建Socket对象,指明服务器端的ip和端口号
InetAddress inetAddress = InetAddress.getByName("192.168.1.101");
socket = new Socket(inetAddress, 8888);
// 2、获取一个输出流,用于输出数据
outputStream = socket.getOutputStream();
// 3、写出数据
outputStream.write("收到请回答".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4、资源关闭
if (null != outputStream) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != socket) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
? ? ? ? ????????2.1.2、UDP网络编程?
public class UDPTest {
// 服务端
@Test
public void server() {
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket(9000);
byte[] buff = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buff, 0, buff.length);
datagramSocket.receive(datagramPacket);
String str = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
System.out.println(str + "--->" + datagramPacket.getAddress());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != datagramSocket) {
datagramSocket.close();
}
}
}
// 客户端
@Test
public void client() {
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket();
String str = "UPD客户端";
byte[] data = str.getBytes();
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
DatagramPacket datagramPacket = new DatagramPacket(data, 0, data.length, inetAddress, 9000);
datagramSocket.send(datagramPacket);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != datagramSocket) {
datagramSocket.close();
}
}
}
}
? ? ? ? ?2.2、三次握手、四次挥手
? ? ? ? ? ? ? ? ? ? ? ? 2.2.1、三次握手
第一次握手:确认客户端的发送没有问题(客户端发送syn(序号)包)
第二次握手:确认服务器端的接受和发送没有问题(服务器收到syn,发送syn+ack(确认)包)
第三次握手:确认客户端的接受没有问题(为了防止已经失效的连接请求报文段突然传到服务器,因而产生错误)客户端收到syn+ack包,向服务器发送ack确认包。
? ? ? ? ? ? ? ? ? ? ? ? 2.2.2、4次挥手
客户端和服务器端都可以发送中断请求,以服务器端发送中断请求为例: 第一次服务器端挥手:服务器端发送finish包表示不会再向客户端发送数据了
第二次客户端挥手:对第一次挥手的响应,表示客户端收到了。如果还是数据需要发送就会赶紧发送过去
第三次客户端挥手:客户端确定不会给服务器端发送数据后才会进行第三次挥手
第四次服务器端挥手:服务器端接受到客户端的挥手后会进行第四次挥手,最后通信中断。
?
|